床長人工智能教程免費(fèi)擴(kuò)展208
朋友們,如需轉(zhuǎn)載請(qǐng)標(biāo)明出處:[https://blog.csdn.net/jiangjunshow](https://blog.csdn.net/jiangjunshow)
聲明:在人工智能技術(shù)教學(xué)期間,不少學(xué)生向我提一些python相關(guān)的問題,所以為了讓同學(xué)們掌握更多擴(kuò)展知識(shí)更好地理解AI技術(shù),我讓助理負(fù)責(zé)分享這套python系列教程,希望能幫到大家!由于這套python教程不是由我所寫,所以不如我的AI技術(shù)教學(xué)風(fēng)趣幽默,學(xué)起來比較枯燥;但它的知識(shí)點(diǎn)還是講到位的了,也值得閱讀!想要學(xué)習(xí)AI技術(shù)的同學(xué)可以點(diǎn)擊跳轉(zhuǎn)到我的[教學(xué)網(wǎng)站](https://www.captainbed.net/csdn)。PS:看不懂本篇文章的同學(xué)請(qǐng)先看前面的文章,循序漸進(jìn)每天學(xué)一點(diǎn)就不會(huì)覺得難了!
通常來說,lambda起到了一種函數(shù)速寫的作用,允許在使用的代碼內(nèi)嵌入一個(gè)函數(shù)的定義。在你僅需要嵌入小段可執(zhí)行代碼的情況下它們會(huì)帶來一個(gè)更簡潔的代碼結(jié)構(gòu)。
lambda通常用來編寫跳轉(zhuǎn)表(jump table),也就是行為的列表或字典,能夠按照需要執(zhí)行相應(yīng)的動(dòng)作。如下段代碼所示。
```
L = [lambda x: x ** 2,? ? ? ? # Inline function definition
? ? ?lambda x: x ** 3,
? ? ?lambda x: x ** 4]? ? ? ? ?# A list of 3 callable functions
for f in L:
? ? print(f(2))? ? ? ? ? ? ? ? # Prints 4,8,16
print(L[0](3))? ? ? ? ? ? ? ? ?# Prints 9
```
當(dāng)需要把小段的可執(zhí)行代碼編寫進(jìn)def語句從語法上不能編寫進(jìn)的地方時(shí),lambda表達(dá)式作為def的一種速寫來說是最為有用的。例如,上面的代碼片段,通過在列表常量中嵌入lambda表達(dá)式創(chuàng)建一個(gè)含有三個(gè)函數(shù)的列表。對(duì)等的def代碼可能需要在想要使用的環(huán)境之外有臨時(shí)性函數(shù)名稱和函數(shù)定義。
```
def f1(x): return x ** 2
def f2(x): return x ** 3? ? ? ?# Define named functions
def f3(x): return x ** 4
L = [f1,f2,f3]? ? ? ? ? ? ? ?# Reference by name
for f in L:
? ? print(f(2))? ? ? ? ? ? ? ? # Prints 4,8,16
print(L[0](3))? ? ? ? ? ? ? ? ?# Prints 9
```
實(shí)際上,我們可以用Python中的字典或者其他的數(shù)據(jù)結(jié)構(gòu)來構(gòu)建更多種類的行為表,從而做同樣的事情。下面給出另一個(gè)例子:
```
>>>key = 'got'
>>>{'already': (lambda: 2 + 2),
...'got':? ? ? (lambda: 2 * 4),
...'one':? ? ? (lambda: 2 ** 6)}[key]
name
for f in L:
? ? print(f(2))? ? ? ? ? ? ? ? # Prints 4,8,16
print(L[0](3))? ? ? ? ? ? ? ? ?# Prints 9
```
這里,當(dāng)Python創(chuàng)建這個(gè)字典的時(shí)候,每個(gè)嵌套的lambda都生成并留下了一個(gè)在之后能夠調(diào)用的函數(shù)。如果不是用lambda做這種工作,需要使用三個(gè)文件中其他地方出現(xiàn)過的def語句來替代,也就是在這些函數(shù)將會(huì)使用的那個(gè)字典外的某處需要定義這些函數(shù)。
```
>>>def f1(): return 2 + 2...
>>>def f2(): return 2 * 4
...
>>>def f3(): return 2 ** 6
...
>>>key = 'one'
>>>{'already': f1,'got': f2,'one': f3}[key]()
64
```
同樣,上面代碼會(huì)實(shí)現(xiàn)相同的功能,但是def也許會(huì)出現(xiàn)在文件中的任意位置,即使它們只有很少的代碼。類似剛才lambda的代碼,提供了一種特別有用的可以在單個(gè)情況出現(xiàn)的函數(shù):如果這里的三個(gè)函數(shù)不會(huì)在其他的地方使用到,那么將它們的定義作為lambda嵌入在字典中就是很合理的了。不僅如此,def格式要求為這些小函數(shù)創(chuàng)建變量名,這些變量名也許會(huì)與這個(gè)文件中的其他變量名發(fā)生沖突。