浅谈Python中的生成器和迭代器


Posted in Python onJune 19, 2020

迭代器

迭代器协议

对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么返回一个异常来终止本次迭代。(只能往前走,不能往后退!)

迭代器对象

遵循了(实现了)迭代器协议的对象。(对象内部实现了一个__next__方法,以实现迭代器协议)称为一个迭代器对象。他们的作用是逐个遍历容器中的对象。迭代器对象一定是可迭代对象

>>> from collections import Iterable, Iterator

>>> l = list([1,2,3])  # 定义列表
>>> l_iter = l.__iter__()  # 调用列表的 __iter__ 方法
>>> isinstance(l, Iterable)  # 列表可迭代对象
True
>>> isinstance(l, Iterator)  # 列表不是迭代器
False

>>> isinstance(l_iter, Iterable)  # 列表的__iter__ 方法返回 是可迭代对象
True
>>> isinstance(l_iter, Iterator)  # 列表的__iter__ 方法返回 也是是迭代器对象
True

可迭代对象(iterable)

可迭代对象有很多种形式,只要满足可以每次取到容器对象中下一个对象的,都称为可迭代对象。

实现了 __iter__方法的对象称为可迭代对象。

range() 对象也是可迭代对象。

生成器对象也是可迭代对象。

>>> from collections import Iterable, Iterator

>>> isinstance(range(10), Iterator)
False
>>> isinstance(range(10), Iterable)
True

# 生成器对象一定是迭代器对象, 那么他也必然是可迭代对象
>>> isinstance((i for i in range(10)), Iterator)
True
>>> isinstance((i for i in range(10)), Iterable)
True

总结补充

列表、元组、集合、字符串、字典都是可迭代对象。

for 循环的本质:使用迭代器协议访问可迭代对象中的每一个对象。

生成器

生成器类似于一种数据类型,这种数据类型自动实现了迭代器协议,所以生成器也是迭代器。

生成器分类及在python中的表现形式:(Python有两种不同的方式提供生成器)

生成器函数

常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行

>>> def generator(n):
...   for i in range(n):
...     yield i
... 
>>> gener_obj = generator(10)
>>> gener_obj.__next__()
0
>>> gener_obj.__next__()
1
>>> gener_obj.__next__()
2
>>> type(gener_obj)
<class 'generator'>

生成器表达式

类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表,按需取出对象

注意生成器 用()包裹起来

>>> generator = (i for i in range(10))
>>> generator.__next__()
0
>>> generator.__next__()
1
>>> type(generator)
<class 'generator'>

以上就是浅谈Python中的生成器和迭代器的详细内容,更多关于Python 生成器和迭代器的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python程序设计入门(2)变量类型简介
Jun 16 Python
Python中一些自然语言工具的使用的入门教程
Apr 13 Python
Python实现将xml导入至excel
Nov 20 Python
Python实现的径向基(RBF)神经网络示例
Feb 06 Python
Python解决线性代数问题之矩阵的初等变换方法
Dec 12 Python
python下载微信公众号相关文章
Feb 26 Python
Python sorted对list和dict排序
Jun 09 Python
python 服务器运行代码报错ModuleNotFoundError的解决办法
Sep 16 Python
python 对象真假值的实例(哪些视为False)
Dec 11 Python
python ansible自动化运维工具执行流程
Jun 24 Python
Pytest中skip skipif跳过用例详解
Jun 30 Python
Python软件包安装的三种常见方法
Jul 07 Python
python中有帮助函数吗
Jun 19 #Python
python中导入 train_test_split提示错误的解决
Jun 19 #Python
python中get和post有什么区别
Jun 19 #Python
python中setuptools的作用是什么
Jun 19 #Python
python怎么判断模块安装完成
Jun 19 #Python
Keras SGD 随机梯度下降优化器参数设置方式
Jun 19 #Python
python支持多继承吗
Jun 19 #Python
You might like
用PHP读取IMAP邮件
2006/10/09 PHP
php 破解防盗链图片函数
2008/12/09 PHP
PHP不用第三变量交换2个变量的值的解决方法
2013/06/02 PHP
js和php邮箱地址验证的实现方法
2014/01/09 PHP
jquery自定义下拉列表示例
2014/04/25 Javascript
告诉你什么是javascript的回调函数
2014/09/04 Javascript
Javascript中数组方法汇总(推荐)
2015/04/01 Javascript
在JavaScript中使用NaN值的方法
2015/06/05 Javascript
详解JavaScript中的every()方法
2015/06/08 Javascript
jQuery左右滚动支持图片放大缩略图图片轮播代码分享
2015/08/26 Javascript
跟我学习javascript的call(),apply(),bind()与回调
2015/11/16 Javascript
jquery制作属于自己的select自定义样式
2015/11/23 Javascript
JavaScript实现仿淘宝商品购买数量的增减效果
2016/01/22 Javascript
js案例之鼠标跟随jquery版(实例讲解)
2017/07/21 jQuery
使用vue实现通过变量动态拼接url
2020/07/22 Javascript
Vue的v-model的几种修饰符.lazy,.number和.trim的用法说明
2020/08/05 Javascript
vue.js watch经常失效的场景与解决方案
2021/01/07 Vue.js
python中遍历文件的3个方法
2014/09/02 Python
简单介绍Python中的len()函数的使用
2015/04/07 Python
Python2.x中文乱码问题解决方法
2015/06/02 Python
python+ffmpeg视频并发直播压力测试
2018/03/06 Python
python抓取网页内容并进行语音播报的方法
2018/12/24 Python
解决python xx.py文件点击完之后一闪而过的问题
2019/06/24 Python
python关于矩阵重复赋值覆盖问题的解决方法
2019/07/19 Python
Python队列RabbitMQ 使用方法实例记录
2019/08/05 Python
tensorflow实现tensor中满足某一条件的数值取出组成新的tensor
2020/01/04 Python
吉尔德利巧克力公司:Ghirardelli Chocolate Company
2019/03/27 全球购物
Chi Chi London官网:购买连衣裙和礼服
2020/10/25 全球购物
会计学专业求职信
2014/07/17 职场文书
商标侵权律师函
2015/05/27 职场文书
盲山观后感
2015/06/11 职场文书
2016新教师培训心得体会范文
2016/01/08 职场文书
如何使用php生成zip压缩包
2021/04/21 PHP
Python如何配置环境变量详解
2021/05/18 Python
python 爬取吉首大学网站成绩单
2021/06/02 Python
《游戏王:大师决斗》将推出新卡牌包4月4日上线
2022/03/31 其他游戏