生成器(generator)作为可迭代对象,在很多地方得到应用。它与普通函数比较大的区别是yield语句的应用,使得它能够一边循环一边计算。比如说,在你对一个列表中的元素进行循环处理时,列表会实时更新。列表的长度、赋值都是和循环周期同步的,也就不会碰到由于列表长度不可变而不能实时更新计算值的问题。比如,杨辉三角生成器代码如下:
def triangle(x):
l=(i for i in range(x))
l_t=[]
k=0
for i in l:
l_t.append(i)
l_r=[]
for i in l_t:
l_r.append(i)
k += 1
print('第'+str(k)+'个列表')
for j in range(len(l_t)):
if j==0:
l_r[j]=1
if 0<j<len(l_t)-1:
l_r[j]=l_t[j-1]+l_t[j]
if j==len(l_t)-1:
l_r[j]=1
l_t=[]
for i in l_r:
l_t.append(i)
yield l_r
for i in triangle(9):
print(i)
在以上的代码中,yield语句相当于生成器的中断点。生成器的运行默认是从上一个yield开始到下一个yield为止,如果只有一个yield语句,则到该yield结束。
在使用next()调用生成器时,如果一个函数有三个以上yield语句,当上一次的运行在第二个yield语句结束时,下一次运行会将第二个yield语句作为起始点,这个特性和中断点也非常像。拥有了这个特性之后,函数就获得了记忆功能,从哪里结束还可以从哪里开始。
next()相当于单步执行,实际应用中一般用for语句调用生成器,如以上就是用for语句调用了9次该生成器。