Python 中何时使用生成器函数以及何时使用循环

Fer*_*rgo 8 python iterator loops generator

我有 Matlab 背景,我发现很难在 Python 中理解生成器的概念。

有人可以回答我以下问题吗:

  1. 生成器函数和循环之间的区别
  2. 每一项何时应实施

Ofe*_*dan 8

生成器提供了一种“动态”创建元素的方法,而无需在我们开始遍历它们之前将它们全部保存在内存中。循环只是一种使生成器或另一个可迭代器一次给我们一个元素的方法。

例如:

for i in range(10):
    print(i)
Run Code Online (Sandbox Code Playgroud)

for块是一个循环,range基本上是一个生成器。在循环开始之前range不会创建1-10 ,它只是创建生成器,即这些元素的创建者。list您还可以想象range(1000000000000000000),这同样不会花费任何时间来创建(并且不会占用内存),因为在需要时不会创建任何元素。

另一方面,我们的循环还可以从已经存在的对象中获取一个元素,例如list

for i in [0,1,2,3,4,5,6,7,8,9]:
    print(i)
Run Code Online (Sandbox Code Playgroud)

将打印相同的结果,但在循环开始之前创建列表并将其存储在其条目中。这意味着当循环运行时,列表会占用内存空间和创建时间。

这两个示例都是循环,但只有第一个示例使用生成器。

这只是基础知识,但还有更多差异,例如可以引发的异常和可重用性、部分迭代等等。

有关差异的更多信息

编辑:@Vicrobot 正确地指出,这range并不是真正的生成器,但为了解释生成器的“惰性”,这就是我为简单起见而使用的

  • Range 不是发电机。/sf/answers/916462221/ (2认同)