1:內置數據類型,iter(A)返回一個iterator給temp,然後每次循環就是調用next(temp)
2: generator object: iter(A)會返回自身,同時next(A)等於下一個yield後面表達式的值
3: generator object <genexpr> : iter(A)返回自身,
4: map object
5: zip object
6:range object
如果是一個對象想要迭代的話,兩種方式:
1:在類中定義一個__iter__()方法,返回自己;然後再定義一個__next__()方法,return想要的值,從而實現當對這個對象調用next(A)的時候,執行的就是A對象中的__next__()
2:在類中定義一個__iter__()方法,但是返回的是一個generator object,其實別把generator object想象的多麼神奇,它就是一個擁有yield調用的函數然後賦予特定參數。每次執行循環都是對這個函數執行到下一個yield。直到函數結束.見class ByteValue的實現方式
現在你只要發現一個對象是上面這幾種類型,你就可以對着個它就表示自己是一個迭代器,你就可以對這個對象調用next()方法,從而查看它所指向對象的序列值。
>>> string='spam'
>>> si=iter(string)
>>> si
<str_iterator object at 0xb710564c> #返回一個str_iterator object,所以你就可以用next(si)訪問字符串中的字符
>>> next(si)
's'
>>> tuple=(1,2,3)
>>> tui=iter(tuple)
>>> tui
<tuple_iterator object at 0xb710574c> #返回一個tuple_iterator object,所以你就可以用next(tui)訪問該元組包含的更小塊信息
>>> next(tui)
1
>>> def test(list):
... for i in list:
... yield i
...
>>> G=test((1,2,3))
>>> G
<generator object test at 0xb7100784> #返回一個generator object
>>> F=iter(G)
>>> F
<generator object test at 0xb7100784> #跟上面比較發現是同一個generator object
>>> next(G)
1
>>> M=(c*4 for c in 'spam')
>>> M
<generator object <genexpr> at 0xb71006bc> #返回一個generator object <genexpr>
>>> iter(M)
<generator object <genexpr> at 0xb71006bc> #跟上面的自身是一樣的
>>> next(M)
'ssss'
>>> F=map(iter,((1,2,3),(5,4),(6,7))) #map嵌套了一些元組的iterator object
>>> F
<map object at 0xb710588c>
>>> F1=next(F) #對map調用next方法,它得到的是指向第一個元組的iterator object
>>> F1
<tuple_iterator object at 0xb71058cc>
>>> next(F1) #既然F1是一個iterator object我們就可以對它進行next操作
1 #得到下一層的值
>>> F2=next(F)
>>> F2
<tuple_iterator object at 0xb710584c>
>>> next(F2)
5
>>> M=map(abs,(1,2,3)) #map裏面不再嵌套其他的迭代器對象
>>> M
<map object at 0xb710590c>
>>> next(M) #對map對象調用next方法,然後得到
1