如下是我學習《流暢的Python》後的我的筆記,如今拿出來和你們共享,但願能幫到各位Python學習者。python
首次發表於: 微信公衆號:科技老丁哥,ID: TechDing,敬請關注。
列表推導式能夠從一個序列快速構建另外一個序列,很是方便快捷,強烈建議使用。git
列表推導式適用於簡單的for循環,能夠對一個列表中的每一個元素進行相同操做,也能夠挑選出原列表中知足必定條件的元素組成新的列表。github
集合推導式應用比較少,而字典推導式卻應用普遍,能夠從一個dict中選擇出知足必定條件的items組成新的dict,也能夠對原dict中的key或value進行操做。編程
列表推導式有極其普遍的應用場景,能夠用於循環執行某個函數,也能夠用於將某個list轉換爲dict,或將dict轉換爲list等。微信
列表推導式是構建列表(list)的一種快捷方式,並且可讀性強,用它編寫的代碼很是有Python味兒,是一種很是推薦的編程風格。函數
並且,Python的內部實現對列表推導式作了大量優化,能夠保證運行速度很是快。學習
列表推導式能夠僅僅使用[]來生成一個list,基本代碼格式爲:[表達式 for 變量 in 列表] 或者 [表達式 for 變量 in 列表 if 條件]
,以下爲這兩種格式的實現方法:優化
## demo1: alist=[1,2,3,50,89,26,30] odd=[i for i in alist if i%2==1] # 選出列表alist中全部的奇數 print(odd) # [1, 3, 89]
Python中的列表推導式主要替換了Java或C語言中的for循環,當你想使用for循環來實現簡單的業務時,不妨使用列表推導式。code
### demo2: alist=[1,2,3,50,89,26,30] plus=[i*2+10 for i in alist] # 簡單算術操做 print(plus) # [12, 14, 16, 110, 188, 62, 70]
固然,若是是比較複雜的業務,須要多行代碼才能實現,那仍是老老實實用for循環來實現吧。從這一點來講,列表推導式相似於函數中的lambda表達式,簡單的函數能夠直接用lambda來表示。orm
列表推導式還能夠實現嵌套,通常爲了可讀性比較強,最多嵌套3層。
### demo3: 列表推導式的嵌套用法 alist=[1,2,5] blist=['A','B','C'] combined=[b+'_'+str(a) for b in blist for a in alist] print(combined) # ['A_1', 'A_2', 'A_5', 'B_1', 'B_2', 'B_5', 'C_1', 'C_2', 'C_5'] # demo4: 加入判斷條件: 只用奇數 combined2=[b+'_'+str(a) for b in blist for a in alist if a%2==1] print(combined2) # ['A_1', 'A_5', 'B_1', 'B_5', 'C_1', 'C_5']
列表推導式並不只僅適用於列表(list),還適用於其餘序列類型,好比set, dict等。因此有的人將生成set的叫作集合推導式,把生成dict的叫作字典推導式。
集合推導式的用法和列表推導式同樣,只是將[]改成{}便可,但獲得的集合元素之間若是重複,則僅僅保留一個,這是由set的特性:元素不能重複決定的。
### 集合推導式: ## demo1: alist=[1,2,3,50,89,26,30] odd={i for i in alist if i%2==1} # 選出列表alist中全部的奇數 print(odd) # {89, 1, 3}
字典推導式的用法和列表推導式同樣,只是將[]改成{},但迭代的對象是一個字典類型。
使用字典推導式能夠實現不少多樣化操做,好比下面將key,value互換。
### 字典推導式: # demo1: key,value互換; dictA={'a':10,'b':20,'c':30} changed={value:key for key,value in dictA.items()} print(changed) # {10: 'a', 20: 'b', 30: 'c'}
還好比:單獨對keys進行迭代,能夠選出keys知足必定條件items組成新的dict
### demo2: 選出key是奇數的items dictB={1:'10',2:'20',3:'30',4:'40'} odd_dict={key:dictB[key] for key in dictB.keys() if key%2==1} print(odd_dict) # {1: '10', 3: '30'}
同理,也能夠單獨對values進行迭代,選出values知足必定條件的items組成新的dict.
列表推導式還有些其餘應用場景,好比:
循環執行某個函數:
# 循環執行某個函數: import time def func_test(x): print('start test: {}'.format(x)) time.sleep(1) print('end test: {}'.format(x*2)) # 僅僅乘以2 [func_test(x) for x in range(10,15,2)] # 使用列表推導式循環執行某個函數
start test: 10
end test: 20
start test: 12
end test: 24
start test: 14
end test: 28
循環執行函數,並獲取返回值:
# 循環執行某個函數: import time def func_test(x): print('start test: {}'.format(x)) time.sleep(1) print('end test: {}'.format(x*2)) # 僅僅乘以2 return x*2 result=[func_test(x) for x in range(10,15,2)] # 使用列表推導式循環執行某個函數 print(result) # [20, 24, 28]
經過列表推導式和字典推導式的靈活運用,能夠將dict類型數據和list數據相互轉化,好比:
# 由list生成字典: blist=['A','B','C'] dict_from_list={b:str(idx+10) for idx,b in enumerate(blist)} print(dict_from_list) # {'A': '10', 'B': '11', 'C': '12'} # 由dict生成list dictB={1:'10',2:'20',3:'30',4:'40'} list_from_dict=[key for key,_ in dictB.items() if key%2==0] # 選出偶數的key print(list_from_dict) # [2, 4]
首次發表於: 微信公衆號:科技老丁哥,ID: TechDing,敬請關注。
本文全部代碼都已經上傳到個人github,歡迎下載
參考資料: