lambda關鍵字可以用於創建小巧的匿名函數。
它由參數和一個單獨 expression 構成,表達式會在調用時被求值。創建 lambda 函數的句法為 lambda [parameters]: expression
。
lambda經常與內置的或functools的某些函數搭配使用:
map(function, iterable, …):
將function函數作用於iterable中的每個元素上,並輸出其結果的迭代器。
如果傳入了多個iterable參數,那麼要求function對應要有相同數量的入參,以對多個iterable同時執行操作。
如果傳入的多個可迭代對象長度不同,則最短的可迭代對象遍歷結束時,整個迭代停止。
foo = map(lambda x: x ** 2, [1, 3, 5, 7, 9])
print(type(foo)) # <class 'map'>
for _ in foo:
print(_, end=' ') # 1 9 25 49 81
l1 = list(range(1, 6))
l2 = list(range(1, 5)) # 以短的可迭代對象為生成次數
bar = map(lambda x, y: x ** y, l1, l2) # x, y 兩個參數對應於l1,l2兩個可迭代對象
while True:
try:
print(bar.__next__(), end=' ') # 1 4 27 256
except StopIteration:
break
對於函數的輸入已經是參數元組的情況,請參閱 itertools.starmap()
。
from itertools import starmap
l1 = list(range(1, 6))
l2 = list(range(1, 5))
baz = starmap(pow, zip(l1, l2)) # 對[(1,1),(2,2),(3,3),(4,4)]逐個執行pow()
for _ in baz:
print(_, end=' ') # 1 4 27 256
filter(function, iterable):
返回iterable中執行function後結果為True的元素,輸出結果是一個迭代器。如果function是None,則會假設它是一個身份函數,即以iterable中元素進行Treu/False判斷。filter(function, iterable)
相當於一個生成器表達式,當 function 不是 None
的時候為 (item for item in iterable if function(item))
;function 是 None
的時候為 (item for item in iterable if item)
。
l = [1, 8, 9, 5, 0, 34, 78, 43, 90, 0]
foo = filter(lambda x: x > 40, l)
print(list(foo)) # [78, 43, 90]
bar = filter(None, l)
print(list(bar)) # [1, 8, 9, 5, 34, 78, 43, 90]
如果想讓iterable的元素判斷為False時才返回,可以使用 itertools.filterfalse()
。
foo = itertools.filterfalse(lambda x: x % 2, l)
print(list(foo))
bar = itertools.filterfalse(None, l) # [8, 0, 34, 78, 90, 0]
print(list(bar)) # [0, 0]
functools.reduce(function, iterable[, initializer]):
將兩個參數的 function 從左至右積累地應用到 iterable 的元素,將可迭代對象縮減為單一的值。 例如,reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
是計算 ((((1+2)+3)+4)+5)
的值。
左邊的參數 x 是積累值而右邊的參數 y 則是來自 iterable 的更新值。 如果存在可選項 initializer,它會被放在參與計算的可迭代對象的條目之前,並在可迭代對象為空時作為默認值。 如果沒有給出 initializer 並且 iterable 僅包含一個元素,則將返回第一項。
from functools import reduce
l = [1, 2, 3, 4, 5]
foo = reduce(lambda x, y: x * y, l)
print(foo) # 120 = 1 * 2 * 3 * 4 * 5
bar = reduce(lambda x, y: x * y, l, 0)
print(bar) # 0 = 0 * 1 * 2 * 3 * 4 * 5
baz = reduce(lambda x, y: x * y, [1])
print(baz) # 1
作為排序的key:
pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
pairs.sort(key=lambda pair: pair[1])
print(pairs) # [(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]
# 或者
pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
pairs = sorted(pairs, key=lambda pair: len(pair[1]))
print(pairs) # [(1, 'one'), (2, 'two'), (4, 'four'), (3, 'three')]
builtin內置函數:https://docs.python.org/zh-cn/3/library/functions.html
itertools迭代器函數:https://docs.python.org/zh-cn/3/library/itertools.html
functools高階函數:https://docs.python.org/zh-cn/3/library/functools.html