我们可以知道,使用yield可以定义生成器,但是这个生成器是只要将生成器里面的元素迭代完成就会停止了, 但是很多时候我们并不想只尽于此,我们希望可以轮播,哪怕迭代结束了,又从头开始,这样的操作怎么实现呢?答案是加一个while True就可以。
ls=['张飞','孙悟空','牛魔王']
def A():
while True:
for i in ls:
yield i
g=A()
for _ in range(100):
print(next(g))
运行结果如下:
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
孙悟空
牛魔王
张飞
Process finished with exit code 0
这样我们就轻松实现上述的效果,但是我们应该怎么分析这个代码呢?我们可以写一个类似的while循环试验:
ls=['张飞','孙悟空','牛魔王']
def A():
count=0
while True:
if count>9:break
print('第{}次运行for循环'.format(count+1))
for i in ls:
print(i)
count+=1
print('此次for循环结束')
A()
运行结果:
第1次运行for循环
张飞
孙悟空
牛魔王
此次for循环结束
第2次运行for循环
张飞
孙悟空
牛魔王
此次for循环结束
第3次运行for循环
张飞
孙悟空
牛魔王
此次for循环结束
第4次运行for循环
张飞
孙悟空
牛魔王
此次for循环结束
第5次运行for循环
张飞
孙悟空
牛魔王
此次for循环结束
第6次运行for循环
张飞
孙悟空
牛魔王
此次for循环结束
第7次运行for循环
张飞
孙悟空
牛魔王
此次for循环结束
第8次运行for循环
张飞
孙悟空
牛魔王
此次for循环结束
第9次运行for循环
张飞
孙悟空
牛魔王
此次for循环结束
第10次运行for循环
张飞
孙悟空
牛魔王
此次for循环结束
Process finished with exit code 0
我们可以看到,实际上是while训练里面不断的将内部的for循环运行, 每当for循环结束后,while又会进行下一次的for循环,直至程序终止。 类似的,带yield的也会这样的运行,因此就能一直地的循环的下去。