no *_*der 6 python function generator count python-itertools
我查看了问题/sf/ask/2090490251/但它被标记为重复。所以我在这里发布我的答案版本。
原来的问题是:
我正在寻找普通函数和生成器之间的确切区别。我已经用谷歌搜索过了。但所有的结果都令人困惑。我是初学者,所以我期待一些简短而精确的例子。
我试过这个普通函数和生成器函数有什么区别?但没有用。
我已经经历过这个“yield”关键字有什么作用?但这纯粹是在谈论生成器,函数和生成器之间没有任何区别。我需要帮助?
原则上,生成器因其惰性求值而具有内存效率。
甲发生器是非常相似的,返回一个阵列,在一个发生器具有的参数,可以被称为功能,并且生成值的序列。然而,生成器不是构建一个包含所有值的数组并一次返回它们,而是一次生成yields一个值,这需要更少的内存并允许调用者立即开始处理前几个值。
简而言之,生成器看起来像 afunction但行为像iterator。
from itertools import count
Run Code Online (Sandbox Code Playgroud)
itertools提供count生成整数的无限流。您可以提供 start 和 step 来告诉生成的流的开始和步进值。我将在以下示例中使用它。
for i in count(start=0, step=1):
print i
Run Code Online (Sandbox Code Playgroud)
生成偶数列表的简单示例。
构建并返回一个列表:
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
Run Code Online (Sandbox Code Playgroud)
代码非常简单明了,但它在内存中构建了完整列表。在我们的情况下,这显然是不可接受的,因为我们无法将所有无限整数保存在内存中。如您所见,该功能永远不会停止。在这种情况下,我们将使用生成器。
一个生成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
Run Code Online (Sandbox Code Playgroud)
注意数字生成逻辑的表达是清晰自然的。它与在内存中构建列表的实现非常相似,但具有迭代器实现的内存使用特性。
使用生成器的性能改进是惰性(按需)生成值的结果,这转化为更低的内存使用。此外,我们不需要等到所有元素都生成后才开始使用它们。这类似于迭代器提供的好处,但生成器使构建迭代器变得容易。
所以简单来说,如果你在上面的情况下使用正常的函数,你就会耗尽内存。或者,如果您使用生成器功能,您将耗尽时间。