程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

map、reduce、filter等常與lambda配合使用的函數【Python】

編輯:Python

Python中常與lambda配合使用的函數:map、reduce、filter等


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


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved