生成器是一次生成一个值的特殊类型函数。可以将其视为可恢复函数。调用该函数将返回一个可用于生成连续 x 值的生成【Generator】,简单的说就是在函数的执行过程中,yield语句会把你需要的值返回给调用生成器的地方,然后退出函数,下一次调用生成器函数的时候又从上次中断的地方开始执行,而生成器内的所有变量参数都会被保存下来供下一次使用,如下就是一个生成器:
In [3]: gen = (i for i in range(5)) # 创建一个生成器 In [4]: gen.next() # next()方法可以每次调用一个值,然后退出函数 Out[4]: 0 In [5]: gen.next() # 下一次调用生成器的时候又从上次中断的地方开始执行 Out[5]: 1 In [6]: gen.next() # 如果我们使用for循环去遍历生成器里的值,相当于执行多次next()方法 Out[6]: 2
我们自己写一个生成器:
#!/usr/bin/env python #-*- coding:utf-8 -*- def fun(): print('one') yield 1 print('two') yield 2 print('three') yield 3 gen = fun() # 因为函数里有yield语句,所以调用的时候函数不会被执行,只是返回一个生成器对象,只有使用next()方法才会被执行 gen.next() # 第一次会执行print('one'),然后在 yield 1 的位置中断,1是返回值(return),返回值后函数退出,并记录中断位置 gen.next() # 第二次会执行print('two'),然后在 yield 2 的位置中断,2是返回值(return),返回值后函数退出,并记录中断位置 gen.next() # 第三次会执行print('three'),然后在 yield 3 的位置中断,3是返回值(return),返回值后函数退出,并记录中断位置
return 与 yield 区别:
(1) return的时候这个函数的局部变量就都销毁了,所有return是得到所有结果之后的返回
(3) yield是产生了一个可以恢复的函数(生成器),恢复了局部变量;生成器只有在调用 next() 时才运行函数生成一个结果