我查看了问题Difference between function and generator?,但标记为重复。所以我在这里发布我的答案版本。
最初的问题是:
我正在寻找正常功能和发电机之间的确切区别。我已经用谷歌搜索了它。但所有结果都令人困惑。我是初学者,所以我期待一些简短而精确的例子。
我试过这个What is the difference between normal function and generator function?但没有使用。
我已经完成了这个What does the "yield" keyword do in Python?,但它纯粹是在谈论生成器,没有关于函数和生成器之间的区别。我需要一些帮助?
答案 0 :(得分:3)
原则上,生成器对于其惰性求值是有效的内存。
生成器与返回数组的函数非常相似,因为生成器具有参数,可以调用,并生成一系列值。但是,不是生成包含所有值并一次返回所有值的数组,而是生成器yields
一次一个值,这需要更少的内存并允许调用者立即开始处理前几个值。
简而言之,生成器看起来像function
但行为类似于iterator
。
from itertools import count
itertools
提供count
来生成无限的整数流。您可以给出开始和步骤来告知生成的流的开始和步进值。我将在以下示例中使用它。
for i in count(start=0, step=1):
print i
生成偶数列表的简单示例。
构建并返回一个列表:
def find_even_number_function(number_stream):
even_number = []
for n in number_stream:
if n % 2 == 0:
even_number.append(n)
return even_number
for i in find_even_number_function(count()):
print i
代码非常简单明了,但它在内存中构建了完整列表。在我们的例子中,这显然是不可接受的,因为我们不能将所有无限整数保留在内存中。如您所见,该功能永远不会停止。在这种情况下,我们将使用发电机。
yields
项而不是返回列表的生成器
def find_even_number_generator(number_stream):
for n in number_stream:
if n % 2 == 0:
yield n
for i in find_even_number_generator(count()):
print i
请注意,数字生成逻辑的表达式清晰自然。它与在内存中构建列表的实现非常相似,但具有迭代器实现的内存使用特性。
使用生成器的性能提升是懒惰(按需)生成值的结果,这意味着更低的内存使用率。此外,在开始使用它们之前,我们不需要等到所有元素都已生成。这类似于迭代器提供的好处,但是生成器使构建迭代器变得容易。
所以简单来说,如果你对上面的情况使用普通函数,你将会耗尽内存。或者,如果您使用生成器功能,则会耗尽时间。