刻意練習Python基礎 ——day 07:函數與Lambda表達式(下)

17天 —— Python基礎刻意練習

Day 01——Task01:變量、運算符與數據類型
Day 02——Task02:條件與循環
Day 03——Task03:列表與元組(上)
Day 04——Task03:列表與元組(下)
Day 05——Task04:字符串與序列
Day 06——Task05:函數與Lambda表達式(上)
Day 07——Task05:函數與Lambda表達式(下)
Day 08——Task06:字典與集合
Day 09——Task07:文件與文件系統(上)
Day 10——Task07:文件與文件系統(下)
Day 11——Task08:異常處理
Day 12——Task09:else 與 with 語句
Day 13——Task10:類與對象(上)
Day 14——Task10:類與對象(下)
Day 15——Task11:魔法方法(上)
Day 16——Task11:魔法方法(下)
Day 17——Task12:模塊
    



函數與Lambda表達式



2. Lambda表達式

 2.1. Lambda表達式介紹

匿名表達式—lambda
lambda 函數是一種快速定義單行的最小函數,是從Lisp借用來的,可以用在任何需要函數的地方。
lambda 是一個 匿名函數,不需要名字的函數,它更像一像是一個指令,通常只需要一行代碼去做一件事情的函數,都可以用lambda定義它。 不需要函數名字,只需要函數功能的,就會用到它。

  • 使用Python寫一些執行腳本時,使用lambda可以省去定義函數的過程,讓代碼更加精筒。
  • 對於一些抽象的,不會別在的地方再複用的函數,有時候給函數起個名字也是個難題,使用lambda不需要考慮命名的問題。只用到一次,執行一次函數效果的函數,可以選擇簡潔一點的lambda
  • 使用lambda在某些時候讓代碼更容易理解。
  • lambda 函數擁有自己的命名空間,且不能訪問自己參數列表之外或全局命名空間裏的參數。
lambda argument_list: expression
  • lambda - 定義匿名函數的關鍵詞。
  • argument_list - 函數參數,它們可以是位置參數、默認參數、關鍵字參數,和正規函數裏的參數類型一樣。
  • : - 冒號,在函數參數和表達式中間要加個冒號。
  • expression - 函數表達式,輸入函數參數,輸出一些值。
sumary = lambda arg1, arg2: arg1 + arg2
print(sumary(10, 20))  
# 30

func = lambda *args: sum(args)
print(func(1, 2, 3, 4, 5))  
# 15

 2.2. 匿名函數 VS 正規函數

lbd_sqr = lambda x: x ** 2
print(lbd_sqr)
# <function <lambda> at 0x000000BABB6AC1E0>
print(lbd_sqr(9))
# 81


def sqr(x):
    return x ** 2
print(sqr)
# <function sqr at 0x000000BABD3A4400>
print(sqr(9))
# 81
  • 誤用情況:如果用 lambda 函數只是爲了賦值給一個變量,用 def 的正規函數。
  • lbd_sqr 的返回值是以 標識的函數,而 sqr 的返回時是以 sqr 爲標識的函數,明顯後者一看就知道該函數是「計算平方」用的。

 2.3. Lambda 表達式的應用

高階函數 (high-order function) 在函數化編程 (functional programming) 很常見,主要有兩種形式:

  • 參數是函數 (filter, map)

  • 返回值是函數 (closure)

下面,看看 map, filter的語法:

filter(function, iterable) 過濾序列,過濾掉不符合條件的元素,返回一個迭代器對象,如果要轉換爲列表,可以使用 list() 來轉換。

odd = lambda x: x % 2 == 1
templist = filter(odd, [1, 2, 3, 4, 5, 6, 7, 8, 9])
print(list(templist))  # [1, 3, 5, 7, 9]
  • map(function, iterable, …) 根據提供的函數對指定序列做映射。
m1 = map(lambda x: x ** 2, [1, 2, 3, 4, 5])
print(list(m1))  # [1, 4, 9, 16, 25]
m2 = map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
print(list(m2))  # [3, 7, 11, 15, 19]

除了 Python 這些內置函數,我們也可以自己定義高階函數,如下:

def apply_to_list(fun, some_list):
    return fun(some_list)

下面代碼分別求出列表中所有元素的和、個數和均值。

lst = [1, 2, 3, 4, 5]
print(apply_to_list(sum, lst))
# 15
print(apply_to_list(len, lst))
# 5
print(apply_to_list(lambda x: sum(x) / len(x), lst))
# 3.0

參考資料:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章