函数和生成器之间的区别?

问题描述 投票:4回答:1

我查看了问题https://stackoverflow.com/questions/29864146/difference-between-function-and-generator,但将其标记为重复。因此,我在这里发布我的答案版本。

原始问题是:

我正在寻找普通函数和生成器之间的确切区别。我已经用谷歌搜索了。但是所有结果都很令人困惑。我是一个初学者,所以我期待一些简短准确的例子。

我尝试过此What is the difference between normal function and generator function?,但没有用。

我已经阅读了What does the "yield" keyword do?,但它纯粹是在讨论生成器,关于函数和生成器之间的区别并没有什么。我需要帮助吗?

python function count generator itertools
1个回答
5
投票
A

generator与返回数组的函数非常相似,因为生成器具有参数,可以被调用,并生成值序列。但是,生成器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

注意,数字生成逻辑的表达清晰自然。它与在内存中构建列表的实现非常相似,但是具有迭代器实现的内存使用特性。

使用生成器带来的性能提高是值的(按需)延迟生成的结果,这转化为较低的内存使用率。此外,我们不必等到所有元素生成后再开始使用它们。这类似于迭代器提供的好处,但是生成器使构建迭代器变得容易。 

简单来说,如果在上述情况下使用

正常功能

,则会耗尽内存。或者,如果您使用

发电机功能

,则会用完时间。
© www.soinside.com 2019 - 2024. All rights reserved.