• Python进阶09 迭代器


    一、迭代器

    我们已经知道,集合数据类型(如list、tuple、dict、set、str等)和generator都可以直接作用于for循环。这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
    而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。
    可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

    1、可以使用isinstance()判断一个对象是否是Iterable对象:

    >>> from collections.abc import Iterable
    >>> isinstance([1, 2, 3], Iterable)
    True
    >>> isinstance({1, 2, 3}, Iterable)
    True
    >>> isinstance('ABC', Iterable)
    True
    >>> isinstance((x for x in range(5)), Iterable)
    True
    >>> isinstance(100, Iterable)
    False

    2、可以使用isinstance()判断一个对象是否是Iterator对象:

    >>> from collections.abc import Iterator
    >>> isinstance((x for x in range(5)), Iterator)
    True
    >>> isinstance([1, 2, 3], Iterator)
    False
    >>> isinstance({1, 2, 3}, Iterator)
    False
    >>> isinstance('ABC', Iterator)
    False

    Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

    Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

    二、iter()函数

    生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。
    把list、dict、str等Iterable变成Iterator可以使用iter()函数:

    >>> isinstance(iter([1, 2, 3]), Iterator)
    True
    >>> isinstance(iter('ABC'), Iterator)
    True
    >>> isinstance(iter({1, 2, 3}), Iterator)
    True

    三、迭代器协议

    实现了方法__iter__的对象是可迭代的,而实现了方法__next__的对象是迭代器。

    class Fibs:
        def __init__(self):
            self.a = 0
            self.b = 1
    
        def __next__(self):
            self.a, self.b = self.b, self.a + self.b
            return self.a
    
        def __iter__(self):
            return self
    fibs = Fibs()
    
    for f in fibs:
        print(f)
        if f > 10:
            break
    
    结果:
    1
    1
    2
    3
    5
    8
    13

    四、从迭代器创建序列

    除了对迭代器和可迭代对象进行迭代之外,还可将它们转换为序列。

    一个这样的例子是使用构造函数list显示地将迭代器转换为列表。

    class TestIterator:
        value = 0
    
        def __next__(self):
            self.value += 1
            if self.value > 10:
                raise StopIteration
    
            return self.value
    
        def __iter__(self):
            return self
    
    ti = TestIterator()
    print(list(ti))
    
    结果:
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

    参考文章:

    https://www.liaoxuefeng.com/wiki/1016959663602400/1017323698112640

  • 相关阅读:
    Python之杨辉三角算法实现
    iOS之UI--微博个人详情页
    iOS之UI--通讯录的实例关键知识技术点积累
    iOS之github第三方框架(持续更新)
    关于第三方IOS的checkBox框架的使用
    iOS之UI--Quartz2D的入门应用--重绘下载圆形进度条
    iOS之多控制器管理--项目中的常见文件
    iOS之微博UI实例--拟物化设计(成功了90%)
    主要责任、主要技术
    IOS之UI -- UITableView -- 2 -- 等高的Cell
  • 原文地址:https://www.cnblogs.com/mazhiyong/p/12566362.html
Copyright © 2020-2023  润新知