2017-04-07 47 views
0

有人可以解釋__next__如何處理下面的代碼嗎?我知道'下一個'用於迭代器來獲取可迭代的下一個項目,通常與next()Iterables/generators說明

我知道__iter__部分得到執行,因爲list()調用執行__next__。但__next__繼續執行,幾乎像一個while循環?直到StopIteration被執行?

此外,所有'返回'元素存儲在__next__下?是否全部存儲在內存中,直到return self根據__iter__返回給調用函數?

class FRange(object): 
    def __init__(self, start, stop=None, step=None): 
     if stop is None: 
      self.i = 0 
      self.stop = start 
      self.step = 1 
     elif step is None: 
      self.i = start 
      self.stop = stop 
      self.step = 1 
     else: 
      self.i = start 
      self.stop = stop 
      self.step = step 

    def __iter__(self): 
     return self 

    def __next__(self):        
     if self.i < self.stop and self.step > 0: 
      self.i += self.step 
      return self.i - self.step 
     elif self.i > self.stop and self.step < 0: 
      self.i += self.step 
      return self.i - self.step 
     else: 
      raise StopIteration 


def rangeFloat(args): 
    return list(FRange(*args)) 

上面的代碼產生例如:

For args = [-1.1, 2.4, 0.3], the output is 
rangeFloat(args) = [-1.1, -0.8, -0.5, -0.2, 0.1, 0.4, 0.7, 1, 1.3, 1.6, 1.9, 2.2]. 

回答

2

list基本上就像

def list(thing): 
    result = [] 
    for item in thing: 
     result.append(item) 
    return result 

for循環:

for item in thing: 
    # loop body 

作品等

iterator = iter(thing): 
while True: 
    try: 
     item = next(iterator) 
    except StopIteration: 
     break 
    # loop body 

把這些東西放在一起,list調用您FRange實例的__iter__方法來獲取一個迭代器;在這種情況下,迭代器就是您的FRange實例本身。然後它重複調用__next__並將所有__next__返回值附加到列表中,直到__next__增加StopIteration。一旦StopIteration被提出,list返回它建立的列表。

+1

應該下一個(iter)是下一個(迭代器)? – user1179317

+0

@ user1179317:的確如此。 – user2357112