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

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

作者: 小码弟 | 来源:发表于2019-01-03 16:44 被阅读0次

接触Python迭代器之前,先来了解序列可以迭代的原因:iter函数
内置的iter函数有以下作用。

  1. 检查对象是否实现了__iter__方法,如果实现了就调用它,获取一个迭代器。
  2. 如果没有实现__iter__方法,但是实现了__getitem__方法,Python会创建一个迭代器,尝试按顺序(从0开始)获取元素。
  3. 如果尝试失败,抛出TypeError: Object is not iterable

任何Python序列都是可迭代的原因是,他们都实现了__getitem__方法,其实标准序列也都实现了__iter__方法。ducking type认为只有都实现了__iter____getitem__方法,对象才叫可迭代对象。而goose type认为如果实现了__iter__方法,对象就是可迭代的。


可迭代对象与迭代器的对比

一、可迭代对象

使用__iter__方法可以获取迭代器的对象。如果对象实现了返回迭代器的__iter__方法,那么对象就是可迭代的。序列都可以迭代;实现了__getitem__方法,而且其索引从0开始,也称对象可迭代。

总之,标准迭代器有两个方法

  1. __next__: 返回下一个可用元素,如果没有抛出StopIteration异常。
  2. __iter__: 返回self。
    未命名文件-2.png
二、迭代器

实现了无参的__next__方法,返回序列的下一个元素;如果没有元素,则抛出StopIteration

由于迭代器只需__iter____next__两个方法,所以除了调用__next__方法,以及捕获StopIteration异常外,没有办法检查是否还有遗留的元素。此外也没有办法复原迭代器。
注意:可迭代对象一定不能是自身的迭代器,也就是说,可迭代对象必须实现__iter__方法,但不能实现__next__方法

迭代器可以:

  1. 访问一个聚合对象的内容而无需暴露其内部表示
  2. 支持对聚合对象的多种遍历
  3. 为遍历不同聚合结构提供一个统一的接口(多态迭代)
三、生成器

只要Python函数体里有yield关键字,该函数就是生成器函数,函数的返回值就是一个生成器对象。即生成器函数可以看做生成器工厂。
生成器函数会创建一个生成器对象,包装生成器函数的定义体。把生成器传给next()函数时,生成器函数会向前,执行函数定义体中的下一个yield语句,返回产出的值,并在函数定义体的当前位置暂停。最终函数的定义体返回时,外层的生成器对象会抛出StopIteration异常。
通常在生成器函数中不予许出现return语句,但是为了支持协程,Python进行了优化。

相关文章

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

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

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

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

  • 迭代器

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

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

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

  • yield and Iterator

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

  • 迭代机制

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

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

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

  • 2-1迭代对象、迭代器、生成器

    可迭代对象、迭代器和生成器的关系 可迭代对象 可迭代对象实现某种接口,对与列表内部实现了__iter__()方法,...

  • Python迭代器和生成器

    所有的生成器都是迭代器;从可迭代的对象中获取迭代器 一、序列可迭代的原因:iter函数 迭代对象x时,自动调用it...

  • 迭代器和生成器

    迭代器和生成器 迭代器 hasattr(list,'iter')True 判断列表是否为可迭代对象 lst = [...

网友评论

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

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