11. 匿名函數
(1)lambda
格式:lambda parameter_list: expression
parameter_list就是我們普通函數的參數列表,而expression則是一些簡單的表達式(甚至不能是賦值語句),lambda將expression執行得到的結果返回,可以用一個變量接收:ret = lambda a,b: a + b
ret = lambda a,b: a + b
print(ret(1, 2))
=====================
3
(2)三元表達式
在C語言,Java,C++等語言中,三元表達式是這樣的:
條件 ? 條件爲真的結果 : 條件爲假的結果
而在Python中,卻是這樣的:
條件爲真的結果 if 條件 else 條件爲假的結果
x = 1
y = 2
ret = x if x < y else y
print(ret)
=======================
1
12. 高階函數
(1)map類
這個類有些類似於數學中的“函數”,或者說是映射。
第一個參數是函數,第二個參數是一系列變量列表,可以爲多個列表。
l = [1, 2, 3, 4, 5, 6, 7, 8]
def square(x):
return x ** 2
ret = map(square, l)
print(list(ret))
=======================
[1, 4, 9, 16, 25, 36, 49, 64]
使用map相當於數學中f(x) = x^2,將x代入求出對應的y。
上述代碼也可以改寫爲:
map(lambda x: x ** 2, l)
再看兩種map用法:
# 第一種
l = [1, 2, 3, 4, 5, 6]
l1 = [2, 3, 4, 5, 6, 7]
ret = map(lambda x, y: x ** 2 + y, l, l1)
print(list(ret))
==========================
[3, 7, 13, 21, 31, 43]
# 第二種
l = [1, 2, 3, 4, 5, 6]
l1 = [2, 3, 4, 5]
ret1 = map(lambda x, y: x ** 2 + y, l, l1)
print(list(ret1))
=============================
[3, 7, 13, 21]
當兩個參數列表元素不一樣多時,按照較少的那個個數執行,最終得到的結果與短的參數列表長度相同。
(2)reduce
reduce屬於functools模塊,它有三個參數,前兩個和map一樣,最後一個參數是初始值,默認爲None。它和map的區別是,連續對一個序列進行計算。
from functools import reduce
l = [1, 2, 3, 4, 5, 6]
ret = reduce(lambda x, y: x + y, l)
print(ret)
=======================
21
如上述代碼所示,reduce進行計算的過程爲:
先對1和2進行“+”,再將所得結果賦給x,y = 3,再執行lambda,以此類推,則reduce執行到最後,將得到 l 中所有元素的和。
reduce第三個參數是設定初始值:
from functools import reduce
l = ['1', '2', '3', '4', '5']
r = reduce(lambda x, y: x + y, l, 'A')
print(r)
=========================
A12345
(3)filter類
filter類用於過濾,傳入兩個參數,第一個是函數,第二個是參數列表。
l = [1, 0, 1, 1, 0, 1]
ret = filter(lambda x: True if x==1 else False, l)
print(list(ret))
=========================
[1, 1, 1, 1]
Python並不是一個真正的函數式編程的語言,如果對函數式編程感興趣,可以去學一學Lisp語言,它是真正的利用函數式編程的思想來編程。
13. 裝飾器
之前在知乎上看到一個定義,感覺很有趣:
裝飾器就是把一個猴子,塞入煉丹爐,然後就出來一個還是會吃桃子,但有火眼金睛的猴子;還是原來的猴子,但多了特效技能。
裝飾器可以實現多個函數共同所需的功能。比如打印函數調用時的時間
import time
def decorator(func):
def wrapper():
print(time.time())
func()
return wrapper
def f1():
print("It's a function.")
f = decorator(f1)
f()
=============================
1581582542.4673233
It's a function.
一種更簡潔的方式:使用@符號。
@decorator
def f1():
print("It's a function.")
f1()
==========================
1581582586.7955282
It's a function.
如果你的函數是含有參數的話,在wrapper中也要傳入參數,而且若多個函數的參數個數不同,則wrapper應傳入可變參數列表:
def decorator(func):
def wrapper(*args):
print(time.time())
func(*args)
return wrapper
如果你的函數還含有關鍵字參數"**kwargs"的話,則wrapper中還要添加“**kwargs”參數。
def decorator(func):
def wrapper(*args, **kwargs):
print(time.time())
func(*args, **kw)
return wrapper
@decorator
def f2(name1, name2, **kwargs):
print(name1, name2)
print(kw)
f2('name1', 'name2', a=1, b=2)
============================
1581584784.625067
name1 name2
{'a': 1, 'b': 2}
上述的decorator就是最終裝飾器定義的格式。
另外,一個函數可以使用不止一個裝飾器。
====================================================
Python3的筆記就寫到這裏了,如果對各位有幫助的話,請動動小手給個贊吧。