Python:迭代器返回None

Avo*_*yan 5 python iterator class generator nonetype

这是我的代码:

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))
Run Code Online (Sandbox Code Playgroud)

用法示例:

superPrize([12, 43, 13, 465, 1, 13], 2, 3)
Run Code Online (Sandbox Code Playgroud)

输出应该是:

[4]
Run Code Online (Sandbox Code Playgroud)

但实际输出是:

[None, None, None, 4, None, None].
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

Chr*_*ean 3

你的问题是你的实现__next__。当Python 调用时__next__它总是期望有一个返回值。但是,就您而言,每次调用似乎并不总是有返回值。因此,Python 使用函数的默认返回值 - None

您需要某种方法来将程序控制保持在内部,__next__直到获得实际的返回值。这可以使用 -loop 来完成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
Run Code Online (Sandbox Code Playgroud)

  • 我可以问为什么这被否决了吗?如果投反对票的人能够与我的回答分享他们的担忧,我将不胜感激。谢谢。 (2认同)
  • 我猜是因为从代码角度来说,它是一个稍微旧的答案的精确副本 (2认同)
  • 我没有投反对票(恰恰相反),但这可能是因为代码部分与其他答案相同。这是一个很好的答案,特别是因为它实际上解释了正在发生的事情以及原因,而不仅仅是“这里是代码”的答案。 (2认同)