python中幾個概念彙總
列表生成式
>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
寫列表生成式時,把要生成的元素x * x
放到前面,後面跟for
迴圈。
還可以使用兩層迴圈,可以生成全排列:
>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
生成器
生成器和列表生成式的區別僅在於最外層的 []
和 ()
。[]
表示列表生成式,()
表示生成器。
列表生成式是直接一次性生成一個列表,生產器(generator)是邊迴圈邊計算的機制,用函式 next()
從 generator 中取值,generator 本身儲存的是一個演算法。
迭代器
可以直接作用於
for
迴圈的物件統稱為可迭代物件:Iterable
。可迭代物件不一定是迭代器,迭代器一定是可迭代物件!可迭代物件可以用
iter()
函式轉換為迭代器。可以使用函式
isinstance()
判斷一個物件是否是可迭代(iterable)物件
凡是可作用於next()
函式的物件都是Iterator
型別,它們表示一個惰性計算的序列;
生成器都是Iterator
物件,但list
、dict
str
雖然是Iterable
,卻不是Iterator
。
把list
、dict
、str
等Iterable
變成Iterator
可以使用iter()
函式。
裝飾器
在理解裝飾器之前,先明白在python的世界裡,一切皆物件!即,函式本身也是一個物件。
裝飾器本質上是一個 Python 函式或類,它可以讓其他函式或類在不需要做任何程式碼修改的前提下增加額外功能,裝飾器的返回值也是一個函式/類物件。
**用途: ** 它經常用於有切面需求的場景,比如:插入日誌、效能測試、事務處理、快取、許可權校驗等場景,裝飾器是解決這類問題的絕佳設計。有了裝飾器,我們就可以抽離出大量與函式功能本身無關的雷同程式碼到裝飾器中並繼續重用。概括的講,裝飾器的作用就是為已經存在的物件新增額外的功能。
@ 語法糖: @ 符號就是裝飾器的語法糖,它放在函式開始定義的地方,這樣就可以省略最後一步再次賦值的操作。
匿名函式
參考:匿名函式詳解
python 使用 lambda 來建立匿名函式。
lambda這個名稱來自於LISP,而LISP則是從lambda calculus(一種符號邏輯形式)取這個名稱的。 在Python中,lambda作為一個關鍵字,作為引入表示式的語法。相比較
def
函式,lambda
是單一的表示式,而不是語句塊!
所謂匿名,意即不再使用 def 語句這樣標準的形式定義一個函式。
- lambda 只是一個表示式,函式體比 def 簡單很多。
- lambda的主體是一個表示式,而不是一個程式碼塊。僅僅能在lambda表示式中封裝有限的邏輯進去。
- lambda 函式擁有自己的名稱空間,且不能訪問自己引數列表之外或全域性名稱空間裡的引數。
- 雖然lambda函式看起來只能寫一行,卻不等同於C或C++的行內函數,後者的目的是呼叫小函式時不佔用棧記憶體從而增加執行效率。
語法
lambda 函式的語法只包含一個語句,如下:
lambda [arg1 [,arg2,.....argn]]:expression
# lambda 引數列表:return [表示式] 變數
# 由於lambda返回的是函式物件(構建的是一個函式物件),所以需要定義一個變數去接收
以map()
函式為例,計算f(x)=x2時,除了定義一個f(x)
的函式外,還可以直接傳入匿名函式:
>>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
[1, 4, 9, 16, 25, 36, 49, 64, 81]
關鍵字lambda
表示匿名函式,冒號前面的x
表示函式引數。
匿名函式有個限制,就是隻能有一個表示式,不用寫return
,返回值就是該表示式的結果。
匿名函式也是一個函式物件,也可以把匿名函式賦值給一個變數,再利用變數