Python 函数和生成器之间的差异?
我复习了这个问题,但它被标记为重复。所以我在这里发布我的答案版本 原来的问题是: 我在寻找正常函数和生成器之间的确切区别。我已经在谷歌上搜索过了。但所有的结果都相当混乱。我是一个初学者,所以我期待一些简短而准确的例子 我试过了,但没用Python 函数和生成器之间的差异?,python,function,count,generator,itertools,Python,Function,Count,Generator,Itertools,我复习了这个问题,但它被标记为重复。所以我在这里发布我的答案版本 原来的问题是: 我在寻找正常函数和生成器之间的确切区别。我已经在谷歌上搜索过了。但所有的结果都相当混乱。我是一个初学者,所以我期待一些简短而准确的例子 我试过了,但没用 我已经讲过了,但这纯粹是关于生成器的,函数和生成器之间没有什么区别。我需要一些帮助吗?原则上,生成器的惰性计算是内存有效的 生成器非常类似于返回数组的函数,因为生成器具有参数,可以调用,并生成一系列值。但是,生成器不是构建包含所有值的数组并一次返回所有值,而是一次
我已经讲过了,但这纯粹是关于生成器的,函数和生成器之间没有什么区别。我需要一些帮助吗?原则上,生成器的惰性计算是内存有效的 生成器非常类似于返回数组的函数,因为生成器具有参数,可以调用,并生成一系列值。但是,生成器
不是构建包含所有值的数组并一次返回所有值,而是一次生成一个值,这需要更少的内存,并允许调用方立即开始处理前几个值
简而言之,生成器看起来像一个函数
,但其行为类似于一个迭代器
from itertools import count
itertools
提供count
以生成无限的整数流。您可以给出start和step来告诉生成的流的start和step值。我将在下面的示例中使用它
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
代码非常简单明了,但是它在内存中构建了完整的列表。在我们的例子中,这显然是不可接受的,因为我们无法在内存中保留所有无限整数。正如你所看到的,这个功能永远不会停止。在这种情况下,我们将使用发电机
生成
项而不是返回列表的生成器
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
请注意,数字生成逻辑的表达清晰自然。它与在内存中构建列表的实现非常相似,但具有迭代器实现的内存使用特性
使用生成器所带来的性能改进是延迟(按需)生成值的结果,这将降低内存使用率。此外,我们不需要等到所有元素都生成之后才开始使用它们。这类似于迭代器提供的好处,但生成器使构建迭代器变得简单
因此,简单地说,如果您对上述情况使用正常函数,您将耗尽内存。或者,如果使用生成器功能,则时间将用完