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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值