Python:迭代器返回None

5
这是我的代码:
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].

为什么会发生这种情况?

4
你的问题在于 __next__ 的实现。当 Python 调用 __next__ 时,它总是期望一个返回值。但是在你的情况下,似乎并不是每次都有返回值。因此,Python 使用函数的默认返回值——None - Christian Dean
2
制作这个Prizes迭代器的意义是什么? - juanpa.arrivillaga
3
顺便说一句,你在这里提出了一个很好的第一个问题,做得非常正确。你提供了一个最小可复现示例(MCVE),发布了你期望的输出结果,并发布了实际的输出结果。由于这些,你得到了(希望如此)有用的答案。恭喜。 - Christian Dean
2个回答

3
你的问题在于你对__next__方法的实现。当Python调用__next__方法时,它总是期望返回一个值。然而,在你的情况下,看起来你可能不总是有一个返回值。因此,Python会使用函数的默认返回值- None
你需要一些方法来保持程序控制在__next__方法内部,直到你真正有一个返回值。这可以使用一个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

2
我可以问一下为什么这个回答被踩了吗?如果踩的人能够与我分享他们的担忧,我会非常感激。谢谢。 - Christian Dean
2
我猜是因为从代码上看,它与稍早的答案完全重复。 - Eric
2
我没有给它点反对(恰恰相反),但可能是因为代码部分与其他答案相同。这是一个很好的答案,特别是因为它实际上解释了发生了什么以及原因,而不仅仅是“这是代码”答案。 - MSeifert
@MSeifert 嗯,如果是这个原因,我猜我没什么办法。我想人们只是看到了相同的代码并投了反对票。实际上,我曾经在考虑是否要发布一个答案,因为另一个答案与我的代码相同,尽管我稍微晚写了一些。 - Christian Dean
@Eric 是的。我不想说,但我已经想到了。我在对MSeifert的评论中稍微扩展了一下。 - Christian Dean
显示剩余2条评论

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接