【问题标题】:is for/while loop from python is a generator是来自 python 的 for/while 循环是一个生成器
【发布时间】:2025-11-24 06:10:02
【问题描述】:

在一次采访中,面试官问我一些 Python 中使用的生成器。我知道生成器就像一个函数,它的值是 yield 而不是 return

所以有人告诉我for/while 循环是生成器的一个例子。

【问题讨论】:

  • 循环是可以迭代生成器的东西,它本身不是生成器。当然,除非您在谈论 (x for x in y) 生成器语法。
  • AFAIK,它不是。它是一个循环结构。但请注意,还有其他形式的生成器。
  • 这个链接可能对你有帮助 - anandology.com/python-practice-book/iterators.html
  • Python 在模块itertools 中提供了一堆迭代器。
  • 谢谢..我一直在寻找..现在我对生成器有了清晰的认识。 :)

标签: python generator yield


【解决方案1】:

简短回答:,但还有其他形式的生成器。

for/while 循环是一个循环结构:它不发出值,因此不是生成器。

尽管如此,还有构造生成器的其他方法

您使用 yield 的示例例如是一个生成器:

def some_generator(xs):
    for x in xs:
        if x:
            yield x

但也有生成器表达式,比如:

(x for x in xs if x)

此外, 中的 range(..)map(..)filter(..) 构造也是生成器。

当然,您也可以制作一个可迭代(通过使用可迭代模式):

class some_generator(object):
    def __init__(self, xs):
        self.n = n
        self.idx = 0

    def __iter__(self):
        return self

    def __next__(self):
        return self.next()

    def next(self):
        while self.num < len(self.xs) and not self.xs[self.num]:
            self.num += 1
        if self.num < len(self.xs):
            res = self.xs[self.num]
            self.num += 1
            return res
        else:
            raise StopIteration()

【讨论】:

  • 实际上range 不是(不再是?)生成器...
  • @hiroprotagonist: 一个range(..) 构造一个具有__iter__ 函数的&lt;type range&gt; 对象。
  • @hiroprotagonist: this wiki 说“......并且在 Python 3 中 range() 是一个生成器。”
  • 'a Python generator is a kind of Python iterator, but of an especially powerful kind' 如 PEP-0255 中所述。所以:你是对的!对不起!我假设(这是错误的)生成器只能使用一次,需要包含 yield 或者是生成器表达式。
【解决方案2】:

whilefor 本身都不是生成器或迭代器。它们是执行迭代的控制结构。当然,您可以使用forwhile 来迭代生成器产生的项目,并且您可以使用forwhile 在生成器的代码中执行迭代。但这些事实都不能使 forwhile 生成器。

【讨论】:

    【解决方案3】:

    the python wiki for generators中的第一行:

    生成器函数允许您声明一个行为类似于迭代器的函数,即它可以在 for 循环中使用。

    因此,在您的采访中,我相信他们正在寻找您回答有关创建可迭代对象的问题。

    wiki for a for loop

    在 Python 中,这是通过生成适当的序列来控制的。

    所以你可能会变得迂腐,但一般来说,不,for 循环不是生成器。

    【讨论】:

      【解决方案4】:

      for 和 while 是循环结构,您可以使用它们来迭代生成器。您可以通过将生成器的某些元素转换为列表来获取它。

      【讨论】: