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

  • 相关阅读:
    block iOS 块
    面试有感
    Could not automatically select an Xcode project. Specify one in your Podfile like so
    xcrun: error: active developer path
    NSDictionary
    CSS3魔法堂:CSS3滤镜及Canvas、SVG和IE滤镜替代方案详解
    转:CSS盒模型
    转:手机端html5触屏事件(touch事件)
    转: div:给div加滚动条 div的滚动条设置
    转:什么时候用阻止事件冒泡
  • 原文地址:https://www.cnblogs.com/csuftzzk/p/3310220.html
Copyright © 2020-2023  润新知