python 3.x與python 2.x之間存在著較多的語法細節差異。今天在看python核心程式設計的時候,說到了自定義迭代器物件。於是動手將原始碼打了一遍,原書**如下:
class我機器上裝的是python 3.3.2,在控制台執行該指令碼的時候直接丟擲異常typeerror: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
defnext(self, count=1):
"""return arbitrary numbers of elements
"""retval =
for item in
range(count):
try:
next
())
except
stopiteration:
ifself.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)))
說是iter()返回的是乙個非迭代器型別的物件。前後對照了一下,並沒有發現**有錯誤啊。於是嘗試使用ipython(python 版本是2.7.5)來執行該**,得出完美結果。於是考慮是不是版本的問題。求助google,在stackoverflow上找到乙個帖子,找到了關鍵原因:
於是將上述**中呼叫next()的地方全部替換為__next__(),最後在控制台執行該**,正確得到了預期的結果:
查閱python 3.3.2 附帶的使用者手冊,果然得到如下結果:
問題得到解決:python核心程式設計使用的是python 2.x,版本差異使得該狀況得以發生。還是得動手,不然這樣的差異無法得知。
Python3 x 迭代器 yield用法
迭代器有兩個重要部分 1.iter 用來獲取迭代器物件 2.next 獲取容器內下乙個元素 斐波列數列 1 1 2 3 5 8 等於前兩個數相加。class fab object 建構函式 def init self,max self.max max self.n,self.a,self.b 0,0...
開發自定義python 迭代器
class test object def init self,data iter,stop self.data iter data iter self.stop stop self.start 0 def iter self return self def next self self.start...
C 自定義迭代器
讓我們在示例中看乙個簡單迭代器型別的定義。我們定義乙個類模板,用來表示一段數值型別值,也可以生成指定範圍的開始和結束迭代器。這個迭代器也是模板型別,兩個模板都定義在同乙個標頭檔案 numeric range.h 中。下面是 numeric range模板的定義 template class nume...