现在我们总结一下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
如果是一个对象想要迭代的话,两种方式:
1:在类中定义一个__iter__()方法,返回自己;然后再定义一个__next__()方法,return想要的值,从而实现当对这个对象调用next(A)的时候,执行的就是A对象中的__next__()
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