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:模塊
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
參考資料: