2016-08-21 109 views
0

究竟是什麼iter?考慮下面的代碼塊:爲什麼必須在類中使用__iter __()方法?

class Reverse: 
    def __init__(self,data): 
     self.data = data 
     self.index = len(data) 
    def __iter__(self): 
     return self 
    def next(self): 
     if self.index == 0: 
      raise StopIteration 
     self.index = self.index - 1 
     return self.data[self.index] 

省略ITER(個體)和rewritting:

class Reverse2: 
    def __init__(self,data): 
     self.data = data 
     self.index = len(data) 
    def next(self): 
     if self.index == 0: 
      raise StopIteration 
     self.index = self.index - 1 
     return self.data[self.index] 

然後:

x = [1,2,3] 
y = Reverse(x) 
z = Reverse2(x) 
y.next() 
>>> 3 
y.next() 
>>> 2 
y.next() 
>>> 1 
z.next() 
>>> 3 
z.next() 
>>> 2 
z.next() 
>>> 1 

的類行爲相同的方式而不管我是否包括iter()或不,所以我爲什麼要把它包括在第一位呢?對不起,如果我的問題不清楚 - 我只是不知道如何以更清晰的方式說明它...

回答

0

__iter__返回iterator object它允許將對象轉換爲一個容器可以通過for .. in ..迭代。

迭代器對象是定義__next__方法的任何對象,它返回下一個項目,如果存在或者提高其他項目則返回StopIteration

雖然__iter__可以返回任何這樣的迭代器對象,但如果它實現__next__方法,它可以返回自身。

例如:

class Reverse: 
    def __init__(self,data): 
     self.data = data 
     self.index = len(data) 
    def __iter__(self): 
     return self 
    def __next__(self): 
     if self.index == 0: 
      raise StopIteration 
     self.index = self.index - 1 
     return self.data[self.index] 

現在,您可以使用循環:

for xx in Reverse(x): 
    print xx 
+0

ok我明白爲什麼__iter__現在必須包含,但爲什麼我應該讓該方法返回'self'? –

1

__iter__方法總是叫,當需要一個迭代器,例如通過明確地呼叫iter或在for環路或當創建列表list(xy)

所以你不能在所有這些情況下使用你的第二類Reverse2

>>> list(Reverse("abc")) 
['c', 'b', 'a'] 
>>> list(Reverse2("abc")) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: iteration over non-sequence 

要回答在註釋的問題:__iter__ - 方法必須返回任何迭代器或實例與__next__ - 方法。只有當你的類本身是一個迭代器時,它纔會返回self。作爲迭代器返回一個生成器的示例:

class Reverse3: 
    def __init__(self,data): 
     self.data = data 
    def __iter__(self): 
     # returns an generator as iterator 
     for idx in range(len(self.data)-1, -1, -1): 
      yield self.data[idx] 
+0

好吧我明白爲什麼__iter__現在必須包含,但爲什麼我應該讓這個方法返回'自我'? –

+0

@KevinMoon:看到我的答案,但你也應該編輯你的問題。 – Daniel

相關問題