• 【Python简明教程二十二】迭代器


    1 Python 迭代器

    迭代器是一种对象,该对象包含值的可计数数字。

    迭代器是可迭代的对象,这意味着您可以遍历所有值。

    从技术上讲,在 Python 中,迭代器是实现迭代器协议的对象,它包含方法 __iter__()__next__()

    2 迭代器 VS 可迭代对象(Iterable)

    列表、元组、字典和集合都是可迭代的对象。它们是可迭代的容器,可以从中获取迭代器(Iterator)。

    所有这些对象都有用于获取迭代器的 iter() 方法:

    实例
    从元组返回一个迭代器,并打印每个值:

    mytuple = ("apple", "banana", "cherry")
    myit = iter(mytuple)
    
    print(next(myit))  # apple
    print(next(myit))  # banana
    print(next(myit))  # cherry
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    甚至连字符串都是可迭代的对象,并且可以返回迭代器:

    实例
    字符串也是可迭代的对象,包含一系列字符:

    mystr = "banana"
    myit = iter(mystr)
    
    print(next(myit))  # b
    print(next(myit))  # a
    print(next(myit))  # n
    print(next(myit))  # a
    print(next(myit))  # n
    print(next(myit))  # a
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3 遍历迭代器

    我们也可以使用 for 循环遍历可迭代对象:

    实例
    迭代元组的值:

    mytuple = ("apple", "banana", "cherry")
    
    for x in mytuple:
        print(x)
    
    • 1
    • 2
    • 3
    • 4

    迭代字符串中的字符:

    mystr = "banana"
    
    for x in mystr:
        print(x)
    
    • 1
    • 2
    • 3
    • 4

    提示:for 循环实际上创建了一个迭代器对象,并为每个循环执行 next() 方法。

    4 创建迭代器

    要把对象/类创建为迭代器,必须为对象实现 __iter__()__next__() 方法。

    正如在 Python 类/对象 一章中学到的,所有类都有名为 __init__() 的函数,它允许您在创建对象时进行一些初始化。

    __iter__() 方法的作用相似,可以执行操作(初始化等),但必须始终返回迭代器对象本身。

    __next__() 方法也允许执行操作,并且必须返回序列中的下一个项目。

    实例
    创建一个返回数字的迭代器,从 1 开始,每个序列将增加 1(返回 1、2、3、4、5 等):

    class MyNumbers:
        def __iter__(self):
            self.a = 1
            return self
    
        def __next__(self):
            x = self.a
            self.a += 1
            return x
    
    myclass = MyNumbers()
    myiter = iter(myclass)
    
    print(next(myiter))
    print(next(myiter))
    print(next(myiter))
    print(next(myiter))
    print(next(myiter))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    5 StopIteration

    如果有足够的 next() 语句,或者在 for 循环中使用,则上面的例子将永远进行下去。

    为了防止迭代永远进行,我们可以使用 StopIteration 语句。

    __next__() 方法中,如果迭代完成指定的次数,我们可以添加一个终止条件来引发错误:

    实例
    在 20 个迭代之后停止:

    class MyNumbers:
        def __iter__(self):
            self.a = 1
            return self
    
        def __next__(self):
            if self.a <= 20:
                x = self.a
                self.a += 1
                return x
            else:
                raise StopIteration
    
    myclass = MyNumbers()
    myiter = iter(myclass)
    
    for x in myiter:
        print(x)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    本人独自运营了微信公众号,用于分享个人学习及工作生活趣事,大家可以关注一波。(微信搜索“微思研”)

  • 相关阅读:
    从URL输入到页面展现到底发生什么?
    常见问题: 时间戳如何转换日期时间格式?
    深度解读《深度探索C++对象模型》之C++虚函数实现分析(一)
    elasticSearch7.9数据占用磁盘存储空间情况
    基于jsp+servlet+mysql+bootstrap的权限设计
    Docker、Jenkins 结合 SonarQube 和 Sonar scanner 进行代码质量扫描
    【ceph】AI时代-数据为王-ceph存储将成为未来比较看好的赛道之一,为什么不all in一把学习一个不那么卷的赛道呢?
    [WPF]原生TabControl控件实现拖拽排序功能
    【Python】深入解析Python中的eval()函数
    springBoot整合SqlSessionTemplate使用
  • 原文地址:https://blog.csdn.net/weixin_44237659/article/details/126131771