python類中的__iter__, __next__與built-in的iter()函數舉例

轉載自: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

Python代碼   收藏代碼
i1 = iter(itr, 'c')  

 

這個意思是說,返回itr的iterator,並且在以後的迭代之中,迭代出來'c'就立馬中止。對這個itr有什麼要求呢?這個itr在這裏必須是callable的,即要實現__call__函數 

再說傳一個參數,有 python2.7

Python代碼   收藏代碼
i2 = iter(itr)  

 

這裏itr必須實現__iter__函數,這個函數的返回值必須返回一個iterator對象 

看例子: 函數

Python代碼   收藏代碼
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

Python代碼   收藏代碼
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

Python代碼   收藏代碼
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)  

  

輸出結果是: 對象

Python代碼   收藏代碼
__next__ called  
4  
__next__ called  
5  
__next__ called  
6  
__next__ called 

  

很簡單把。惟一須要注意下的就是__next__中必須控制iterator的結束條件,否則就死循環了。blog

相關文章
相關標籤/搜索