'''
1 迭代器協議是指 : 對象必須提供一個next方法,執行改方法要不返回迭代中的下一項;要不引發一個Stopliteration異常,以終止迭代(只能日後不能往前退)
2 可迭代對象 : 實現了迭代器協議的對象(如何實現:對象內部定義了一個__iter__()方法,把對象變成一個可迭代對象,遵循迭代器協議)迭代器就是可迭代對象
3 協議是在一種約定,可迭代對象實現了迭代器協議,python的內部工具(如for,sum,min,max函數等)使用迭代器協議訪問對象
python 中只要遵循迭代器協議生成對象就是可迭代對象
for 循環本質:就是循環全部對象,所有都是使用迭代器協議.
'''
'''
不少人都會想,for循環本質就是遵循迭代器協議去訪問對象,那麼for循環對象確定都有迭代器了啊,沒錯
那既然這樣,for循環能夠遍歷(字符串,字典,元祖,列表,集合,文件對象),那麼這些類型的數據均可迭代對象?
可是,爲何定義個一列表ls = [1,2,3,4],並無ls.next()方法啊,這是爲何?
其實:(字符串,字典,元祖,列表,集合,文件對象) 這些都不是可迭代對象,只不過for循環的時候,調用他們內部的__iter__方法;
把他們變成了可迭代對象,而後for循環調用可迭代對象的__next__方法取值,並且for循環會捕捉Stopliteration異常,以終止迭代
'''
ls = [1,3,9] print(ls.__iter__()) #<list_iterator object at 0x050B11B0> 遵循迭代器協議,轉換成可迭代對象;列表可迭代對象
ls = ls.__iter__() print(ls.__next__()) # 1
print(ls.__next__()) # 3
print(ls.__next__()) # 9 #print(ls.__next__()) # StopIteration
l = [133,3333,933] r = l.__iter__() print(next(r)) print(next(r)) print(next(r)) #python 內置next()方法 其實就是在調用 r.__next__()方法
#for循環原理
for i in [1,2,3]: #i = i.__iter__() i.__next__()
print(i)