【问题标题】:Python: Iterator returns NonePython:迭代器返回无
【发布时间】:2018-02-05 05:07:14
【问题描述】:

这是我的代码:

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].

为什么会这样?

【问题讨论】:

  • 您的问题是您对__next__ 的实现。当 Python 调用 __next__ 时,它总是期望返回值。但是,在您的情况下,看起来您可能并不总是每次调用都有返回值。因此,Python 使用函数的默认返回值 - None
  • 制作这个Prizes迭代器有什么意义?
  • 另外,我可以补充一下,您在这里提出的第一个问题做得很好。你做的一切都是正确的。您提供了minimal reproducible example,发布了您的预期输出,并发布了您的实际输出。正因为如此,你得到了(希望)有用的答案。恭喜。

标签: python class iterator generator nonetype


【解决方案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

【讨论】:

    【解决方案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
    

    【讨论】:

    • 请问为什么这被否决了?如果反对者可以与我的回答分享担忧,我将非常感激。谢谢。
    • 我猜是因为在代码方面,它是一个稍微旧的答案的完全副本
    • 我没有投反对票(恰恰相反),但这可能是因为代码部分与其他答案相同。这是一个很好的答案,尤其是因为它实际上解释了正在发生的事情以及原因,而不仅仅是“这里是代码”的答案。
    • @MSeifert 呃,如果这是原因,我想我对此无能为力。我猜人们只是看到相同的代码和否决票。我实际上是在讨论是否发布一个答案,因为另一个答案与我的代码相同,尽管我后来独立编写了相同的代码。
    • @Eric 是的。我不想这么说,但我想通了。我在对 MSeifert 的评论中进行了一些扩展。
    猜你喜欢
    • 2021-02-17
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多