浅谈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实现调用其他python脚本的方法
Oct 05 Python
Python THREADING模块中的JOIN()方法深入理解
Feb 18 Python
Python中的错误和异常处理简单操作示例【try-except用法】
Jul 25 Python
Python模拟登录的多种方法(四种)
Jun 01 Python
Python实现基于POS算法的区块链
Aug 07 Python
通过shell+python实现企业微信预警
Mar 07 Python
Python Django给admin添加Action的方法实例详解
Apr 29 Python
python实现的读取网页并分词功能示例
Oct 29 Python
Python filter过滤器原理及实例应用
Aug 18 Python
python查询MySQL将数据写入Excel
Oct 29 Python
Python requests HTTP验证登录实现流程
Nov 05 Python
Python生成九宫格图片的示例代码
Apr 14 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一些服务器端特性的配置加强php的安全
2006/10/09 PHP
用PHP 快速生成 Flash 动画的方法
2007/03/06 PHP
phpmyadmin打开很慢的解决方法
2014/04/21 PHP
PHP实现下载断点续传的方法
2014/11/12 PHP
php实现网站留言板功能
2015/11/04 PHP
Yii2-GridView 中让关联字段带搜索和排序功能示例
2017/01/21 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式二图文详解
2019/04/09 PHP
学习面向对象之面向对象的术语
2010/11/30 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
jQuery中detach()方法用法实例
2014/12/25 Javascript
jquery实现键盘左右翻页特效
2015/04/30 Javascript
JavaScript数组合并的多种方法
2016/05/22 Javascript
基于ES6 Array.of的用法(实例讲解)
2017/09/05 Javascript
详解使用Typescript开发node.js项目(简单的环境配置)
2017/10/09 Javascript
详解angular应用容器化部署
2018/08/14 Javascript
微信小程序图表插件wx-charts用法实例详解
2019/05/20 Javascript
Vue基于iview实现登录密码的显示与隐藏功能
2020/03/06 Javascript
JavaScript中变量提升和函数提升的详解
2020/08/07 Javascript
Python中为feedparser设置超时时间避免堵塞
2014/09/28 Python
Python自动化测试Eclipse+Pydev 搭建开发环境
2016/08/15 Python
TensorFlow实现卷积神经网络CNN
2018/03/09 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
2019/01/29 Python
浅谈python标准库--functools.partial
2019/03/13 Python
python实现猜数游戏(保存游戏记录)
2020/06/22 Python
iframe在移动端的缩放的示例代码
2018/10/12 HTML / CSS
美国在线轮胎零售商:SimpleTire
2019/04/08 全球购物
领先的荷兰线上超市:荷兰之家Holland at Home(支持中文)
2021/01/21 全球购物
水务局局长岗位职责
2013/11/28 职场文书
数控机械专业个人的自我评价
2014/01/02 职场文书
入党思想汇报
2014/01/05 职场文书
开学典礼决心书
2014/03/11 职场文书
孝敬父母的演讲稿
2014/05/14 职场文书
员工趣味活动方案
2014/08/27 职场文书
新兵入伍心得体会
2014/09/04 职场文书
授权收款委托书范本
2014/10/10 职场文书
Minikube搭建Kubernetes集群
2022/03/31 Servers