關於裝飾器、叠代器、生成器以及其它一些內容的整理
1.裝飾器
為什麽要使用裝飾器?
答:開放封閉原則:對修改封閉,對擴展開放
裝飾器實現的兩個要求:
1.裝飾器不能修被裝飾對象的源碼
2.裝飾器不能修改被裝飾對象的調用方式
裝飾器的目標:在遵循1和2的前提下,為被裝飾對象添加上新功能
裝飾器語法:
被裝飾函數的正上方,單獨一行 @deco1 @deco2 @deco3 def foo(): pass foo=deco1(deco2(deco3(foo)))
2.叠代器
1.叠代的概念
叠代器即叠代的工具,那什麽是叠代呢?叠代是一個重復的過程,每次重復即一次叠代,並且每次叠代的結果都是下一次叠代的初始值 while True: 只是單純地重復,因而不是叠代。
2.為何要有叠代器?
對於序列類型:字符串、列表、元組,我們可以使用索引的方式叠代取出其包含的元素。但對於字典、集合、文件等類型是沒有索引的,若還想取出其內部包含的元素,則必須找出一種不依賴於索引的叠代方式,這就是叠代器
3.什麽是可叠代對象?
可叠代對象指的是內置有__iter__方法的對象,即obj.__iter__
4.什麽是叠代器對象?
可叠代對象執行obj.__iter__()得到的結果就是叠代器對象
而叠代器對象指的是即內置有__iter__又內置有__next__方法的對象
5.叠代器的使用
dic={‘a‘:1,‘b‘:2,‘c‘:3} iter_dic=dic.__iter__() #得到叠代器對象,叠代器對象即有__iter__又有__next__,但是:叠代器.__iter__()得到的仍然是叠代器本身 iter_dic.__iter__() is iter_dic #True print(iter_dic.__next__()) #等同於next(iter_dic) print(iter_dic.__next__()) #等同於next(iter_dic) print(iter_dic.__next__()) #等同於next(iter_dic) # print(iter_dic.__next__()) #拋出異常StopIteration,或者說結束標誌 #有了叠代器,我們就可以不依賴索引叠代取值了 iter_dic=dic.__iter__() while 1: try: k=next(iter_dic) print(dic[k]) except StopIteration: break
6.叠代器的優缺點
優點:
- 提供一種統一的、不依賴於索引的叠代方式
- 惰性計算,節省內存
缺點:
- 無法獲取長度(只有在next完畢才知道到底有幾個值)
- 一次性的,只能往後走,不能往前退
3.生成器
1.什麽是生成器
只要函數內部包含有yield關鍵字,那麽函數名()的到的結果就是生成器,並且不會執行函數內部代碼
def func(): print(‘====>first‘) yield 1 print(‘====>second‘) yield 2 print(‘====>third‘) yield 3 print(‘====>end‘) g=func() print(g) #<generator object func at 0x0000000002184360>
2.生成器就是叠代器
g.__iter__ g.__next__ #2、所以生成器就是叠代器,因此可以這麽取值 res=next(g) print(res)
3.生成器也可以通過生成表達式來定義
4.閉包
1.什麽是閉包
內部函數包含對外部作用域而非全局作用域的引用
2.閉包的意義
返回的函數對象,不僅僅是一個函數對象,在該函數外還包裹了一層作用域,這使得,該函數無論在何處調用,優先使用自己外層包裹的作用域
關於裝飾器、叠代器、生成器以及其它一些內容的整理