第021講:函式:lambda表示式
測試題
0. 請使用lambda表示式將下邊函式轉變為匿名函式?
def fun_A(x, y=3):
return x * y
lambda x, y=3 : x * y
1. 請將下邊的匿名函式轉變為普通的屌絲函式?
lambda x : x if x % 2 else None
def is_odd(x):
if x % 2:
return x
else:
return None
2. 感受一下使用匿名函式後給你的程式設計生活帶來的變化?
a. Python寫一些執行指令碼時,使用匿名函式就可以省下定義函式過程,比如說我們只是需要寫個簡單的指令碼來管理伺服器時間,我們就不需要專門定義一個函式然後再寫呼叫,使用匿名函式就可以使得程式碼更加精簡。
b. 對於一些比較抽象並且整個程式執行下來只需要呼叫一兩次的函式,有時候給函式起個名字也是比較頭疼的問題,使用匿名函式就不需要考慮命名的問題了。
c. 簡化程式碼的可讀性,由於普通的屌絲函式閱讀經常要跳到開頭def定義部分,使用匿名函式函式可以省去這樣的步驟。
【小甲魚溫馨提示:知道就行,千萬別去背^_^】
3. 你可以利用filter()和lambda表示式快速求出100以內所有3的倍數嗎?
list(filter(lambda n : not(n%3), range(1, 100)))
4. 還記得列表推導式嗎?完全可以使用列表推導式代替filter()和lambda組合,你可以做到嗎?
例如將第3題轉為列表推導式即:
[ i for i in range(1, 100) if not(i%3)]
5. 還記得zip嗎?使用zip會將兩數以元祖的形式繫結在一塊,例如:
>>> 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表示式)
>>> list(map(lambda x, y : [x, y], [1, 3, 5, 7, 9], [2, 4, 6, 8, 10]))
[[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
注意:強大的map()後邊是可以接受多個序列作為引數的。
6. 請目測以下表達式會列印什麼?
def make_repeat(n): return lambda s : s * n double = make_repeat(2) print(double(8)) print(double('FishC'))
會列印:
16
FishCFishC
7. 請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!
這節課只要來討論一下lambda表示式,Python允許使用lambda表示式建立匿名函式,那什麼是匿名函式呢?
Python的lambda語句是非常精簡的,基本的語法就是在冒號的前面是原函式的引數,而在冒號的後邊是原函式的返回值。lambda語句實際上是構建了一個函式物件,如果要對它進行使用,只需要簡單的賦值即可。
lambda語句構建的函式的引數也可以是多個的
(2)lambda表示式的作用
Python寫一些執行指令碼時,使用lambda就可以省下定義函式的過程,比如說我們只是需要寫個簡單的指令碼來管理伺服器時間,我們就不需要專門定義一個函式然後再寫呼叫,使用lambda就可以使得程式碼更加精簡。
對於一些比較抽象並且整個程式執行下來只需要呼叫一兩次的函式,有時候給函式起個名字也是比較頭痛的問題,使用lambda就不需要考慮命名的問題了。
簡化程式碼的可讀性,由於普通的屌絲函式閱讀經常要跳到開頭def定義部分,使用lambda函式可以省去這樣的步驟。
(3)兩個牛逼的BIF
-
filter()
用法:filter(function or None, iterable),有兩個引數,第二個引數為可迭代的資料,第一個引數可以為None或者函式,當為None時,將iterable中為真的資料挑選出來,當為function時,將iterable中滿足function的結果為真的資料挑選出來。
>>> filter(None, [1, 0, False, True])
<filter object at 0x00000261C2E3C0B8>
>>> list( filter(None, [1, 0, False, True]))
[1, True]
下面寫一個挑選出奇數的程式碼:
用lambda實現:
- map()
用法:map(func, *iterables),將可迭代序列的每一個數據作為函式的引數進行運算加工,直到可迭代序列的每一個元素都加工完畢,返回所有加工後的元素構成的新序列。