Python三元表達-內建函式
阿新 • • 發佈:2022-03-22
三元表示
'''使用場景:二選一的時候 推薦使用三元表示式''' # 編寫一個求兩個數大小的函式 def index(a, b): if a > b: return a else: # 可以省略 return b # 如果使用者名稱是jason則列印管理員 否則列印DDD username = input('username>>>:').strip() if username == 'jason': print('管理員') else: print('DDD') ''' 三元表示式 值1 if 條件 else 值2 條件如果成立則使用1(if前面的資料) 條件如果不成立則使用值2(else後面的資料) ''' username = input('username>>>:').strip() res = '管理員' if username == 'jason' else 'DSB' print(res) '''三元表示式只用於二選一的情況 最好不要巢狀使用(語法不簡潔)''' res = '下午' if 1 == 1 else (2 if 2==3 else '上午') # 不推薦 """並不是程式碼寫的最少乾的事越多就與牛逼 還有一個前提>>>:簡潔易讀""" 寫一個電影系統 需要決定電影是否收費 is_change = input('是否收費>>>:').strip() is_free = '收費' if is_change == 'y' else '免費' print(is_free) # 補充:針對if分支結構 也有簡化版本(瞭解即可) '''子程式碼塊都只有簡單的一行情況下 也可以簡寫 沒有三元表示式簡單 但是也有人用''' name = 'jason' if name == 'jason': print(name) else: print('嘿嘿嘿')
各種生成式
1.列表生成式
name_list = ['jason', 'kevin', 'tony', 'oscar', 'jerry'] '''需求:將列表中所有的人名後面加上_DSB''' # 以我們之前掌握的知識能否實現>>>:可以 # 1.建立一個空的列表用於儲存修改之後的資料 new_list = [] # 2.for迴圈列表獲取每一個人名 for name in name_list: # 'jason' 'kevin' 字串 # # 3.字串末位拼接_DSB res = name + '_DSB' # # 4.新增到新的列表中 new_list.append(res) print(new_list) # 列表生成式:該技術可以簡化程式碼 也可以不用 無外乎寫的複雜一點而已 res = [name+'_SB' for name in name_list] print(res) # 列表生成式複雜用法:還具備篩選能力 res = [name+'_SB' for name in name_list if name == 'jason'] print(res) res = [name+'_SB' for name in name_list if name != 'jason'] print(res) '''列表生成式中值允許出現for和if 不能出現else 因為會產生歧義(for和if都能結合else)'''
2.字典生成式
l1 = ['name', 'age', 'pwd'] l2 = ['jason', 18, 123] # 需求:將上述兩個列表分別製作成字典的鍵值 # 1.定義一個空字典 new_dict = {} # 2.每次迴圈都要拿到兩個列表中對應的元素(索引相等) for i in range(len(l1)): # 3.索引取值即可 new_dict[l1[i]] = l2[i] print(new_dict) # 字典生成式 res = {l1[i]: l2[i] for i in range(len(l1))} print(res) # {'name': 'jason', 'age': 18, 'pwd': 123} res = {l1[i]: l2[i] for i in range(len(l1)) if i == 1} print(res) # {'age': 18}
3.集合生成式
res = {i for i in range(10)}
print(res, type(res))
res = {i for i in range(10) if i != 2}
print(res, type(res))
"""沒有元組生成式 依據上述寫法得到的時候後續我們要學習的知識:迭代器"""
匿名函式
匿名函式的意思就是沒有函式名
沒有函式名的函式如何呼叫呢?
需要結合其他函式一起使用
# 定義匿名函式
lambda x:x+2
'''
lambda 形參:返回值
α β γ
如果用普通函式來表示
def index(x):
return x + 2
'''
print(lambda x:x+2)
max:統計最大值
l1 = [11, 32, 41, 22, 13, 66, 54, 78, 96, 34, 54, 99, 35]
print(max(l1)) # 直接獲取資料集中最大的元素值
info = {
'Aason':9999999,
'Jacob':123,
'zark':1000,
'berk':33
}
比如說你要求薪資最高的人姓名
print(max(info)) # zark
'''
max底層可以看成是for迴圈依次比較 針對字典預設只能獲取到K
獲取到K之後如果是字串的英文字母 則會按照ASCII碼錶轉成數字比較
A~Z:65-90
a~z:97-122
'''
def index(k):
return info[k]
print(max(info,key=index)) # key對應的函式返回什麼 max就以什麼做比較的依據
# 比較的是v 返回的是k key相當於是可以更改比較規則的引數
# 上述程式碼可以簡寫 因為函式功能很單一
print(max(info, key=lambda key:info[key])) # Aason
常見重要內建函式
1.內建函式之 map對映
l1 = [11, 22, 33, 44, 55]
# 需求:元素全部自增10
# 方式1:列表生成式
# 方式2:內建函式
def index(n):
return n + 10
res = map(index,l1)
print(res) # 迭代器(節省空間的 目前不用考慮)
print(list(res)) # [21, 32, 43, 54, 65]
res = map(lambda x: x + 10, l1)
print(list(res)) # [21, 32, 43, 54, 65]
2.內建函式之zip拉鍊
l1 = [11, 22, 33, 44]
l2 = ['jason','kevin','tony','oscar']
# 需求:將兩個列表中的元素一一對應成對即可
res = zip(l1,l2) # 結果是一個迭代器
print(res) # 目前想看裡面的資料 用list轉換一下即可
print(list(res)) [(11, 'jason'), (22, 'kevin'), (33, 'tony'), (44, 'oscar')]
'''zip可以整合多個數據集'''
l1 = [11, 22, 33, 44]
l2 = ['jason','kevin','tony','oscar']
l3 = [1,2,3,4]
l4 = [55,66,77,88]
res = zip(l1,l2,l3,l4)
print(list(res))
# 不使用zip也可以
res1 = [(l1[i],l2[i],l3[i],l4[i]) for i in range(len(l1))]
print(res1)
'''zip可以整合多個數據集 如果資料集之間個數不一致 那麼依據短的'''
l1 = [11, 22, 33, 44, 55]
l2 = ['jason', 'kevin']
res = zip(l1,l2)
print(list(res))
內建函式之filter過濾
l1 = [11, 22, 33, 44, 55, 66]
'''需求:篩選出大於30的元素'''
# 方式1:列表生成式
# 方式2:內建函式
def index(x):
return x > 30
res = filter(index,l1)
print(list(res)) # [33, 44, 55, 66]
res = filter(lambda x:x>30, l1)
print(list(res))
4.內建函式之reduce歸總
'''以前是內建函式 現在是某個模組下面的子函式(後面講)'''
from functools import reduce
l1 = [11, 22, 33]
'''需求:講列表中所有的元素相加'''
def index(x,y):
return x + y
res = reduce(index,l1)
print(res) # 66
res = reduce(lambda x, y: x + y, l1)
print(res) # 66
res = reduce(lambda x, y: x + y, l1, 100)
print(res) # 166
"""掌握到能夠語言表達出大致意思"""
常見內建函式
1.abs() 獲取絕對值(不考慮正負號)
print(abs(-123))
print(abs(123))
# 2.all()與any()
l1 = [0, 0, 1, 0, True]
print(all(l1)) # False 資料集中必須所有的元素對應的布林值為True返回的結果才是True
print(any(l1)) # True 資料集中只要所有的元素對應的布林值有一個為True 返回的結果就是True
# 3.bin() oct() hex() 產生對應的進位制數
print(bin(100))
print(oct(100))
print(hex(100))
# 4.bytes() 型別轉換
s = '你好啊 hello world'
打印出來的則是編碼
'''針對編碼解碼 可以使用關鍵字encode與decode 也可以使用bytes和str'''
s1 = '天黑了 抓緊進屋吧!!!'
編碼
res = bytes(s1, 'utf8')
print(res)
解碼
res1 = str(res, 'utf8')
print(res1)
# 5.callable() 判斷當前物件是否可以加括號呼叫
name = 'jason'
def index():pass
print(callable(name)) # False 變數名不能加括號呼叫
print(callable(index)) # True 函式名可以加括號呼叫
# 6.chr(), ord() 字元與數字的對應轉換
print(chr(65)) # A 根據數字轉字元 依據ASCII碼
print(ord('A')) # 65 根據字元轉數字 依據ASCII碼
# 7.dir() 返回資料型別可以呼叫的內建方法(檢視物件內部可呼叫的屬性)
print(dir(123))
print(dir('jason'))
# 8.divmod()
'''
可以使用在網站的分頁製作上
練習題: 問
總共250條資料 每頁展示25條 需要多少頁 10頁
總共251條資料 每頁展示25條 需要多少頁 11頁
總共249條資料 每頁展示25條 需要多少頁 10頁
'''
print(divmod(250,25)) # (10, 0) 第一個引數是整數部分 第二個是餘數部分
print(divmod(251,25)) # (10, 1)
print(divmod(249,25)) # (9, 24)
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(1000,30)
# 9.enumerate() 列舉
name_list = ['jason', 'kevin', 'oscar', 'tony']
for name in name_list:
print(name)
for i,j in enumerate(name_list):
print(i,j) # i類似於是計數 預設從0開始
for i,j in enumerate(name_list,start=1):
print(i,j) # 還可以控制起始位置
# 10.eval() exec() 識別字符串中的python程式碼 使用頻率很低
print('print("有點餓了")')
eval('print("有點餓了111")')
exec('print("有點餓了222")')
res =
"""
for i in range(10):
print(i)
"""
# eval(res) 只能識別簡單邏輯的python程式碼
# exec(res) 能夠識別具有與一定邏輯的python程式碼