前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 3.x自定义迭代器对象

Python 3.x自定义迭代器对象

作者头像
24K纯开源
发布2018-01-18 10:11:42
6080
发布2018-01-18 10:11:42
举报
文章被收录于专栏:24K纯开源24K纯开源

Python 3.x与Python 2.x之间存在着较多的语法细节差异。今天在看Python核心编程的时候,说到了自定义迭代器对象。于是动手将源码打了一遍,原书代码如下:

代码语言:javascript
复制
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,版本差异使得该状况得以发生。还是得动手,不然这样的差异无法得知。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013-09-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档