【问题标题】:Exception handling in Pyhon generator functionPython生成器函数中的异常处理
【发布时间】:2020-08-17 10:32:44
【问题描述】:

我必须创建 Python 函数生成器,它应该返回正数的所有除数。 如果没有除数,left 函数应该返回 None。 这样做:

def divisor(num):
    try:
        final = (x for x in range(1, num + 1) if num / x == int(num / x))
    except StopIteration:
        return None
    else:
        return final

得到这样的结果:

three = divisor(3)
next(three) => 1
next(three) => 3

但是当我再调用一次函数时,得到StopIteration错误:

next(three) =>
Traceback (most recent call last):
 ...
StopIteration

为什么不处理 StopIteration?我究竟做错了什么?如何解决?

【问题讨论】:

  • 您不应该使用yield 而不是return 吗?
  • 您的问题强调“生成器函数”,但您没有生成器函数:您有一个使用return 的普通函数。生成器函数必须使用yield。但是,您返回的东西 (final) 是一个生成器表达式。这是你的意图吗?
  • 我认为生成器表达式可以让我将函数用作生成器函数。我错了吗?

标签: python exception generator


【解决方案1】:

发生这种情况是因为该函数不是生成器。这是一个常规函数,在第一次调用时从 final 变量返回生成器。在这种情况下,最好的解决方案是将函数转换为实际的生成器并完全省略错误处理:

def divisor(num):
    for x in range(1, num + 1):
        if num / x == int(num / x):
            yield x
    while True:
        yield None

【讨论】:

  • 另外,一个小注解:如果num 是一个整数,你可以使用num % x == 0 而不是num / x == int(num / x)
猜你喜欢
  • 2021-11-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-07
  • 2013-11-20
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
相关资源
最近更新 更多