一、引入方式
from itertools import cycle
二、使用方法
我们先来看看它的源码
cycle.png
cycle它接收一个可迭代对象,可以将一个可迭代对象转换为一个可以无限迭代的迭代器
源码里我们可以看到它实现了_iter_ 和_next_的魔术方法,说明它既是可迭代对象也是一个迭代器,我们可以使用for循环和next()方法去操作它
cycle()
- 函数仅接受一个参数作为输入,可以像列表,字符串,元组等
- 该函数返回迭代器对象类型
- 在函数的实现中,返回类型为yield,它在不破坏局部变量的情况下挂起函数执行。由生成中间结果的生成器使用
- 它遍历输入自变量中的每个元素并产生它并重复循环,并产生一个无穷大的自变量序列
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()取值。
网友评论