for(二)

現在我們總結一下for 後面可以跟的對象A的具體類型。
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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章