2015-11-01 64 views
1

我這樣做是爲了更好地理解iter()next()方法。創建一個反轉迭代器的函數

所以我理解這一點很容易被這樣使用一些內置插件完成:

>>>animal = 'cat' 
>>>print(list(reversed(animal))) 
['t','a','c'] 

但是,這也可以完成創建一個類迭代:

class Reverselist(): 
    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] 

    def intolist(self): 
     self.test = [i for i in self] 
     return self.test 

rev = Reverselist('cat') 
print(rev.intolist()) 

['t','a','c'] 

不過,我在做同樣的事情時遇到了一些麻煩,但使用功能而不是去執行OOO路線。

有沒有辦法做到這一點與功能使用iter()next()方法,而不必求助於理解和循環?

+2

你是什麼意思「使用函數」?它應該很容易將自己的反向列表迭代器作爲生成器函數,但是您至少需要一個循環(或者'while index> 0'或'for index in range(len(lst)-1, - 1,-1)')。 – Blckknght

+1

不要混淆迭代器和迭代器。迭代器不一定必須生成有限序列,因此沒有最後一個元素開始。 – chepner

回答

1

您可以用generator function做到這一點:

def reverse_list(seq): 
    for index in range(len(seq)-1, -1, -1): 
     yield seq[index] 

調用此函數將產生一個「生成對象」,支持iter()next()

>>> rev = reverse_list('cat') 
>>> rev 
<generator object reverse_list at 0x10a93ebe0> 
>>> next(rev) 
't' 
+0

感謝您的回答。我更明確地使用'iter()'和'next()'來實現這一點。我明白這使得它比應該更困難。 – dyao

+0

@bLunt如果你想顯式指定'iter()'和'next()'的行爲,那麼用你最初的方法用'__iter__'和'__next__'方法定義一個對象。 – augurar