2017-08-28 101 views
5

这里是我的代码:的Python:迭代器返回无

class Prizes(object): 
    def __init__(self, purchases, n, d): 
     self.p = purchases 
     self.n = n 
     self.d = d 
     self.x = 1 

    def __iter__(self): 
     return self 

    def __next__(self): 
     print(self.x) 

     if self.x % self.n == 0 and self.p[self.x - 1] % self.d == 0: 
      self.x = self.x + 1 
      return self.x - 1 
     elif self.x > len(self.p): 
      raise StopIteration 

     self.x = self.x + 1 

def superPrize(purchases, n, d): 
    return list(Prizes(purchases, n, d)) 

用法的例子:

superPrize([12, 43, 13, 465, 1, 13], 2, 3) 

输出应该是:

[4] 

但实际输出为

[None, None, None, 4, None, None]. 

为什么会发生?

+3

你的问题是你的'__next__'的实现。当Python调用'__next__'时,它总会期望返回值。然而,就你而言,看起来你可能并不总是每个呼叫都有一个返回值。因此,Python使用函数的默认返回值 - 'None'。 –

+1

制作这个'Prizes'迭代器有什么意义? –

+2

另外,我想补充一句,你在这里问你的第一个问题做得很好。你做的一切都正确。您提供了[mcve],发布了您的预期输出,并将您的实际内容发布出去。正因为如此,你得到了(希望)有用的答案。恭喜。 –

回答

2

你的问题是你的执行__next__。当Python调用__next__,时,它总会期望返回值。然而,就你而言,看起来你可能并不总是每个电话都有一个返回值。因此,Python使用函数的默认返回值 - None

您需要某种方法来保持程序控制在__next__之内,直到您有实际的返回值。这可以使用while -loop:

def __next__(self): 
    while True: 
     if self.x % self.n == 0 and self.p[self.x - 1] % self.d == 0: 
      self.x = self.x + 1 
      return self.x - 1 
     elif self.x > len(self.p): 
      raise StopIteration 
     self.x = self.x + 1 
+0

请问为什么这是低票?如果落后者能够与我的答案分享担忧,我会真诚地感谢他。谢谢。 –

+1

我猜想,因为代码明智,它'是一个稍微旧的答案的确切副本 – Eric

+1

我没有downvoted(完全相反),但它可能是因为代码部分是相同的其他答案。这是一个很好的答案,尤其是因为它实际解释了发生的事情以及为什么而不仅仅是“这里是代码”的答案。 – MSeifert

1

while包裹它,这样你的方法不返回一个值,直到你找到一个:

def __next__(self): 
    while True: 
     if self.x % self.n == 0 and self.p[self.x - 1] % self.d == 0: 
      self.x = self.x + 1 
      return self.x - 1 
     elif self.x > len(self.p): 
      raise StopIteration 

     self.x = self.x + 1 

事情迭代器调用__next__期待它返回一个值的工作,但该方法返回一个值只在一个条件下,否则它到达该方法的结尾,并返回None