1. 程式人生 > 其它 >三元表示式、生成式、常見內建函式

三元表示式、生成式、常見內建函式

今日內容總結

一、三元表示式(簡化程式碼)

二、各種生成式(簡化程式碼)

三、匿名函式(簡化程式碼)

四、常見重要內建函式

五、常見內建函式補充

一、三元表示式

使用場景:在二選一時,推薦使用三元表示式
""" 三元表示式:
        資料1 if 條件 else 資料2
    在條件成立時則使用資料1(if前面的資料)
    在條件不成立時則使用資料2(else後面的資料) """
# 當獲取數字為1時,為熊大,否則為熊二
num = input('number>>>:').strip()
res = '熊大' if num == '1' else '熊二'
print(res)

針對if分支結構,也有簡化版本
"""子程式碼塊都只有簡單的一行情況下,也可以簡寫,但沒有三元表示式簡單"""
name = '熊大'
if name == '熊大': print(name)
else: print('熊二')
# 其實就是在縮排下一行時,選擇直接在冒號後面新增輸出內容

二、各種生成式

1 、列表生成式

# 使用for迴圈
# 定義一個原列表
name_list = ['熊大', '熊二', '吉吉國王', '光頭強', '翠花']
# 在每個名字後面加_YYDS
new_list = []
# 使用for迴圈獲取人名、
for name in name_list:
    res = name + '_YYDS'
    new_list.append(res)
print(new_list)
# ['熊大_YYDS', '熊二_YYDS', '吉吉國王_YYDS', '光頭強_YYDS', '翠花_YYDS']

# 使用列表生成式
name_list = ['熊大', '熊二', '吉吉國王', '光頭強', '翠花']
res = [name+'_YYDS'for name in name_list]
print(res)
# ['熊大_YYDS', '熊二_YYDS', '吉吉國王_YYDS', '光頭強_YYDS', '翠花_YYDS']
# 只需要兩行就可以完成

# 列表生成式還具備篩選能力
name_list = ['熊大', '熊二', '吉吉國王', '光頭強', '翠花']
res = [name+'_YYDS'for name in name_list if name !='吉吉國王']
print(res,type(res))
# ['熊大_YYDS', '熊二_YYDS', '光頭強_YYDS', '翠花_YYDS'] <class 'list'>

""" 列表生成式中可以使用for和if,不能使用else """

2 、字典生成式

l1 = ['name', 'age','pwd']
l2 = ['蠟筆小新', 5, 10]
# 將兩個列表的組成一個字典
使用for迴圈
new_dict = {}
for i in range(len(l1)):
    new_dict[l1[i]] = l2[i]  # 字典增加鍵值對
print(new_dict)
# {'name': '蠟筆小新', 'age': 5, 'pwd': 10}
 
使用字典生成式
l1 = ['name', 'age','pwd']
l2 = ['蠟筆小新', 5, 10]
res = {l1[i]:l2[i] for i in range(len(l1))}  
print(res,type(res))
# {'name': '蠟筆小新', 'age': 5, 'pwd': 10} <class 'dict'>

3 、集合生成式

res = {i for i in range(6)}
print(res, type(res))
# {0, 1, 2, 3, 4, 5} <class 'set'>

三、匿名函式

匿名函式指沒有函式名,需要和其他函式一起使用
匿名函式固定語法:
   lambda 形參:返回值
      lambda x:x+2
如果使用普通函式表示:
def index(x):
    return x + 2
eg:
   def func(x,y):
       return x*y
    print(func(3, 4))  # 12
使用匿名函式
 func = lambda x,y:x*y
 print(func(3, 4))  # 12

1 、max : 統計最大值

# 求最大值
l1 = [12, 13, 15, 20, 25, 38, 46, 50, 74]
print(max(l1))  # 74

求最大工資人的名字
info = {
    'Aason':99999,
    'Jacob':123,
    'zark':16,
    'berk':55
}
 print(max(info))  # zark
# 結果不是出來的是數字,而是人名,而且還不是第一個人的名字
 獲取v值:
  def index(k):
        return info[k]
  print(max(info,key=index))  # Aason # 通過key對應函式返回值,max進行比較

若使用匿名函式:
print(max(info, key=lambda key:info[key]))  # Aason

"""
max底層可以看成ffor迴圈比較,針對字典預設只能獲取到key,當獲取到的是字串的英文字母的時候,會根據ASCII碼錶對應的數字進行比較
   A ~ Z : 65 ~ 90
   a ~ z : 97 ~ 122
"""

四、常見函式內建函式

1 、map對映

map對映就是根據提供的函式對指定的序列做對映
l1 = [12, 24, 28, 34, 65]
需求:元素全部自增6
方法1:利用列表生成式
def index(n):
    return n + 6
res = map(index,l1)
print(list(res))  # [18, 30, 34, 40, 71]
方法2:內建函式
res = map(lambda x: x + 6, l1)
print(list(res))  # [18, 30, 34, 40, 71]

2 、zip拉鍊

從多個數據集中取出元素組合成一個新的資料集,返回一個列表
a = [1, 2, 3]
b = [4, 5, 6]
res = zip(a, b)
print(list(res))  # 因為直接列印res出來是迭代器,所以把它裝化成列表打印出來
# [(1, 4), (2, 5), (3, 6)]

zip(*) 與 zip 相反,可理解為解壓,返回原始的資料集
a1, a2 = zip(*zip(a,b))
print(list(a1))  # [1, 2, 3]
print(list(a2))  # [4, 5, 6]


'''zip可以整合多個數據集'''
a = [1, 2, 3]
b = [4, 5, 6]
c = ['熊大', '熊二', '翠花']
d = [123, 456, 789]
res = zip(a, b, c, d)
print(list(res))
# [(1, 4, '熊大', 123), (2, 5, '熊二', 456), (3, 6, '翠花', 789)]

不使用zip拉鍊
a = [1, 2, 3]
b = [4, 5, 6]
c = ['熊大', '熊二', '翠花']
d = [123, 456, 789]
res = [(a[i], b[i], c[i], d[i]) for i in range(len(a))]
print(res)

'''zip在整合多個數據集時,當資料集之間個數不一致,那麼依據短的'''
b = [4, 5]
c = ['熊大', '熊二', '翠花']
res = zip(b, c)
print(list(res))  #[(4, '熊大'), (5, '熊二')]

3 、filter過濾

filter過濾函式接收兩個引數,第一個為判斷函式,第二個為判斷物件,第二個的每個元素作為引數傳遞給判斷函式,然後返回 True 或 False,最後將返回 True 的元素放到新列表中
l1 = [4, 5, 6, 7, 12, 14]
# 取出大於10的數字
方法1:利用列表生成式
def index(x):
    return x > 10
res = filter(index,l1)
print(list(res))  # [12, 14]
方法2:內建函式
res = filter(lambda x:x>10, l1)
print(list(res))  # [12, 14]

4 、reduce歸總

from functools import reduce  # 固定
作用就是對序列中的元素進行累積

from functools import reduce
l1 = [1, 2, 3, 4, 5]
res = reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
print(res)
計算的流程就是((((1+2)+3)+4)+5)  # 15

五、常見內建函式補充

1、獲取絕對值(不考慮絕對值)
print(abs(-123))  # 123
print(abs(123))  # 123

2.all()與any()  # 一個是全部,一個是任一
l1 = [2, 0, 1, 1, True]
print(all(l1))  # False  資料集中必須所有的元素對應的布林值為True返回的結果才是True
print(any(l1))  # True   資料集中只要所有的元素對應的布林值有一個為True 返回的結果就是True

3.bin() oct() hex()  產生對應的進位制數
print(bin(100))  # 0b1100100  二進位制
print(oct(100))  # 0o144  八進位制
print(hex(100))  # 0x64  十六進位制

4.bytes()  型別轉換
s = '鋤禾日當午'
print(s.encode('utf8'))  # b'\xe9\x94\x84\xe7\xa6\xbe\xe6\x97\xa5\xe5\xbd\x93\xe5\x8d\x88'
print(bytes(s, 'utf8'))  # b'\xe9\x94\x84\xe7\xa6\xbe\xe6\x97\xa5\xe5\xbd\x93\xe5\x8d\x88'
'''針對編碼解碼 可以使用關鍵字encode與decode  也可以使用bytes和str  ,bytes為編碼、str為解碼'''

5.callable()  判斷當前物件是否可以加括號呼叫
name = 'owen'
def index():pass
print(callable(name))  # False  變數名不能加括號呼叫
print(callable(index))  # True  函式名可以加括號呼叫

6.chr()、ord()  字元與數字的對應轉換
print(chr(71))  # G 根據數字轉字元  使用ASCII碼
print(ord('d'))  # 100 根據字元轉數字  使用ASCII碼

7.dir() 
返回資料型別可以呼叫的內建方法(檢視物件內部可呼叫的屬性)
print(dir(52))
print(dir('owen'))  
# 結果太長,不列印了,可以自己使用上面程式碼試試

# 8.divmod()
"""
可以使用在網站的分頁製作上
      總共250條資料 每頁展示25條 需要多少頁   10頁
       總共300條資料 每頁展示25條 需要多少頁   12頁
        總共234條資料 每頁展示25條 需要多少頁   9頁
"""
print(divmod(250,25))  # (10, 0)  第一個引數是整數部分 第二個是餘數部分
print(divmod(300,25))  # (12, 0)
print(divmod(234,25))  # (9, 9)

def get_page_num(total_num,page_num):  #django分頁器使用
    more,others = divmod(total_num, page_num)
    if others:
       more += 1
       print('需要%s頁'%more)
get_page_num(1688,30)  # 需要57頁


9.enumerate()  列舉
name_list = ['owen', 'kevin', 'wuxidixi', 'mary']
for i,j in enumerate(name_list):
    print(i,j)  # i類似於是計數 預設從0開始
0 owen
1 kevin
2 wuxidixi
3 mary

for i,j in enumerate(name_list,start=1):
    print(i,j)  # 還可以控制起始位置
1 owen
2 kevin
3 wuxidixi
4 mary
    
10.eval() exec()  識別字符串中的python程式碼,不常用
print('print("不錯不錯")')  # 不錯不錯
eval('print("不錯不錯123")')  # 不錯不錯123
exec('print("不錯不錯234")')  # 不錯不錯234
res = """
for i in range(10):
    print(i)
"""
eval(res)  # 報錯  只能識別簡單邏輯的python程式碼
exec(res)  # 0~9  能夠識別具有與一定邏輯的python程式碼
exec可以執行動態Python程式碼
eval函式可以計算Python表示式,並返回結果(exec不返回結果)

完畢~