1. 程式人生 > >第021講:函式:lambda表示式

第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),將可迭代序列的每一個數據作為函式的引數進行運算加工,直到可迭代序列的每一個元素都加工完畢,返回所有加工後的元素構成的新序列。