📜  Python中的生成器Generator

📅  最后修改于: 2020-01-18 14:47:21             🧑  作者: Mango

先决条件: 迭代器
我们讨论生成器时涉及两个术语。

  1. Generator-Function: generator-function的定义类似于普通函数,但是每当需要生成值时,它都使用yield关键字而不是return 来生成。如果def的主体包含yield,该函数将自动成为生成器函数。
    # 一个使用yield的生成器函数
    def simpleGeneratorFun():
        yield 1
        yield 2
        yield 3
    # 测试代码
    for value in simpleGeneratorFun():
        print(value)

    输出:

    1
    2
    3

    2, Generator-Object:生成器函数返回生成器对象。可以通过在生成器对象上调用next方法或在“ for in”循环中使用生成器对象(如上述程序所示)。

    # Python程序,展示对生成器对象使用next()方法
    # 一个生成器函数
    def simpleGeneratorFun():
        yield 1
        yield 2
        yield 3
    # x是一个生成器对象
    x = simpleGeneratorFun()
    # 生成器对象迭代,使用next
    print(x.next()); # In Python 3, __next__()
    print(x.next());
    print(x.next());

    输出:

    1
    2
    3

    因此,生成器函数返回可迭代的生成器对象,即可以用作Iterators
    作为另一个示例,下面是斐波那契数的生成器。

    # 一个生成器,用来生成斐波那契数
    def fib(limit):
        # 初始化两个斐波那契数
        a, b = 0, 1
        # 通过yield一个个地生成斐波那契数
        while a < limit:
            yield a
            a, b = b, a + b
    # 创建一个生成器对象
    x = fib(5)
    # 对生成器对象进行迭代,使用next方法
    print(x.next()); # 若在Python 3, 需要使用__next__()
    print(x.next());
    print(x.next());
    print(x.next());
    print(x.next());
    # 使用for循环对生成器迭代
    print("\n使用for循环对生成器迭代")
    for i in fib(5):
        print(i)

    输出:

    0
    1
    1
    2
    3
    使用for循环对生成器迭代
    1
    1
    2
    3

    应用程序:假设我们创建一个斐波纳契数流,采用生成器方法使其变得简单明了;我们只需要调用next(x)即可获得下一个斐波那契数,而不必担心数字流在何处或何时结束。

    流处理的一种更实用的类型是处理大型数据文件,例如日志文件。生成器为此类数据处理提供了一种节省空间的方法,因为在一个给定的时间点仅处理文件的一部分。我们也可以将迭代器Iterators用于这些目的,但是生成器Generator提供了一种快速的方法(我们不需要在这里编写__next__和__iter__方法)。