lambda map filter reduce zip 以及列表推導

貓xian森發表於2017-10-11

最近比較忙, 好久沒寫部落格了, 現在起, 堅決跟上. 這次簡單記錄python中的常用特殊技巧方法.


lambda匿名函式篇

lambda c: c>10
def func(c): return c > 10

(lambda *argv: [item for item in argv])(1,2,3,4,5)
(lambda **kargv:[item for item in kargv.items()])(a=1,b=2,c=3)複製程式碼
  • 這裡使用lambda表示式宣告的匿名函式, 和常規的def宣告函式具有同樣的效果.
  • lambda多用於函式體簡單以及該函式不會被重複呼叫多次的情況
  • lambda可以接受多個引數, 不定引數以及鍵值對

map(func, iter)函式篇

map(ord, '!@#$%^&*()_+')複製程式碼
  • map函式接受一個函式名func以及一個迭代器iter
  • map函式將iter中的元素依次傳入func中執行, 並返回func執行後的結果組成的結果集, 該結果集是一個map型別的迭代器
  • map函式也可以接受lambda函式做引數

filter(func,iter) 函式篇

filter(lambda x: x > 64, map(ord, '!@#$%^&*()_+'))複製程式碼
  • filter函式接受引數同map函式
  • 不同的是, 此處的func用於過濾iter中的內容, 而map中的函式用於對iter中元素做同一處理
  • 返回一個filter型別的迭代器

reduce(func, iter)函式篇

from functools import reduce
reduce(lambda sum_res, next_res: sum_res + next_res, range(10))複製程式碼
  • python3reduce被移到functools
  • reduce可接受的引數同map函式一樣, 不同的是前者接受的func必須可以接受兩個引數, 第一個引數會自動傳入當前iter的元素結果集, 第二個引數會自動傳入iter的下一個元素. 最後返回iter中每個元素按照func規則作用之後的結果
  • 該函式多用於求和差積除之類的操作

zip(iter01.iter02)函式篇

zip(['a', 'b', 'c', 'd'], {1,2,3})

zip(*zip(['a', 'b', 'c', 'd'], {1, 2, 3}))複製程式碼
  • zip接受多個iter, 並將iter按照最少元素的那個對應打包成元組, 返回一個zip型別的迭代器, 該迭代器中的元素為前邊打包完成的元組
  • zip也支援解包操作, 將打包的迭代器拆分成多個元組

列表推導篇

[i for i in range(10)]
{i:i for i in range(10)}
{i for i in range(10)}

colors=['black','whiite']
sizes={'S','M','L'}
[(color,size) for color in colors for size in sizes]複製程式碼
  • 列表推導, 可用於快速生成可讀性高的列表, 字典以及集合
  • 一次性生成多個元素的列表, 字典或者集合型別
  • 便捷的生成笛卡爾積

生成器表示式篇

(i for i in range(20))

tuple(i for i in range(20))
list(i for i in range(20))複製程式碼
  • 生成器表示式語法和列表推導類似, 只是將方括號變為圓括號
  • 生成器表示式可以逐個產出元素, 而不是先建立一個完整的列表再把該列表傳遞到某個建構函式中去
  • 生成器表示式僅僅在for迴圈時候才生成組合, 可以減少for迴圈的開銷

相關文章