內(nèi)容來(lái)源于網(wǎng)絡(luò)境钟,本人只是在此稍作整理,如有涉及版權(quán)問(wèn)題俭识,歸小甲魚(yú)官方所有吱韭。
練習(xí)題(來(lái)自小甲魚(yú)官方論壇)
0.請(qǐng)使用lambda表達(dá)式將下邊函數(shù)轉(zhuǎn)變?yōu)槟涿瘮?shù)?
def fun_A(x,y=3):
return x*y
答:
lambda x, y = 3 : x * y
1.請(qǐng)將下邊的匿名函數(shù)轉(zhuǎn)變?yōu)槠胀ê瘮?shù)?
lambda x:x if x%2 else None
答:
def odd(x):
if x%2:
return x
else:
return None
2.感受一下使用匿名函數(shù)后給你的編程生活帶來(lái)的變化理盆?
答:
1.Python寫(xiě)一些執(zhí)行腳本時(shí)痘煤,使用匿名函數(shù)就可以省下定義函數(shù)過(guò)程,比如說(shuō)我們只是需要寫(xiě)個(gè)簡(jiǎn)單的腳本來(lái)管理服務(wù)器時(shí)間猿规,我們就不需要專門(mén)定義一個(gè)函數(shù)然后再寫(xiě)調(diào)用衷快,使用匿名函數(shù)就可以使得代碼更加精簡(jiǎn)。
2.對(duì)于一些比較抽象并且整個(gè)程序執(zhí)行下來(lái)只需要調(diào)用一兩次的函數(shù)姨俩,有時(shí)候給函數(shù)起個(gè)名字也是比較頭疼的問(wèn)題蘸拔,使用匿名函數(shù)就不需要考慮命名的問(wèn)題了。
3.簡(jiǎn)化代碼的可讀性环葵,由于普通的屌絲函數(shù)閱讀經(jīng)常要跳到開(kāi)頭def定義部分调窍,使用匿名函數(shù)函數(shù)可以省去這樣的步驟。
3.用filter()函數(shù)和lambda表達(dá)式快速求出100以內(nèi)所有3的倍數(shù)张遭?
答:
a = list(filter(lambda x:x%3 == 0,range(1,100)))
print(a)
b = list(filter(lambda x:not(x%3),range(1,100)))
print(b)
c = list(filter(lambda x:x if x%3==0 else None,range(100)))
print(c)
4. 還記得列表推導(dǎo)式嗎邓萨?完全可以使用列表推導(dǎo)式代替filter()和lambda組合,你可以做到嗎菊卷?
答:
[x for x in range(1,100)if x%3==0]
5. 還記得zip嗎缔恳?使用zip會(huì)將兩數(shù)以元祖的形式綁定在一塊,例如:
>>> list(zip([1,3,5,7,9],[2,4,6,8,10]))
[(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
但如果我希望打包的形式是靈活多變的列表而不是元祖(希望是[[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]這種形式)洁闰,你能做到嗎歉甚?(采用map和lambda的表達(dá)式)
答:
list(map(lambda x,y : [x,y],[1,3,5,7,9],[2,4,6,8,10]))
注意:強(qiáng)大的map()后邊是可以接受多個(gè)序列作為參數(shù)的。
補(bǔ)充下內(nèi)置zip()函數(shù)的知識(shí)點(diǎn):zip() 函數(shù)用于將可迭代的對(duì)象作為參數(shù)扑眉,將對(duì)象中對(duì)應(yīng)的元素打包成一個(gè)個(gè)元組纸泄,然后返回由這些元組組成的列表。
注意:zip 方法在 Python 2 和 Python 3 中的不同:在 Python 3.x 中為了減少內(nèi)存腰素,zip() 返回的是一個(gè)對(duì)象聘裁。如需展示列表,需手動(dòng) list() 轉(zhuǎn)換耸弄。
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b) # 返回一個(gè)對(duì)象
>>> zipped
<zip object at 0x103abc288>
>>> list(zipped) # list() 轉(zhuǎn)換為列表
[(1, 4), (2, 5), (3, 6)]
>>> list(zip(a,c)) # 元素個(gè)數(shù)與最短的列表一致
[(1, 4), (2, 5), (3, 6)]
>>> a1, a2 = zip(*zip(a,b)) # 與 zip 相反,*zip 可理解為解壓卓缰,返回二維矩陣式
>>> list(a1)
[1, 2, 3]
>>> list(a2)
[4, 5, 6]
>>>
6.請(qǐng)目測(cè)一下表達(dá)式會(huì)打印什么计呈?
def make_repeat(n):
return lambda s:s*n
double=make_repeat(2)
print(double(8))
print(double('fishC'))
輸出:
16
fishCfishC
7.請(qǐng)寫(xiě)下這一節(jié)課你學(xué)習(xí)到的內(nèi)容:格式不限,回憶并復(fù)述是加強(qiáng)記憶的好方式征唬!
- lambda表達(dá)式的作用:
1)Python寫(xiě)一些執(zhí)行腳本時(shí)捌显,使用lambda就可以省下定義函數(shù)的過(guò)程,比如說(shuō)我們只是需要寫(xiě)一個(gè)簡(jiǎn)單的腳本來(lái)管理服務(wù)器時(shí)間总寒,我們就不需要專門(mén)定義一個(gè)函數(shù)然后再寫(xiě)調(diào)用扶歪,使用lambda就可以使得代碼更加精簡(jiǎn)。
2)對(duì)于一些比較抽象并且整個(gè)程序執(zhí)行下來(lái)只需要調(diào)用一兩次的函數(shù),有時(shí)候我們個(gè)函數(shù)起個(gè)名字也是比較頭疼的問(wèn)題善镰,使用lambda就不需要考慮命名問(wèn)題妹萨。
3)簡(jiǎn)化代碼的可讀性,由于普通的函數(shù)閱讀經(jīng)常要跳到開(kāi)頭def定義部分炫欺,使用lambda函數(shù)可以省去這樣的步驟乎完。 - 2、兩個(gè)重要的BIF
1)filter(function or None,iterable):兩個(gè)參數(shù)為函數(shù)和可迭代的序列品洛,函數(shù)定義了過(guò)濾的規(guī)則树姨,默認(rèn)過(guò)濾出真的部分。
>>> list(filter(lambda x : x % 2, range(10)))
[1, 3, 5, 7, 9]
>>> list(filter(None,[1, 2, 3, 4, 5, 6, 7, 8, 9, 0, False, True]))
[1, 2, 3, 4, 5, 6, 7, 8, 9, True]
2)map(function or None,iterable):同filter()的兩個(gè)參數(shù)相同桥状,這個(gè)內(nèi)置函數(shù)的作用是:將序列的每一個(gè)元素作為函數(shù)的參數(shù)進(jìn)行運(yùn)算加工帽揪,直到可迭代序列的每個(gè)元素都加工完畢,返回所有加工后的元素構(gòu)成的新序列辅斟。
>>> list(map(lambda x : x * 2, range(10)))
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]