【问题标题】:Difference between function and generator?函数和生成器的区别?
【发布时间】:2015-07-04 01:17:54
【问题描述】:

我查看了问题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】:

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

    generator 与返回数组的函数非常相似,因为generator 有参数,可以调用,并生成一系列值。但是,不是构建一个包含所有值的数组并一次返回它们,而是一个生成器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
    

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

    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
    

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

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

    所以简单来说,如果你在上述情况下使用普通函数,你会耗尽内存。或者,如果您使用 生成器功能,您将用完时间。

    【讨论】:

      猜你喜欢
      • 2014-07-24
      • 2023-04-10
      • 2014-04-08
      • 2013-06-17
      • 2014-05-02
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      • 2021-03-21
      相关资源
      最近更新 更多