1. 程式人生 > >關於裝飾器、叠代器、生成器以及其它一些內容的整理

關於裝飾器、叠代器、生成器以及其它一些內容的整理

惰性 12px === span 字典 first rst 原則 引用

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.閉包的意義

  返回的函數對象,不僅僅是一個函數對象,在該函數外還包裹了一層作用域,這使得,該函數無論在何處調用,優先使用自己外層包裹的作用域

關於裝飾器、叠代器、生成器以及其它一些內容的整理