python3自定义迭代器对象如何用next方法依次迭代 10

如图,为什么这么写print(next(iter(diedai)))是错误的?... 如图,为什么这么写print(next(iter(diedai)))是错误的? 展开
 我来答
从空去听8
2017-07-23 · TA获得超过7439个赞
知道大有可为答主
回答量:6907
采纳率:93%
帮助的人:5586万
展开全部
Python 3.x与Python 2.x之间存在着较多的语法细节差异。今天在看Python核心编程的时候,说到了自定义迭代器对象。于是动手将源码打了一遍,原书代码如下:

class AnyIter(object):
def __init__(self, data, safe=False):
""" The initialization of iterators """
self.safe = safe
self.iter = iter(data)
def __iter__(self):
""" return a iterator """
return self
def next(self, count=1):
""" Return arbitrary numbers of elements """
retval = []
for item in range(count):
try:
retval.append(self.iter.next())
except StopIteration:
if self.safe:
break
else:
raise # reraise the exception again
return retval

if __name__ == '__main__':
a = AnyIter(range(10), True)
b = iter(a)
for item in range(1,5):
print('{}:{}'.format(item, a.next(item)))

我机器上装的是Python 3.3.2,在控制台运行该脚本的时候直接抛出异常TypeError:

说是iter()返回的是一个非迭代器类型的对象。前后对照了一下,并没有发现哪里有错误啊。于是尝试使用Ipython(Python 版本是2.7.5)来运行该代码,得出完美结果。于是考虑是不是版本的问题。求助google,在stackoverflow上找到一个帖子,找到了关键原因:

于是将上述代码中调用next()的地方全部替换为__next__(),最后在控制台运行该代码,正确得到了预期的结果:

查阅Python 3.3.2 附带的用户手册,果然得到如下结果:

问题得到解决:Python核心编程使用的是Python 2.x,版本差异使得该状况得以发生。还是得动手,不然这样的差异无法得知。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式