详解Python 生成器

  • Post category:Python

下面是Python生成器使用方法的完整攻略。

1. 什么是生成器?

在Python中,生成器是一种特殊类型的迭代器,它可以用来节省内存,并且更加高效地迭代数据。与普通函数不同,生成器可以暂停和恢复执行,并返回一个中间结果,从而生成后续的数据。

生成器有两种创建方式:函数生成器和生成器表达式。

2. 函数生成器

函数生成器是使用函数定义语句来创建生成器的。函数生成器通过在函数定义中加入 yield 语句来实现,yield 表示将当前函数的状态保存在中间结果中,并且保持函数的状态,等待下一次调用继续执行。

下面是一个简单的函数生成器的示例代码:

def my_generator(n):
    for i in range(n):
        yield i * i

g = my_generator(5)
print(next(g))   # 输出 0
print(next(g))   # 输出 1
print(next(g))   # 输出 4
print(next(g))   # 输出 9
print(next(g))   # 输出 16

在上面的代码中,我们定义了一个函数 my_generator,它接受一个整数 n 作为参数,返回一个生成器,用来生成 0(n-1) 的整数的平方。

在主函数中,我们首先创建了一个生成器 g,然后使用 next 方法依次调用生成器,生成器会返回对应的中间结果。可以看到,每次调用生成器的时候,都会从上次 yield 语句处恢复执行。

3. 生成器表达式

另一种创建生成器的方式是使用生成器表达式。生成器表达式与列表推导式类似,但是它返回一个生成器而非列表对象。生成器表达式使用圆括号括起来,并类似于一个列表推导式,但是其中的方括号被替换成了圆括号。

下面是一个简单的生成器表达式的示例代码:

gen = (x * x for x in range(10))

for i in gen:
    print(i)

在上述代码中,我们使用生成器表达式创建了一个生成器,用来生成 09 的整数的平方。然后使用 for 循环遍历生成器,输出每个元素的值。

4. 生成器实例:斐波那契数列

下面是一个生成器的实例,用于生成斐波那契数列。该数列满足每个数都是前两个数之和,即:f(n) = f(n-1) + f(n-2),其中 f(0) = 0f(1) = 1

def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

gen = fibonacci()

for i in range(10):
    print(next(gen))

在上述代码中,我们定义了一个生成器函数 fibonacci,用于生成斐波那契数列。在函数中,我们使用了一个 while 循环来实现这个数列,并且在循环中使用 yield 语句来保存每一个中间结果。

在主函数中,我们创建了该生成器,并且使用 next 方法调用它,一次输出前10个斐波那契数列的值。

5. 总结

至此,我们完成了Python生成器的使用方法的完整攻略。顺便提醒一下,使用生成器可以避免内存占用问题,并大大提高迭代的效率。在使用生成器时,需要注意生成器状态的保存和恢复,以及 StopIteration 异常的处理。