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