Python12--迭代器

作者: 伊洛的小屋 | 来源:发表于2020-09-01 15:08 被阅读0次
    1.迭代器

    要理解迭代器,首先需要明白迭代器和可迭代对象的区别。一个一个读取、操作对象称为迭代,Python 中,可迭代(Iterable)对象就是你能用for循环迭代它的元素,比如列表是可迭代的

    • 大多数容器对象都可以使用 for 语句,承接上文装饰器的例子,还是拿英雄的技能举例子
    • 王者荣耀中英雄关羽的技能有一骑当千 单刀赴会 青龙偃月 刀锋铁骑for语句分别迭代出1-4技能
    (yiluo) ➜  Code python3
    Python 3.7.5 (default, Nov 29 2019, 14:32:46)
    [Clang 9.0.0 (clang-900.0.39.2)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> skills = ['一骑当千','单刀赴会','青龙偃月','刀锋铁骑']
    >>> for skill in skills:
    ...     print(skill)
    ...
    一骑当千
    单刀赴会
    青龙偃月
    刀锋铁骑
    
    • 在幕后,for 语句会调用容器对象中的 iter()。 该函数返回一个定义了 __next__() 方法的迭代器对象,该方法将逐一访问容器中的元素
    • 我们现在利用一下 iter()函数 和 next()函数

    你能用 next 函数不断的去获取它的下一个值,直到迭代器返回 StopIteration异常。所有的可迭代对象都可以通过 iter 函数去获取它的迭代器

    # 作者:伊洛Yiluo 公众号:伊洛的小屋
    # 个人主页:https://yiluotalk.com/
    # 博客园:https://www.cnblogs.com/yiluotalk/
    >>> skills = ['一骑当千','单刀赴会','青龙偃月','刀锋铁骑']
    >>> skill = iter(skills)
    >>> print(skill)
    <list_iterator object at 0x1037ea5d0>
    >>> next(skill)
    '一骑当千'
    >>> next(skill)
    '单刀赴会'
    >>> next(skill)
    '青龙偃月'
    >>> next(skill)
    '刀锋铁骑'
    >>> next(skill)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    
    • skill就是迭代器
    • next迭代到没有值的时候就会报错
    • 所有的迭代器其实都实现了__iter____next__ 这俩个魔法方法,iternext 函数实际上调用的是这两个魔法方法,上面的例子背后其实是这样的
    2.另一种实现方式
    • 迭代器的另一种实现方式,__iter__ + __next__:
    >>> class Test:
    ...     def __init__(self, a, b):
    ...         self.a = a
    ...         self.b = b
    ...     def __iter__(self):
    ...         return self
    ...     def __next__(self):
    ...         self.a += 1
    ...         if self.a > self.b:
    ...             raise StopIteration()
    ...         return self.a
    ...
    >>> test = Test(0, 5)
    >>> next(test)
    1
    >>> next(test)
    2
    >>> next(test)
    3
    >>> next(test)
    4
    >>> next(test)
    5
    >>> next(test)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 10, in __next__
    StopIteration
    
    • 能被 for 循环访问的都是可迭代对象,能被 next 函数获取下一个值的是迭代器

    欢迎下方【戳一下】【点赞】
    Author:伊洛Yiluo
    愿你享受每一天,Just Enjoy !

    相关文章

      网友评论

        本文标题:Python12--迭代器

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