轉載自:https://luozhaoyu.iteye.com/blog/1513198python
適才發現以前在pydev中使用的語法檢查器是python3.2,而解釋器是python2.7……罪過罪過,今後篇以後,不出意外都是使用python3.x版本解釋器
本文主要舉例介紹python的built-in函數iter,以及類中的兩個函數__iter__,__next__。其中做爲iterator的對象是類,而不是容器(由於容器或generator做爲iterator對象很簡單,這裏很少說了)
iter函數有兩種用法,一種是傳一個參數,一種是傳兩個參數。返回的結果都是返回一個iterator對象。
先說傳兩個參數的,好比有
python3.x
i1 = iter(itr, 'c')
這個意思是說,返回itr的iterator,並且在以後的迭代之中,迭代出來'c'就立馬中止。對這個itr有什麼要求呢?這個itr在這裏必須是callable的,即要實現__call__函數
再說傳一個參數,有 python2.7
i2 = iter(itr)
這裏itr必須實現__iter__函數,這個函數的返回值必須返回一個iterator對象
看例子: 函數
class Itr(object): def __init__(self): self.result = ['a', 'b', 'c', 'd'] self.i = iter(self.result) def __call__(self): res = next(self.i) print("__call__ called, which would return ", res) return res def __iter__(self): print("__iter__ called") return iter(self.result) itr = Itr() # i1必須是callable的,不然沒法返回callable-iterator i1 = iter(itr, 'c') print("i1 = ", i1) # i2只須要類實現__iter__函數便可返回 i2 = iter(itr) print("i2 = ", i2) for i in i1: print(i) for i in i2: print(i)
輸出結果是: ui
i1 = <callable_iterator object at 0x1349710> __iter__ called i2 = <list_iterator object at 0x133a090> __call__ called, which would return a a __call__ called, which would return b b __call__ called, which would return c a b c d
能夠看到傳入兩個參數的i1的類型是一個callable_iterator,它每次在調用的時候,都會調用__cal__函數,而且最後到c就中止了。
而i2就簡單的多,itr把本身類中一個容器的迭代器返回就能夠了。
有朋友可能不滿意,對上面的例子只是爲了介紹iter()函數傳兩個參數的功能而寫,若是真正想寫一個iterator的類,須要使用__next__函數。這個函數每次返回一個值就能夠實現迭代了。 spa
class Next(object): def __init__(self, data = 1): self.data = data def __iter__(self): return self def __next__(self): print("__next__ called") if self.data > 5: raise StopIteration else: self.data += 1 return self.data for i in Next(3): print(i)
輸出結果是: 對象
__next__ called 4 __next__ called 5 __next__ called 6 __next__ called
很簡單把。惟一須要注意下的就是__next__中必須控制iterator的結束條件,否則就死循環了。blog