博客
关于我
可迭代对象、迭代器、生成器
阅读量:718 次
发布时间:2019-03-21

本文共 1402 字,大约阅读时间需要 4 分钟。

可迭代对象、迭代器、生成器是Python中常用的概念,但它们之间的区别和特点可能让很多开发者感到困惑。本文将从这些概念的实现原理入手,详细阐述它们的关系以及如何在实际编程中使用。

1. type和isinstance的区别

在Python中,type()函数返回的是对象的类对象,而isinstance()函数用于判断对象是否是某个类或其父类的实例。通过比较这两个函数的作用可以得出明确的结论。例如,一个对象o为创建的列表实例,那么:

  • type(o) == list
  • isinstance(o, list)返回True

这两种函数在类型判断中有明显的区别。

2. 三者所属类型

根据Python的官方文档,collections库中的Iterable接口 defines iterable object, Iterator接口定义了迭代器,Generator接口定义了生成器。这些接口分别用于不同的功能,但它们之间存在一定的关联关系。


可迭代对象

要实现一个可迭代对象,需要在类中定义__iter__方法。这个方法返回一个迭代器对象。需要注意的是,返回的值必须是一个支持__next__方法的迭代器对象,否则无法实现迭代功能。

有趣的是,一个能被for循环遍历的对象并不一定是可迭代对象。你可能会疑惑,这到底是什么意思呢?让我们来看个具体示例。

在示例代码中,某实例对象可以被for循环遍历,但它却不是一个可迭代对象。这意味着,__iter__方法的返回值虽然支持迭代,但它并不符合Iterable接口的要求。这个细节在编写高效代码时非常重要。


for循环机制

Python中的for循环工作机制非常清晰。它会首先查找对象的__iter__方法。如果找不到,就会查找__getitem__方法。如果两者都不行,那么这个对象就不支持迭代。

如果使用__iter__方法,for循环会获取返回的迭代器,并不断调用__next__方法,直到抛出StopIteration异常。

如果使用__getitem__方法,for循环会按照索引值依次调用__getitem__,从0开始,直到索引超出范围或抛出异常。


迭代器

迭代器是指那些同时实现了__iter____next__方法的对象。简单来说,如果一个对象既能创建迭代器,又能提供下一个元素的获取方式,那么它就是一个迭代器。

生成器就是迭代器中的一种特殊类型,它在生成迭代器的过程中会自动暂停,并在必要时继续。这与传统的迭代器有明显区别。


生成器

生成器是通过在函数中使用yield关键字创建的。生成器在执行到yield时会暂停,并且回到顶层for循环的处理。当继续调用next()时,生成器会继续执行任务,直到再次遇到yield

生成器的一个显著特点是,它可以表现得像一个无限迭代器,无论生成的数据量有多大。


总结

  • 实现了__iter__方法的类创建的实例对象都是可迭代对象。
  • 实现了__iter____next__方法的实例对象才是迭代器。
  • 通过在函数中使用yield关键字创建的函数返回的实例是生成器。

要注意的是,虽然生成器是迭代器,但不是所有迭代器都是生成器。两者之间没有包含关系,而是各有特点。

如果你在编写Python代码时希望代码既高效又简洁,理解这些概念的区别无疑是非常重要的。希望这一段内容能帮助你更好地理解Python中的迭代机制!

转载地址:http://xderz.baihongyu.com/

你可能感兴趣的文章
Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
查看>>
MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
查看>>
mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
查看>>
mysql中出现Unit mysql.service could not be found 的解决方法
查看>>
mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
查看>>
Mysql中各类锁的机制图文详细解析(全)
查看>>
MySQL中地理位置数据扩展geometry的使用心得
查看>>
Mysql中存储引擎简介、修改、查询、选择
查看>>
Mysql中存储过程、存储函数、自定义函数、变量、流程控制语句、光标/游标、定义条件和处理程序的使用示例
查看>>
mysql中实现rownum,对结果进行排序
查看>>
mysql中对于数据库的基本操作
查看>>
Mysql中常用函数的使用示例
查看>>
MySql中怎样使用case-when实现判断查询结果返回
查看>>
Mysql中怎样使用update更新某列的数据减去指定值
查看>>
Mysql中怎样设置指定ip远程访问连接
查看>>
mysql中数据表的基本操作很难嘛,由这个实验来带你从头走一遍
查看>>
Mysql中文乱码问题完美解决方案
查看>>
mysql中的 +号 和 CONCAT(str1,str2,...)
查看>>
Mysql中的 IFNULL 函数的详解
查看>>
mysql中的collate关键字是什么意思?
查看>>