1. 程式人生 > >python--迭代器與生成器

python--迭代器與生成器

寫在迭代器之前,假如我要迴圈遍歷一個列表並列印,for迴圈想必是再熟悉不過了

l = [1, 2, 3, 4]
for i in l:
    print(i)
1
2
3
4

然而for迴圈為什麼能迴圈呢,他的內部是如何實現的呢?

迭代器

迭代 可迭代的(iterable) 迭代顧名思義,一個一個取出來(操作),迴圈,遍歷怎麼說都行。 那什麼是可迭代的?相信試過字串,列表,元組,字典,集合都可以被for迴圈,我們可以用isinstance()來判斷是否是可迭代的

from collections import Iterable
print(isinstance('python', Iterable))
print(isinstance([1,2,3], Iterable))
print(isinstance({1:2,2:3}, Iterable))
print(isinstance((1,3,4,5), Iterable))
print(isinstance(100, Iterable))

True
True
True
True
False

事實確實如此,同時結果表明int型是不可迭代的。

迭代器遵循迭代器協議:必須擁有__iter__方法和__next__方法。 那怎麼用迭代器迭代呢

l = [1,2,3,4]
res = l.__iter__()
print(res.__next__())   # 從迭代器中取下一個值
print(res.__next__())
print(res.__next__())
1
2
3

__iter__方法返回一個迭代器,可以用__next__方法一個一個的取值,如果值取完了再繼續用__next__方法取值會StopIteration錯誤異常 而for迴圈取完停止,這裡沿用上面的程式碼

for i in res:
    print(i)
1
2
3
4