美文网首页
容器,可迭代对象,迭代器,生成器

容器,可迭代对象,迭代器,生成器

作者: 冯斯特罗 | 来源:发表于2017-04-19 11:10 被阅读28次
  • 容器:list,set,dict,甚至str都属于容器。绝大部分容器都是可迭代对象。
  • 可迭代对象
    1. 实现了__iter__()方法的对象,__iter__()返回一个迭代器
    2. 可以通过iter()函数生成一个迭代器(iterator)
  • 迭代器:实现了__iter__()和__next__()的对象
  • 生成器:一个特殊的迭代器,使用方法和迭代器一模一样,只是定义方法不同

verbose:
可迭代的对象:使用 iter 内置函数可以获取迭代器的对象。 如果对象实现了能返回迭代器的 iter 方法, 那么对象就是可迭代的。 序列都可以迭代; 实现了 getitem 方法, 而且其参数是从零开始的索引, 这种对象也可以迭代。
迭代器是这样的对象: 实现了无参数的 next 方法, 返回序列中的下一个元素; 如果没有元素了, 那
么抛出 StopIteration 异常。 Python 中的迭代器还实现了 iter 方法, 因此迭代器也可以迭代。

内置的 iter 函数有以下作用。
(1) 检查对象是否实现了 iter 方法, 如果实现了就调用它, 获取一个迭代器。
(2) 如果没有实现 iter 方法, 但是实现了 getitem 方法, Python 会创建一个迭代器, 尝试按顺序
( 从索引 0 开始) 获取元素。
(3) 如果尝试失败, Python 抛出 TypeError 异常, 通常会提示“C object is not iterable”( C 对象不可迭代) , 其中 C 是目标对象所属的类。

检查对象 x 能否迭代, 最准确的方法是: 调用 iter(x) 函数, 如果不可迭代,
再处理 TypeError 异常。 这比使用 isinstance(x, abc.Iterable) 更准确, 因为 iter(x) 函数会考虑
到遗留的 getitem 方法, 而 abc.Iterable 类则不考虑。

abc.Iterable只能保证对象实现了iter,如果一个对象没有实现iter,但是实现了getitem,这个对象可以返回一个迭代器但是abc.Iterable认为不是。

此外, 也没有办法“还原”迭代器。 如果想再次迭代, 那就要调用
iter(...), 传入之前构建迭代器的可迭代对象。 传入迭代器本身没用, 因为前面说过 Iterator.iter
方法的实现方式是返回实例本身, 所以传入迭代器无法还原已经耗尽的迭代器。
可迭代的对象一定不能是自身的迭代器。 也就是说, 可迭代的对象必须实现 iter 方法, 但不能实现
next 方法。

def func(n):
    yield n*2

g = func(5)
g.next() //10

g.next()
'''Traceback (most recent call last):
  File "<input>", line 1, in <module>
StopIteration
'''

相关文章

  • Python基础-16生成器-迭代器

    16.生成器-迭代器     可循环迭代的对象称为可迭代对象,迭代器和生成器函数是可迭代对象,在Python中提供...

  • Python可迭代对象,迭代器,生成器关系

    列表,元组,字符串,迭代器,生成器都是可迭代对象。所以,可迭代对象不一定是迭代器,生成器。 将一个可迭代对象传递给...

  • 迭代器

    可迭代对象(Iterable): for迭代器(Iterator): for + next生成器属于迭代器。 验...

  • 可迭代对象、迭代器、生成器

    可迭代对象 --> 迭代器 --> 生成器; 可迭代对象:实现了__iter__()方法的对象,该方法返回迭代对象...

  • yield and Iterator

    Generator(生成器) 生成器是特殊的迭代器,迭代器不一定是生成器。 生成器与迭代器均是可迭代对象。 目前学...

  • 迭代机制

    可迭代对象、迭代器、生成器、生成式区别 a. 可迭代对象: 一个对象能够被迭代的使用,这个对象就是可迭代对象 b....

  • 迭代器与生成器(cookbook笔记)

    迭代器与生成器 手动遍历迭代器 不使用for循环手动遍历迭代器 代理迭代 在一个新的容器(class)中迭代对象 ...

  • python 控制流

    迭代器,生成器,可迭代对象 原文来自foofish链接如下在了解Python的数据结构时,容器(container...

  • python生成器、迭代器、可迭代对象

    可迭代对象 迭代器 生成器 1.可迭代对象 可以被for循环遍历的对象成为可迭代对象,其中包括list、str、t...

  • python最重要的迭代生成器,你懂的

    python 迭代器和生成器 迭代器 对于list、string、tuple、dict等这些容器对象,使用for循...

网友评论

      本文标题:容器,可迭代对象,迭代器,生成器

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