Python基礎:lambda 匿名函數


格式

lambda argument1, argument2,... argumentN : expression

square = lambda x: x**2
print(square(2))

與常規函數區別

  匿名函數 lambda 和常規函數一樣,返回的都是一個函數對象(function object)
 
  lambda 是一個表達式(expression),並不是一個語句(statement)。表達式是可以被求值,類似"公式"的代碼,而語句是一段完成了某種功能的可執行代碼。
  所以,lambda可以用在列表內部:
l = [(lambda x:x**2) (x) for x in range(10)]
print(list(l))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
  同樣,可以作為參數
l = [(1, 20), (3, 0), (9, 10), (2, -1)]
l.sort(key=lambda x: x[1]) # 按列表中元祖的第二個元素排序
print(l)
輸出
[(2, -1), (3, 0), (9, 10), (1, 20)]
  lambda 的主體是只有一行的簡單表達式,並不能擴展成一個多行的代碼塊。

使用lambda可以簡化代碼

squared = map(lambda x: x**2, [1, 2, 3, 4, 5])
print(list(squared))

  上面那段代碼,如果不用lambda表達式而用常規函數:

def squared2(x):
    return x[1] if isinstance(x,tuple) else x**2

squared = map(squared2, [1, 2, 3, 4, 5,(1,3)])
print(list(squared))

Python函數式編程

  Python函數式編程有三個基本函數 map()、reduce()、filter()

  map(function, iterable [,iterable2])

  map遍歷可迭代對象取出元素,作為參數依次傳給function函數,例:每個元素都變大2倍

l = [1, 2, 3, 4, 5]
new_list = map(lambda x: x * 2, l) # [2, 4, 6, 8, 10]

  filter(function, iterable)

  filter與map一樣,遍歷可迭代對象,並依次傳給function,不同的是,filter會判斷每次function的結果是True或False,並將結果為True的元素組成列表返回

  例:返回一個列表中的所有偶數

l = [1, 2, 3, 4, 5]
new_list = filter(lambda x: x % 2 == 0, l) # [2, 4]

  reduce(function, iterable[, initializer])

  其中function 是一個函數對象,規定它有兩個參數,表示對 iterable 中的每個元素以及上一次調用后的結果,運用 function 進行計算,所以最后返回的是一個單獨的數值。

  配合reduce源碼理解:

def reduce(function, iterable, initializer=None):
    it = iter(iterable)
    if initializer is None:
        try:
            initializer = next(it)
        except StopIteration:
            raise TypeError('reduce() of empty sequence with no initial value')
    accum_value = initializer
    for x in it:
        accum_value = function(accum_value, x)
    return accum_value

  例 累加列表中的元素

from functools import reduce
l = [1,2,3,4,5]
result = reduce(lambda x,y:x+y, l )
print(result) #15
result = reduce(lambda x,y:x+y, l,10 )
print(result) #25

思考題

  把字典 d = {'mike': 10, 'lucy': 2, 'ben': 30} 按值從高到低排序

d = {'mike': 10, 'lucy': 2, 'ben': 30}
d = sorted(d.items(), key=lambda x: x[1],reverse = True ) #[('ben', 30), ('mike', 10), ('lucy', 2)]
d = dict(d)
print(d)

 參考:

極客時間《Python核心技術與實戰》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM