使用cycle构造无限循环迭代器

2020-10-10  本文已影响0人  小啊小狼

一、引入方式

from itertools import cycle

二、使用方法

我们先来看看它的源码


cycle.png

cycle它接收一个可迭代对象,可以将一个可迭代对象转换为一个可以无限迭代的迭代器

源码里我们可以看到它实现了_iter_ 和_next_的魔术方法,说明它既是可迭代对象也是一个迭代器,我们可以使用for循环和next()方法去操作它

cycle()

for i,x in enumerate(cycle('abcd')):
    if i < 5:
        print x
def cycle(iterable):
    # cycle('ABCD') --> A B C D A B C D A B C D ...
    saved = []
    for element in iterable:
        yield element
        saved.append(element)
    while saved:
        for element in saved:
              yield element

我们先来看看以普通的方式去遍历一个列表

li = ['python', 'java', 'c', 'ruby', 'php', 'javascript']
for i in li:
    print(i)

打印结果:


image.png

以看到,遍历直到最后一个元素取完后就不再遍历了

接下来我们使用cycle来创建一个无限迭代的迭代器

from itertools import cycle

li = ['python', 'java', 'c', 'ruby', 'php', 'javascript']
cycle_iter = cycle(li)
for i in cycle_iter:
    print(i)

打印结果:

python
java
c
ruby
php
javascript
python
java
c
ruby
php
...

我们可以发现当遍历到最后一个元素结束后又会回到第一个元素,就这样无限循环下去。
接下来我们使用next()进行迭代,看看会发生什么

from itertools import cycle
li = ['python', 'java', 'c', 'ruby', 'php', 'javascript']
cycle_iter = cycle(li)
for i in range(10):
    print(next(cycle_iter))

打印结果:

python
java
c
ruby
php
javascript
python
java
c
ruby

发现当最后一个元素迭代完后,又继续迭代第一个元素,这跟普通的迭代器不一样,普通的迭代器最后一个元素迭代完后继续迭代,会抛出迭代停止的异常

三、结语

cycle是一个无限迭代器,可以循环有序迭代一个可迭代对象,使用的时候都要注意设置终止条件,避免一直运行下去。
在需要取值的地方可以用next()取值。

上一篇 下一篇

猜你喜欢

热点阅读