浅谈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实现windows下模拟按键和鼠标点击的方法
Mar 13 Python
基于scrapy实现的简单蜘蛛采集程序
Apr 17 Python
json跨域调用python的方法详解
Jan 11 Python
python面向对象多线程爬虫爬取搜狐页面的实例代码
May 31 Python
python实现决策树分类
Aug 30 Python
django解决跨域请求的问题
Nov 11 Python
使用 Python 合并多个格式一致的 Excel 文件(推荐)
Dec 09 Python
python路径的写法及目录的获取方式
Dec 26 Python
python统计字符的个数代码实例
Feb 07 Python
python3利用Axes3D库画3D模型图
Mar 25 Python
python中openpyxl和xlsxwriter对Excel的操作方法
Mar 01 Python
python通配符之glob模块的使用详解
Apr 24 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
GBK的页面输出JSON格式的php函数
2010/02/16 PHP
php的日期处理函数及uchome的function_coomon中日期处理函数的研究
2011/01/12 PHP
PHP动态柱状图实现方法
2015/03/30 PHP
脚本之家贴图转换+转贴工具用到的js代码超级推荐
2007/04/05 Javascript
什么是json和jsonp,jQuery json实例详详细说明
2012/12/11 Javascript
Lab.js初次使用笔记
2015/02/28 Javascript
js数组去重的5种算法实现
2015/11/04 Javascript
JS实现pasteHTML兼容ie,firefox,chrome的方法
2016/06/22 Javascript
AngularJs验证重复密码的方法(两种)
2016/11/25 Javascript
原生js实现下拉框功能(支持键盘事件)
2017/01/13 Javascript
AngularJS实现的2048小游戏功能【附源码下载】
2018/01/03 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
2019/04/26 Javascript
JS代码检查工具ESLint介绍与使用方法
2020/02/04 Javascript
vue 通过绑定事件获取当前行的id操作
2020/07/27 Javascript
Node.js 中判断一个文件是否存在
2020/08/24 Javascript
python将xml xsl文件生成html文件存储示例讲解
2013/12/03 Python
Python实现文件内容批量追加的方法示例
2017/08/29 Python
python 函数中的内置函数及用法详解
2019/07/02 Python
dpn网络的pytorch实现方式
2020/01/14 Python
Python基础之字符串常见操作经典实例详解
2020/02/26 Python
Python解释器及PyCharm工具安装过程
2020/02/26 Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
2020/03/10 Python
matplotlib quiver箭图绘制案例
2020/04/17 Python
英国男士时尚购物网站:Stuarts London
2017/10/22 全球购物
Ruby如何创建一个线程
2013/03/10 面试题
地理教师岗位职责
2014/03/16 职场文书
政风行风建设整改方案
2014/10/27 职场文书
2014年辅导员工作总结
2014/11/18 职场文书
离婚协议书格式
2015/01/26 职场文书
幼儿园六一主持词
2015/06/30 职场文书
上级领导检查欢迎词
2015/09/30 职场文书
创业计划书之家教中心
2019/09/25 职场文书
LayUI+Shiro实现动态菜单并记住菜单收展的示例
2021/05/06 Javascript
python实现的人脸识别打卡系统
2021/05/08 Python
叶县这家生产军用电台的兵工厂,人称“四机部”,走出一上将
2022/02/18 无线电
MySQL 外连接语法之 OUTER JOIN
2022/04/09 MySQL