Python 3.x自定義迭代器物件

24K純開源發表於2013-09-09

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,版本差異使得該狀況得以發生。還是得動手,不然這樣的差異無法得知。

相關文章