python表示式生成式和常見內建函式
阿新 • • 發佈:2022-03-22
python表示式生成式和常見內建函式
三元表示式
#使用場景:二選一的時候 推薦使用三元表示式 #尋常程式碼: def index(a,b): if a>b: return a # 如果a>b則輸出a else: return b # 如果a<b則輸出b '不夠簡潔比較繁瑣' 三元表示式 值1 if 條件 else 值2 條件如果成立則使用值1(if前面的資料) 條件如果不成立則使用值2(else後面的資料) #程式碼示例: def index(a,b): res = a if a > b else b print(res) index(9,7) # 9 '''三元表示式只用於二選一的情況 最好不要巢狀使用(語法不簡潔)''' # 寫一個電影系統 需要決定電影是否收費 is_change = input('是否收費>>>:').strip() is_free = '收費' if is_change == 'y' else '免費' print(is_free) # 針對if分支結構 也有簡化版本 (瞭解即可) '''子程式碼塊都只有簡單的一行情況下 也可以簡寫 沒有三元表示式簡單 但是也有人用''' name = 'jason' if name == 'jason': print(name) else: print('111')
各種生成式
列表生成式
#定義: python裡面[]表示一個列表,快速生成一個列表可以用range()函式來生成。 對列表裡面的資料進行運算和操作,生成新的列表最高效快速的辦法,那就是列表生成式了 #迴圈程式碼: '對列表數平方' b = range(1, 11) c = [] for i in b: c.append(i*i) print(c) # 結果:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] #列表生成式程式碼: '對列表數平方' b = range(1, 11) c = [x*x for x in b] print(c) # 結果:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 列表生成式語法是固定的,[]裡面for 前面是對列表裡面資料的運算操作,後面跟平常for循序一樣遍歷去讀取。執行後會自動生成新的列表 #列表生成式還具備篩選功能 #程式碼示例: name_list = ['jason', 'kevin', 'tony', 'oscar', 'jerry'] 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)''' #多個引數: a = [1, 2, 3, 4, 5] b = ["a", "b", "c", "d", "e"] # 多個引數列表生成式 c = [str(x)+str(y) for x, y in zip(b, a)] print(c) # 結果:['a1', 'b2', 'c3', 'd4', 'e5']
字典生成式
#定義:
通過生成式可以更加簡潔地生成字典
#程式碼示例:
l1 = ['a','b','c','d','e']
l2 = [1,2,3,4,5]
dict ={l1[i]:l2[i] for i in range(len(l1))}
print(dict)
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
集合生成式
#定義: 通過生成式可以更加簡潔地生成集合 #程式碼示例: 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表示匿名函式,冒號前面的n表示函式引數,可以有多個引數。
匿名函式有個限制,就是隻能有一個表示式,不用寫return,返回值就是該表示式的結果
#匿名函式優勢:
因為函式沒有名字,不必擔心函式名衝突
此匿名函式也是一個函式物件,也可以把匿名函式賦值給一個變數,再利用變數來呼叫該函式
有些函式在程式碼中只用一次,而且函式體比較簡單,使用匿名函式可以減少程式碼量,看起來比較"優雅"
#這段程式碼
def calc(x,y):
return x**y
#換成匿名函式
calc = lambda x,y:x**y
print(calc(2,5))
def calc(x,y):
if x > y:
return x*y
else:
return x / y
#三元運算換成匿名函式
calc = lambda x,y:x * y if x > y else x / y
print(calc(2,5)) # 0.4
print(calc(5,2)) # 10
示例二
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
常見重要內建函式
map函式
map()函式接收兩個引數,一個是函式,一個是Iterable,map將傳入的函式依次作用到序列的每個元素,並把結果作為新的Iterator返回
遍歷序列,對序列中每個元素進行函式操作,最終獲取新的序列
求列表[1,2,3,4,5,6,7,8,9],返回一個n*n 的列表
#程式碼示例:
li = [1,2,3,4,5,6,7,8,9]
res=map(lambda n:n*n,li)
print(list(res))
[1, 4, 9, 16, 25, 36, 49, 64, 81]
zip函式
#定義
將列表中的元素一一對應
#程式碼示例:
l1 = ['a','b','c','d','e']
l2 = [1,2,3,4,5]
print(list(zip(l1,l2)))
print(dict(zip(l1,l2)))
#輸出結果:
[('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
'''zip可以整合多個數據集 如果資料集之間個數不一致 那麼依據短的'''
filter函式
#定義:
filter()也接收一個函式和一個序列
filter()把傳入的函式依次作用於每個元素
True '保留'
False '丟棄'
在一個列表中,刪掉偶數,只保留奇數
#程式碼示例
li = [1, 2, 4, 5, 6, 9, 10, 15]
res = filter(lambda x: x % 2 == 1, li)
print(list(res)) # [1, 5, 9, 15]
reduce函式
#定義:
reduce把一個函式作用在一個序列[x1, x2, x3, ...]上
這個函式必須接收兩個引數
reduce把結果繼續和序列的下一個元素做累積計算
reduce(func,[1,2,3]) 等同於 func(func(1,2),3)
一個列表的求和求積
#程式碼示例
from functools import reduce
li = [1,2,3,4,5,6,7,8,9]
res = reduce(lambda x,y:x*y,li)
res1 = reduce(lambda x,y:x+y,li)
print(res) # 362880
print(res1) # 45
其他常見內建函式
abs()函式
#abs()函式返回數字的絕對值
print( abs(-45) ) # 返回 45
print("abs(0.2):",abs(0.2)) # 返回 abs(0.2): 0.2
all()函式any()函式
# all() 函式用於判斷給定的引數中的所有元素是否都為 TRUE
# any() 函式用於判斷給定的引數是否全部為False
l1 = [0, 0, 1, 0, True]
print(all(l1)) # False
資料集中必須所有的元素對應的布林值為True返回的結果才是True
print(any(l1)) # True
資料集中只要所有的元素對應的布林值有一個為True 返回的結果就是True
bin() oct() hex()函式
#產生對應的進位制數
print(bin(100)) # 0b1100100
print(oct(100)) # 0o144
print(hex(100)) # 0x64
bytes()函式
#型別轉換
'''針對編碼解碼 可以使用關鍵字encode與decode 也可以使用bytes和str'''
s1= 'hello 早上好'
# 編碼
res = bytes(s1, 'utf8')
print(res) # b'hello \xe6\x97\xa9\xe4\xb8\x8a\xe5\xa5\xbd'
# 解碼
res1 = str(res, 'utf8')
print(res1) # hello 早上好
divmod()函式
#函式把除數和餘數運算結果結合起來,返回一個包含商和餘數的元組(a // b, a % b)
print(divmod(250,25)) # (10, 0) 第一個引數是整數部分 第二個是餘數部分
print(divmod(251,25)) # (10, 1)
print(divmod(249,25)) # (9, 24)
"""
可以使用在網站的分頁製作上
問
總共250條資料 每頁展示25條 需要多少頁 10頁
總共251條資料 每頁展示25條 需要多少頁 11頁
總共249條資料 每頁展示25條 需要多少頁 10頁
"""
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)
callable()函式
#判斷當前物件是否可以加括號呼叫
name = 'jason'
def index():pass
print(callable(name)) # False 變數名不能加括號呼叫
print(callable(index)) # True 函式名可以加括號呼叫
chr()函式ord()函式
#字元與數字的對應轉換
print(chr(65)) # A 根據數字轉字元 依據ASCII碼
print(ord('A')) # 65 根據字元轉數字 依據ASCII碼
enumerate()函式
#enumerate() 函式用於將一個可遍歷的資料物件(如列表、元組或字串)組合為一個索引序列,同時列出資料和資料下標
'一般用在 for 迴圈當中'
#程式碼示例:
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) # 還可以控制起始位置
dir()函式
#返回資料型別可以呼叫的內建方法(檢視物件內部可呼叫的屬性)
print(dir(123))
print(dir('jason'))
eval() 函式 exec() 函式
#eval() 函式用來執行一個字串表示式,並返回表示式的值
#exec() 執行儲存在字串或檔案中的Python語句
'能夠識別具有與一定邏輯的python程式碼'
eval("print('Hello World')") # 執行簡單的字串
exec("for i in range(5): print('iter time is %d'%i)") # 執行復雜的for迴圈
# iter time is 0
# iter time is 1
# iter time is 2
# iter time is 3
# iter time is 4