美文网首页
使用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构造无限循环迭代器

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