• 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

  • 相关阅读:
    java 装饰者模式与继承的区别
    Java学习笔记-多线程-创建线程的方式
    java IO流复制图片
    如何解决代码重复问题
    jdbc的基本应用
    java多线程
    java中的集合和数组
    Collections的应用
    Map集合的应用及其遍历方式
    qweb
  • 原文地址:https://www.cnblogs.com/mazhiyong/p/12566362.html
Copyright © 2020-2023  润新知