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