1. 程式人生 > >python第五章:三大利器(裝飾器,叠代器,生成器)--小白博客

python第五章:三大利器(裝飾器,叠代器,生成器)--小白博客

博客 單點 comment ron () urn tro sequence 要求

  叠代器是訪問集合元素的一種方式。叠代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。叠代器只能往前不會後退。

延遲計算或惰性求值 (Lazy evaluation)

  叠代器不要求你事先準備好整個叠代過程中所有的元素。僅僅是在叠代至某個元素時才計算該元素,而在這之前或之後,元素可以不存在或者被銷毀。這個特點使得它特別適合用於遍歷一些巨大的或是無限的集合。

可叠代對象

  叠代器提供了一個統一的訪問集合的接口。只要是實現了__iter__()或__getitem__()方法的對象,就可以使用叠代器進行訪問。

  序列:字符串、列表、元組

  非序列:字典、文件

  自定義類:用戶自定義的類實現了__iter__()或__getitem__()方法的對象

叠代器對象

什麽是叠代器對象?
目標有.__iter__()方法並且有.__next__方法的叫做叠代器對象
f.__next__()

創建叠代器對象

  使用內建的工廠函數iter(iterable)可以獲取叠代器對象:

  語法:

    iter(collection) -> iterator

    iter(callable,sentinel) -> iterator

  說明:

    Get an iterator from an object.

    In the first form, the argument must supply its own iterator, or be a sequence.

    In the second form, the callable is called until it returns the sentinel.

  實例展示:

技術分享圖片
 1 使用對象內置的__iter__()方法生成叠代器
 2 >>>L1 = [1,2,3,4,5,6]
 3 >>>I1 = L1.__iter__()
 4 >>>print I1
 5 <listiterator object at 0x7fe4fd0ef550>
 6 >>> I1.next()
 7 1
 8 >>> I1.next()
 9 2
10 >>> I1.next()
11 3
技術分享圖片 技術分享圖片
 1 使用內置工廠函數生成叠代器
 2 >>> L1 = [1,2,3,4,5,6]
 3 >>> I2 = iter(L1)
 4 >>> print I2
 5 <listiterator object at 0x7fe4fd0ef610>
 6 >>> I2.next()
 7 1
 8 >>> I2.next()
 9 2
10 >>> I2.next()
11 3
技術分享圖片

說明:

  for循環可用於任何可叠代對象

  for循環開始時,會通過叠代協議傳輸給iter()內置函數,從而能夠從叠代對象中獲得一個叠代器,返回的對象含有需要的next()方法。

#總結:叠代器對象一定是可叠代對象,可叠代對象不一定是叠代器對象

python生成器

在 Python 中,使用了 yield 的函數被稱為生成器(generator)。

跟普通函數不同的是,生成器是一個返回叠代器的函數,只能用於叠代操作,更簡單點理解生成器就是一個叠代器。

在調用生成器運行的過程中,每次遇到 yield 時函數會暫停並保存當前所有的運行信息,返回 yield 的值, 並在下一次執行 next() 方法時從當前位置繼續運行。

調用一個生成器函數,返回的是一個叠代器對象。

以下實例使用 yield 實現斐波那契數列:

實例(Python 3.0+)

#!/usr/bin/python3 import sys def fibonacci(n): # 生成器函數 - 斐波那契
#!/usr/bin/python3
 
import sys
 
def fibonacci(n): # 生成器函數 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n): 
            return
        yield a
        a, b = b, a + b
        counter += 1
f = fibonacci(10) # f 是一個叠代器,由生成器返回生成
 
while True:
    try:
        print (next(f), end=" ")
    except StopIteration:
        sys.exit()

執行以上程序,輸出結果如下:

0 1 1 2 3 5 8 13 21 34 55



python第五章:三大利器(裝飾器,叠代器,生成器)--小白博客