Python概念之裝飾器、叠代器、生成器
裝飾器、叠代器、生成器均屬於函數知識範疇
1.裝飾器
理解裝飾器,首先要了解閉包函數。
閉包函數:1、定義在函數內部的函數;
2、該函數的函數體代碼包含對外部作用域(而不是全局作用域)名字的引用;
3、通常將閉包函數用return返回,然後可以任意調用。
eg:以下代碼中inner()即閉包函數
def outer():
x=1
def inner():
print(x)
return inner
f=outer()
裝飾器:即是一種閉包函數的應用。
什麽是裝飾器?:裝飾它人的器具,本身可以是任意可調用對象,被裝飾者也可以是任意可調用對象。
裝飾器的原則:1、不修改被裝飾對象的源代碼 2、不修改被裝飾對象的調用方式
裝飾器的目標:在遵循1和2的前提下,為被裝飾對象添加上新功能
import time def timmer(func): def inner(): start=time.time() res=func() stop=time.time() print(‘run time is %s‘ %(stop-start)) return res return inner @timmer #index=timmer(index)def index(): time.sleep(1) print(‘welecome to index‘) return 1111 res=index() print(res)
2.叠代器
叠代器:叠代器即叠代的工具。
什麽是叠代?:指的是一個重復的過程,每一次重復稱為一次叠代,並且每一次重復的結果是下一次重復的初始值
為什麽要有叠代器?:對於序列類型:str,list,tuple,可以依賴索引來叠代取值,但是對於dict,set,文件,python必須為我們提供一種不依賴於索引的叠代取值的方式-》叠代器
什麽是可叠代對象?:可叠代對象指的是內置有__iter__方法的對象,即obj.__iter__,如下
‘hello‘.__iter__
(1,2,3).__iter__
[1,2,3].__iter__
{‘a‘:1}.__iter__
{‘a‘,‘b‘}.__iter__
open(‘a.txt‘).__iter__
什麽是叠代器對象?:可叠代對象執行obj.__iter__()得到的結果就是叠代器對象,而叠代器對象指的是即內置有__iter__又內置有__next__方法的對象
文件類型是叠代器對象:
open(‘a.txt‘).__iter__()
open(‘a.txt‘).__next__()
註意:叠代器對象一定是可叠代對象,可叠代對象不一定是叠代器對象。
eg:
d={‘name‘:‘lili‘,‘age‘:‘18‘,‘sex‘:‘male‘} d_iter=iter(d) # d_iter=iter(d) while True: try: print(next(d_iter)) except StopIteration: break
優點:
提供一種統一的、不依賴於索引的取值方式
叠代器同一時間在內存只有一個值,更節省內存
缺點:
只能往後取,並且是一次性的
不能統計值的個數,即長度
3.生成器
什麽是生成器?:只要在函數體內出現yield關鍵字,那麽再執行函數就不會執行函數代碼,會得到一個結果,該結果就是生成器
生成器就是叠代器
def func(): print(‘=====>1‘) yield 1 print(‘=====>2‘) yield 2 print(‘=====>3‘) yield 3 g=func()# g.__iter__ res1=next(g) print(res1) res2=next(g) print(res2) res3=next(g) print(res3)
yield的功能:
1、yield為我們提供了一種自定義叠代器對象的方法
2、yield與return的區別1:yield可以返回多次值 #2:函數暫停與再繼續的狀態是由yield幫我們保存的
Python概念之裝飾器、叠代器、生成器