Python 3 x自定義迭代器物件

2022-01-17 18:00:16 字數 1608 閱讀 6396

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

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)))

我機器上裝的是python 3.3.2,在控制台執行該指令碼的時候直接丟擲異常typeerror:

說是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...