1、概览
列表元素按照某种算法推算出来,在循环的过程中不断推算出后续的元素。这种一边循环一边计算的机制,称为生成器:generator
1.1、创建 generator
1)方法一
只要把一个列表生成式的[]改成(),就创建了一个generator
L = [x * x for x in range(10)] # 这是列表生成式
g = (x * x for x in range(10)) # 这是generator
>>> g
<generator object <genexpr> at 0x1022ef630>
generator的值不能直接打印,需要用 next()函数获得,或者通过for循环打印
next(g)
每调用一次,返回一个generator的值,当所有值返回完毕后,再调用会报错StopIteration
for 循环
>>> for n in g:
... print(n)
2)方法二
在函数体中,有 yield。当然,generator的函数,也可以用 next() 或者 for 循环获取返回值
函数是顺序执行,遇到return语句或者最后一行函数语句就返回
generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行
def odd():
print('step 1')
yield 1
print('step 2')
yield(3)
print('step 3')
yield(5)
>>> o = odd()
>>> next(o) # next(odd()) 调用效果一样。for循环调用见例题
step 1
1
>>> next(o)
step 2
3
>>> next(o)
step 3
5
2、例题
1、编写一个生成斐波那契数列的 generator 函数
# 函数编写
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'
# for循环获取返回值,但获取不到generator 执行完的报错返回
f=fib(6) # 定义一个generator对象 f
for n in f:
print(n)
# 获取值得同时,获取generator的报错返回
g=fib(6)
while True:
try:
x=next(g)
print('g',x)
except StopIteration as e: # 捕捉错误
print('Generator return value:',e.value) # 输入错误的返回值
break
2、编写一个杨辉三角的generator函数
# -*- coding: utf-8 -*-
def triangles():
N=[1]
while True:
yield N #generator函数与普通函数的差别:在执行过程中,遇到yield就中断,下次又继续执行
N.append(0)
N=[N[i-1] + N[i] for i in range(len(N))] #杨辉三角的生成式
if __name__ == '__main__': # 如果是运行的.py文件,就执行下面的命令。调试用
n=0
for t in triangles():
print(t)
n=n+1
if n == 10:
break
原文地址:http://blog.51cto.com/12758568/2115989