【问题标题】:Python recursion with iterators (strange behavior)带有迭代器的 Python 递归(奇怪的行为)
【发布时间】:2020-02-29 16:20:30
【问题描述】:

我编写了这段代码来尝试了解正在发生的事情。

谁能帮我理解为什么生成器不递归调用自己? 如何编写递归生成器?

def f_yield(n):
    print(n)
    if n < 5:
        yield n
    else:
        yield f_yield(n-3)

def f_return(n):
    print(n)
    if n < 5:
        return n
    else:
        return f_return(n-3)

[i for i in f_yield(12)]
# prints 12 

f_return(12)
# prints 12 9 6 3

【问题讨论】:

  • 生成器函数在您尝试迭代它们之前不会执行。
  • @khelwood 什么使函数成为生成器?我尝试编写一个混合了 return 和 yield 语句的函数,它的行为就像一个生成器。这是正确的吗?谢谢。
  • @jimififi 是的,如果函数包含yield 语句,它就是生成器函数。

标签: python python-3.x recursion generator yield


【解决方案1】:

正如 khelwood 所指出的,f_yield(n-3) 也是一个迭代器,因此除非您对其进行迭代,否则它不会返回。如果添加yield from,则递归开始工作:

def f_yield(n):
    print(n)
    if n < 5:
        yield n
    else:
        yield from f_yield(n-3)

【讨论】:

  • 这里需要注意的是,列表将是 [3],因为这是唯一实际产生的值,一直到递归的底部
  • @Artog 带有f_return(n) 的版本也是如此。 ;) 该示例正确地是一个简化的示例,根据最小可重现示例规则 - 我们可以看到递归,我们可以看到一个“相同”版本的 return 确实有效,我们可以看到这不起作用。
  • 实际上,返回示例将按原样返回 None 任何大于 5 的 n :)
【解决方案2】:

你需要遍历f_yield(n-3) 您可以使用yield from 来执行此操作:

yield from f_yield(n-3)

【讨论】:

    猜你喜欢
    • 2013-11-17
    • 2017-11-18
    • 1970-01-01
    • 2016-04-22
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    相关资源
    最近更新 更多