問題:需要提供一個短小的回調(diào)函數(shù)為sort()這樣的操作使用狼钮,但是又不想通過def語句編寫一個單行的函數(shù)
解決方案:像這種僅僅完成表達式求值的簡單函數(shù)可以通過lambda表達式來替代
# 示例1:
add = lambda x, y: x + y
print(add(1, 2)) # 3
# 示例2:lambda表達式可用在如下的上下文環(huán)境中矛物,比如排序或者對數(shù)據(jù)新進行整理時
names = ['a', 'b', 'kj', 'iuo']
print(sorted(names, key=lambda name: name.lower())) # ['a', 'b', 'iuo', 'kj']
問題: 我們利用lambda表達式定義一個匿名函數(shù)疟赊,但是也希望可以在函數(shù)定義的時候完成對特定變量的綁定
下面看下lambda表達式中是如何綁定變量的:
# 示例1:
x = 10
a = lambda y: x+y
x = 20
b = lambda y: x+y
print(a(10)) # 30 # 原因分析:lambda表達式中用到x是一個自由變量眷唉,在運行的時候綁定而不是定義的時候綁定
print(b(10)) # 30
解決方案:如果希望匿名函數(shù)可以在定義的時候綁定變量吴趴,并且保持值不變奏候,那么可以將那個值作為默認參數(shù)實現(xiàn)
x = 10
a = lambda y, x=x: x+y
x = 20
b = lambda y, x=x: x+y
print(a(10)) # 20
print(b(10)) # 30
本節(jié)中提到的問題較容易出現(xiàn)在對lambda函數(shù)過于聰明的應用上劲件。比方說揉燃,通過列表推導來創(chuàng)建一列l(wèi)ambda表達式扫尺,實例代碼如下:
funds = [lambda x: x+n for n in range(3)]
for f in funds:
print(f(0)) # 2, 2, 2
funds = [lambda x, n=n: x+n for n in range(3)] # 給個默認參數(shù),在定義lambda匿名函數(shù)的時候就把n綁定了
for f in funds:
print(f(0)) # 0, 1, 2