浅谈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远程桌面协议RDPY安装使用介绍
Apr 15 Python
Python搜索引擎实现原理和方法
Nov 27 Python
Python logging管理不同级别log打印和存储实例
Jan 19 Python
python使用sqlite3时游标使用方法
Mar 13 Python
python随机在一张图像上截取任意大小图片的方法
Jan 24 Python
对python使用telnet实现弱密码登录的方法详解
Jan 26 Python
Python里字典的基本用法(包括嵌套字典)
Feb 27 Python
python opencv 二值化 计算白色像素点的实例
Jul 03 Python
Python+OpenCv制作证件图片生成器的操作方法
Aug 21 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
Apr 07 Python
Python开发.exe小工具的详细步骤
Jan 27 Python
用Python简陋模拟n阶魔方
Apr 17 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 Calender(日历)代码分享
2014/01/03 PHP
php关联数组快速排序的方法
2015/04/17 PHP
100行PHP代码实现socks5代理服务器
2016/04/28 PHP
深入解析PHP中SESSION反序列化机制
2017/03/01 PHP
window.open以post方式将内容提交到新窗口
2012/12/26 Javascript
Javascript实现禁止输入中文或英文的例子
2014/12/09 Javascript
jquery实现倒计时效果
2015/12/14 Javascript
js贪吃蛇游戏实现思路和源码
2016/04/14 Javascript
js实现动态创建的元素绑定事件
2016/07/19 Javascript
超全面的JavaScript开发规范(推荐)
2017/01/21 Javascript
Webpack打包慢问题的完美解决方法
2017/03/16 Javascript
JavaScript实现的简单加密解密操作示例
2018/06/01 Javascript
vue中axios的封装问题(简易版拦截,get,post)
2018/06/15 Javascript
基于Node.js的大文件分片上传示例
2019/06/19 Javascript
[41:21]夜魇凡尔赛茶话会 第三期02:看图识人
2021/03/11 DOTA
Python输出汉字字库及将文字转换为图片的方法
2016/06/04 Python
利用Django内置的认证视图实现用户密码重置功能详解
2017/11/24 Python
基于python进行桶排序与基数排序的总结
2018/05/29 Python
python实现音乐下载的统计
2018/06/20 Python
python实现三次样条插值
2018/12/17 Python
python3去掉string中的标点符号方法
2019/01/22 Python
python多线程抽象编程模型详解
2019/03/20 Python
python调用webservice接口的实现
2019/07/12 Python
python Web flask 视图内容和模板实现代码
2019/08/23 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
2020/08/07 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
2021/03/03 Python
Expedia英国:全球最大的在线旅游公司
2017/09/07 全球购物
应届生幼儿园求职信
2013/11/12 职场文书
自荐书4要点
2014/01/25 职场文书
房地产营销策划方案
2014/02/08 职场文书
教师敬业奉献模范事迹材料
2014/05/18 职场文书
上海世博会口号
2014/06/19 职场文书
工作作风整顿个人剖析材料
2014/10/11 职场文书
交通安全学习心得体会
2016/01/18 职场文书
虚拟机linux端mysql数据库无法远程访问的解决办法
2021/05/26 MySQL
动态规划之使用备忘录来改进Javascript函数
2022/04/07 Javascript