天天看點

python-疊代器與生成器

  1. 疊代器對象從集合的第一個元素開始通路,直到所有的元素被通路完結束。疊代器隻能往前不會後退。
  2. 疊代器有兩個基本的方法:iter() 和 next()。
  3. 字元串,清單或元組對象都可用于建立疊代器

eg:

list = [1,2,3,4]

it = iter(list)
print(next(it))      
python-疊代器與生成器

如果繼續print:

print(next(it))      
python-疊代器與生成器

疊代器對象可以使用正常for語句進行周遊:

#!/usr/bin/python3
 
list=[1,2,3,4]
it = iter(list)   
for x in it:
    print (x, end=" ")      
python-疊代器與生成器

也可以使用 next() 函數:

import sys 

list = [1, 2, 3, 4]
it = iter(list) 

while True:
    try:
        print(next(it),end = " ")
    except StopIteration:
        sys.exit()      

注:sys.exit([arg]): 程式中間的退出,arg=0為正常退出

建立一個疊代器

建立一個傳回數字的疊代器,初始值為 1,逐漸遞增 1:

class MyNumbers:
    def __iter__(self):
        self.a = 1
        return self

    def __next__(self):
        x = self.a
        self.a += 1
        return x


myclass = MyNumbers()
myiter = iter(myclass)

print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))      

看運作結果:

python-疊代器與生成器

StopIteration

StopIteration 異常用于辨別疊代的完成,防止出現無限循環的情況,在 next() 方法中我們可以設定在完成指定循環次數後觸發 StopIteration 異常來結束疊代

eg:

在 20 次疊代後停止執行:

class MyNumbers:
    def __iter__(self):
        self.a = 1
        return self

    def __next__(self):
        if self.a <= 20:
            x = self.a
            self.a += 1
            return x
        else:
            raise StopIteration

myclass = MyNumbers()
myiter = iter(myclass)

for x in myiter:
    print(x,end=" ")      

運作結果:

生成器

  1. 在 Python 中,使用了 yield 的函數被稱為生成器(generator)。
  2. 跟普通函數不同的是,生成器是一個傳回疊代器的函數,隻能用于疊代操作
  3. 在調用生成器運作的過程中,每次遇到 yield 時函數會暫停并儲存目前所有的運作資訊,傳回 yield 的值, 并在下一次執行 next() 方法時從目前位置繼續運作
  4. 調用一個生成器函數,傳回的是一個疊代器對象。
import sys

def fibonacci(n):
    a,b,c = 0,1,0
    while True:
        if c > n :
            return
        yield a
        a,b = b ,a + b
        c += 1

f = fibonacci(10)

while True:
    try:
        print(next(f),end=" ")
    except StopIteration:
        sys.exit()      

繼續閱讀