美文网首页
使用cycle构造无限循环迭代器

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

作者: 小啊小狼 | 来源:发表于2020-10-10 16:27 被阅读0次

一、引入方式

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()取值。

相关文章

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

    一、引入方式 二、使用方法 我们先来看看它的源码 cycle它接收一个可迭代对象,可以将一个可迭代对象转换为一个可...

  • itertools模块

    创建自然序列count 无限循环重复传入的序列cycle 注意:传入的参数类型需要是可迭代对象 上面的for循环限...

  • Fortran复习小记

    顺序结构 控制结构:分支 控制结构:循环 当循环 迭代(计数)循环 cycle和exit cycle:如果cycl...

  • python三大法器:生成器、装饰器、迭代器

    迭代器 迭代的概念 使用for循环遍历取值的过程叫做迭代,比如:使用for循环遍历列表获取值的过程 使用for循环...

  • 8. 迭代器与生成器

    在别的语言中,从使用 for 循环转变到使用迭代器对象。for 循环需要初始化变量以便追踪集合内的位置,而迭代器则...

  • 迭代器与生成器(cookbook笔记)

    迭代器与生成器 手动遍历迭代器 不使用for循环手动遍历迭代器 代理迭代 在一个新的容器(class)中迭代对象 ...

  • PHP设计模式(十五)—迭代模式(Iterator Patter

    迭代模式(Iterator Pattern):迭代器模式可帮组构造特定的对象,那些对象能够提供单一的标准接口循环或...

  • Swift 5.1 (5) - 控制流

    控制流 For-In循环 使用for-in循环迭代数组 使用for-in循环迭代字典 使用for-in循环迭代数值...

  • 第十四章习题

    1.for循环和迭代器之间有什么关系? for循环会使用迭代协议来遍历迭代的对象中的每一个项。for循环会在每次迭...

  • ES6(八)迭代器与生成器1

    迭代数据的方式从使用 for 循环转变到使用迭代器对象, for 循环需要 初始化变量以便追踪集合内的位置, 而迭...

网友评论

      本文标题:使用cycle构造无限循环迭代器

      本文链接:https://www.haomeiwen.com/subject/iikjpktx.html