1. 程式人生 > >《零基礎入門學習Python》(21)--函式:lambda表示式(內建BIF filte()和map())

《零基礎入門學習Python》(21)--函式:lambda表示式(內建BIF filte()和map())

前言

接下來學習怎麼建立匿名函式

知識點

  • 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