生成器和法代器的功能非常相似,它也会提供 __next__() 方法,这意味着程序同样可调用内置的 next() 函数来获取生成器的下一个值,也可使用 for 循环来遍历生成器。
生成器与迭代器的区别在于,迭代器通常是先定义一个迭代器类,然后通过创建实例来创建迭代器;而生成器则是先定义一个包含 yield 语句的函数,然后通过调用该函数来创建生成器。
生成器是一种非常优秀的语法,Python 使用生成器可以让程序变得很优雅。
创建生成器
创建生成器需要两步操作:
定义一个包含 yield 语句的函数。
调用第 1 步创建的函数得到生成器。
下面程序使用生成器来定义一个差值递增的数列。程序先定义了一个包含 yield 语句的函数:
def test(val, step): print("--------函数开始执行------") cur = 0 # 遍历0~val for i in range(val): # cur添加i*step cur += i * step yield cur
上面函数与前面介绍的普通函数的最大区别在于 yield cur 这行,如果将这行代码改为 print(cur),那么这个函数就显得比较普通了,该函数只是简单地遍历区间,并将循环计数器乘以 step 后添加到 cur 变量上,该数列中两个值之间的差值会逐步递增。
如果将上面的 yield cur 语句改为 print(cur, end =''),执行 test(10, 2) 函数将会看到如下输出结果:
——–函数开始执行——
0 2 6 12 20 30 42 56 72 90
yield cur 语句的作用有两点:
每次返回一个值,有点类似于 return 语句。
冻结执行,程序每次执行到 yield 语句时就会被暂停。
在程序被 yield 语句冻结之后,当程序再次调用 next() 函数获取生成器的下一个值时,程序才会继续向下执行。
需要指出的是,调用包含 yield 语句的函数并不会立即执行,它只是返回一个生成器。只有当程序通过 next() 函数调用生成器或遍历生成器时,函数才会真正执行。
保留上面函数中的 yield cur 语句,执行如下语句:
# 执行函数,返回生成器 t = test(10, 2) print('=================') #