【问题标题】:How to implement an infinite generator?如何实现无限生成器?
【发布时间】:2021-10-29 14:42:18
【问题描述】:

我很难理解生成器。遇到这个问题,需要在这里逐步解释。

问题被要求创建一个名为odds的生成器函数。当在 for 循环中用尽时,从生成器函数创建的生成器对象应该产生第一个 count 数字。对于这个问题,返回的第一个奇数应该是 1。

我很难理解这个问题,“从生成器函数创建的生成器对象应该在 for 循环中用尽时产生第一个 count 数字是什么意思?我也想知道为什么我们在这个函数中需要count -= 1

def odds(count):
    i = 1 
    while True:
        if i % 2:
            count -= 1
            yield i
            if not count:
                break
        i += 1

【问题讨论】:

  • 当涉及到这样的基础知识时,我建议不要在问答网站上询问(并且不得不等待),而是在 Google 上搜索已经存在的众多教程之一。您需要掌握的是调用使用return 的普通函数和调用使用yield 的生成器函数之间的区别。至于count,每次奇数为yielded时,它就减1,直到达到0,if not count:运行并退出while循环。
  • count 表示您想要多少个奇数,并且是您传递给函数的参数,因此-=1 只是倒数到 0 并为您提供您所要求的奇数为。
  • 它有助于使用生成器函数并观察迭代它的结果。如果您说x = odds(9),那么对next(x) 的重复调用将为您每次使用yield i 提供i 的值,或者在StopIteration 循环最终终止时提高StopIteration

标签: python generator


【解决方案1】:

Generator functionsyield 值而不是 return 的简单函数,因此非常容易编写。即:

def odds(count):
    i = 1
    for _ in range(count):
        yield i
        i += 2

for i in odds(10):
    print(i)

使用两者之间的区别不止于此。这是更详细的比较:Difference between Yield and Return in Python

Stackoverflow 并不打算取代现有的教程或文档,因此为了更深入地了解生成器的工作原理,我建议您查阅有关该主题的教程,例如:How to Use Generators and yield in Python

【讨论】:

  • 这是一种循环定义; “产生”一个值而不是返回它是什么意思? (严格来说,函数确实返回一些东西:它返回一个generator类型的值,这将是描述yield实际作用的起点。)
  • @chepner:我的意思只是包含一个yield statement 而不是return 语句——而不是内部如何完成的肮脏细节。随意发布您自己更好的答案。
猜你喜欢
  • 2023-03-17
  • 1970-01-01
  • 2012-08-17
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 2018-07-22
相关资源
最近更新 更多