裝飾器(本質:函數)
定義:爲其他函數添加附加功能(裝飾器對於被裝飾函數是“透明的”、“不存在的”);執行過程:調用被裝飾函數實際上是調用修飾函數
原則:
不能修改被裝飾函數的源代碼;
不能修改被裝飾函數的調用方式。
實現裝飾器的知識補充:
函數即“變量”:
調用前先定義(即要先有內存地址空間、函數的執行順序)
可賦值給其他函數名
高階函數
條件一:一個函數名(被裝飾的函數)當作實參傳給另一個函數(裝飾函數);(滿足原則一不修改被裝飾函數的源代碼)
條件二:返回值中包含函數名(裝飾函數)。(滿足原則二不修改被裝飾函數的調用方式)
函數嵌套
舉例:
統計運行時間的裝飾器
頁面登錄認證
生成器
創建一個包含100萬個元素的列表,不僅佔用很大的存儲空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素佔用的空間都白白浪費了。
而生成器節省大量的空間,因爲生成器只有在調用時纔會生成相應的數據。
知識補充:
列表生成式(列表解析):
斐波那契數列:
生成器特點:
生成器只有在調用時纔會生成相應的數據
只記錄當前位置,用到哪記錄到哪
只有一個方法__next__(),python2 爲next()
生成器的實現:
方法一:列表生成式。
方法二:在函數定義中包含yield關鍵字。
獲取生成器的值:
使用__next__()
for、while循環
應用:
當使用__next__()獲取生成器的值的數量超過總的數量時:
在單線程實現併發運算的效果(攜程??)
補充:send()用於給yield傳值,但是send傳值時,要求生成器已執行到yield語句處(就是send前面至少要有一個__next__(),這樣才能保證生成器運行到yield處
這時,這個函數就不再是一個普通函數,首次調用__next__()的時候執行生成器函數,遇到yield語句時返回,再次執行(__next__()或send()或for、while等)時將從上次返回的yield語句處繼續執行。
迭代器
Iterable對象:可以直接作用於for循環的對象統稱爲可迭代對象
集合數據類型,如list、tuple、dict、set、str等;
生成器generator,包括帶yield的generator function。
內置函數:map()、filter()、zip(a,b)
Iterator對象:可以被next()函數調用並不斷返回下一個值的對象稱爲迭代器對象
生成器generator
內置函數:map()、filter()、zip(a,b)
判斷一個對象是否是Iterable對象:
判斷一個對象是否是Iterator對象:
把Iterable對象變成Iterator對象:
你可能會問,爲什麼list、dict、str等數據類型不是Iterator?
這是因爲Python的Iterator對象表示的是一個數據流,Iterator對象可以被next()函數調用並不斷返回下一個數據,直到沒有數據時拋出StopIteration錯誤。可以把這個數據流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函數實現按需計算下一個數據,所以Iterator的計算是惰性的,只有在需要返回下一個數據時它纔會計算。
Iterator甚至可以表示一個無限大的數據流,例如全體自然數。而使用list是永遠不可能存儲全體自然數的。
補充:
Python的for循環本質上就是通過不斷調用next()函數實現的,例如: