- 疊代器對象從集合的第一個元素開始通路,直到所有的元素被通路完結束。疊代器隻能往前不會後退。
- 疊代器有兩個基本的方法:iter() 和 next()。
- 字元串,清單或元組對象都可用于建立疊代器
eg:
list = [1,2,3,4]
it = iter(list)
print(next(it))
如果繼續print:
print(next(it))
疊代器對象可以使用正常for語句進行周遊:
#!/usr/bin/python3
list=[1,2,3,4]
it = iter(list)
for x in it:
print (x, end=" ")
也可以使用 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))
看運作結果:
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=" ")
運作結果:
生成器
- 在 Python 中,使用了 yield 的函數被稱為生成器(generator)。
- 跟普通函數不同的是,生成器是一個傳回疊代器的函數,隻能用于疊代操作
- 在調用生成器運作的過程中,每次遇到 yield 時函數會暫停并儲存目前所有的運作資訊,傳回 yield 的值, 并在下一次執行 next() 方法時從目前位置繼續運作
- 調用一個生成器函數,傳回的是一個疊代器對象。
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()