Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 函数和生成器之间的差异?_Python_Function_Count_Generator_Itertools - Fatal编程技术网

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

使用生成器所带来的性能改进是延迟(按需)生成值的结果,这将降低内存使用率。此外,我们不需要等到所有元素都生成之后才开始使用它们。这类似于迭代器提供的好处,但生成器使构建迭代器变得简单

因此,简单地说,如果您对上述情况使用正常函数,您将耗尽内存。或者,如果使用生成器功能,则时间将用完