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

时间:2022-04-22
本文章向大家介绍Python 3.x自定义迭代器对象,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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