《零基礎入門學習Python》(21)--函式:lambda表示式(內建BIF filte()和map())
阿新 • • 發佈:2018-11-09
前言
接下來學習怎麼建立匿名函式
知識點
-
lambda 表示式
Python 允許使用lambda關鍵字建立匿名函式
lambda
函式怎麼使用?
單個引數
>>> def add(x): return 2*x + 1 >>> add(5) 11 #使用lambda函式的寫法: >>> lambda x : 2 * x + 1 <function <lambda> at 0x000000AE37D46A60> #冒號的前邊是原函式的引數,冒號的後邊是原函式的返回值。 >>> g = lambda x : 2 * x + 1 >>> g(5) 11
多個引數
>>>
>>> def add(x,y):
return x + y
>>> add(3,4)
7
>>> lambda x,y : x+y
<function <lambda> at 0x000000AE37D46B70>
>>> g = lambda x,y : x+y
>>> g(3,4)
7
-
lambda 表示式的作用
- Python寫一些執行指令碼時,使用lambda就可以省下定義函式過程,比如說 我們只是需要寫個簡單的指令碼來管理伺服器時間,我們就不需要專門定義一個 函式然後再寫呼叫,使用lambda就可以使得程式碼更加精簡。
- 對於一些比較抽象並且整個程式執行下來只需要呼叫一兩次的函式,有時候給函式起個名字也是比較頭痛的問題,使用lambda就不需要考慮命名的問題了。
- 簡化程式碼的可讀性,由於普通屌絲函式閱讀經常要跳到開頭def定義部分,使用lambda函式
- 可以省去這樣的步驟。
接下來講講兩個內建函式的用法
-
filter() 與 map()
-
filter()
>>> help(filter) Help on class filter in module builtins: class filter(object) | filter(function or None, iterable) --> filter object | 過濾器(函式或無,可迭代) - >過濾器物件 | | Return an iterator yielding those items of iterable for which function(item) | is true. If function is None, return the items that are true. | 返回一個迭代器,產生那些函式(item)為true的iterable項。 如果函式為None,則返回true的專案。 #例子: >>> filter(None,[1,0,False,True]) <filter object at 0x00000004A997D780> >>> list(filter(None,[1,0,False,True])) [1, True] #利用filter,我們嘗試寫出一個篩選基數的過濾器。(基數:不能被2整除的數) def odd(x): return x % 2 temp = range(10) show = filter(odd,temp) list(show) [1, 3, 5, 7, 9] #用lambda表示式寫: list(filter(lambda x : x % 2, range(10))) [1, 3, 5, 7, 9]
- map()
#將序列的每一個元素作為函式的引數進行運算加工,直到可迭代序列的每個元素都加工完畢,
#返回所有加工後的元素構成的新序列
list(map(lambda x : x * 2,range(10)))
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
課後習題
測試題
- 請使用lambda表示式將下邊函式轉變為匿名函式
>>> def fun(x,y=3):
return x * y
>>> fun(4)
12
#改寫後:
>>> g = lambda x,y=3 : x * y
>>> g(4)
12
- 請將下邊的匿名函式轉變為普通的屌絲函式
>>> f = lambda x : x if x%2 else None
>>> f(5)
5
>>> f(4)
沒有返回
#改寫後:
>>> def y(x):
if x%2:
return x
else:
return None
>>> y(5)
5
>>> y(4)
沒有返回
- 你可以利用filter()和lambda表示式快速求出100以內所有3的倍數嗎?
>>> list(filter(lambda x : x if x%3==0 else None,range(101)))
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
>>> list(filter(lambda x : not(x%3),range(1,100)))
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
- 還記得zip嗎?使用zip會將兩數以元祖的形式繫結在一塊,例如:
>>> list(zip([1,3,5,7,9],[2,4,6,8,10,12]))
[(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,12]))
[[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
- 請目測以下表達式會列印什麼?
def make_repeat(n):
return lambda s : s * n
double = make_repeat(2)
print(double(8))
print(double('FishC'))
--可以改寫成這種形式:
>>> def make_repeat(n):
def xx(s):
return s * n
return xx
>>> double = make_repeat(2)
>>> print(double(8))
16
>>> print(double('FishC'))
會列印:
16