使用yield实现轮回式的生成器

107 阅读3分钟

我们可以知道,使用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的也会这样的运行,因此就能一直地的循环的下去。