最近比較忙, 好久沒寫部落格了, 現在起, 堅決跟上. 這次簡單記錄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))複製程式碼
- 在
python3
中reduce
被移到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
迴圈的開銷