三元表示式、生成式、常見內建函式
阿新 • • 發佈:2022-03-23
今日內容總結
一、三元表示式(簡化程式碼)
二、各種生成式(簡化程式碼)
三、匿名函式(簡化程式碼)
四、常見重要內建函式
五、常見內建函式補充
一、三元表示式
使用場景:在二選一時,推薦使用三元表示式 """ 三元表示式: 資料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不返回結果)