python - 函数和生成器的区别?

标签 python function count generator itertools

我查看了问题 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?但这纯粹是在谈论生成器,函数和生成器之间没有任何区别。我需要帮助?

最佳答案

原则上,生成器因其惰性求值而具有内存效率。

A 发电机非常类似于返回数组的函数,因为生成器具有参数,可以调用并生成值序列。然而,不是构建一个包含所有值的数组并一次返回它们,而是生成器 yields一次一个值,这需要较少的内存并允许调用者立即开始处理前几个值。

简而言之,生成器看起来像 function但表现得像 iterator .

from itertools import count
itertools提供 count生成无限的整数流。您可以提供 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

代码非常简单明了,但它在内存中构建了完整列表。在我们的情况下,这显然是 Not Acceptable ,因为我们无法将所有无限整数保存在内存中。如您所见,该功能永远不会停止。在这种情况下,我们将使用生成器。

一个生成器 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

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

使用生成器的性能改进是惰性(按需)生成值的结果,这转化为更低的内存使用。此外,我们不需要等到所有元素都生成后才开始使用它们。这类似于迭代器提供的好处,但生成器使构建迭代器变得容易。

所以简单来说,如果你使用 正常功能对于上述情况,您将耗尽内存。或者,如果您使用 生成器函数 你会没有时间。

关于python - 函数和生成器的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29864366/

相关文章:

在主进程中从标准输入进行阻塞读取时,Python 子进程阻塞

python - 如何在不更改对象的情况下缩放 tkinter Canvas 窗口

python - Pandas 组合连续值

php - 如何在 PHP 中给函数起别名?

c++ - 对我书中的练习感到困惑

python - 向 dictReader 添加列而不修改 CSV 文件

c - 在C中返回-1?

python - 匹配字符串时对 pandas 中的行进行条件计数

PHP Count SQL 没有给出结果

mysql - 如何在 MySQL 中保留行计数器