浅谈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 内置函数小结
Aug 09 Python
在Python中处理列表之reverse()方法的使用教程
May 21 Python
Python3 replace()函数使用方法
Mar 19 Python
python爬虫之快速对js内容进行破解
Jul 09 Python
OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现
Nov 25 Python
numpy创建单位矩阵和对角矩阵的实例
Nov 29 Python
Django Form and ModelForm的区别与使用
Dec 06 Python
Python如何把Spark数据写入ElasticSearch
Apr 18 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
Nov 18 Python
Python+Appium自动化测试的实战
Jun 30 Python
python 中的jieba分词库
Nov 23 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实现的简单AES加密解密算法实例
2017/05/29 PHP
Laravel实现定时任务的示例代码
2017/08/10 PHP
屏蔽相应键盘按钮操作
2014/03/10 Javascript
jQuery实现倒计时按钮功能代码分享
2014/09/03 Javascript
基于jQuery.Hz2Py.js插件实现的汉字转拼音特效
2015/05/07 Javascript
利用jquery实现瀑布流3种案例
2016/09/18 Javascript
详解打造 Vue.js 可复用组件
2017/03/24 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
2017/03/24 jQuery
bootstrap多层模态框滚动条消失的问题
2017/07/21 Javascript
vue实现双向绑定和依赖收集遇到的坑
2018/11/29 Javascript
JS数组中对象去重操作示例
2019/06/04 Javascript
js与jquery获取input输入框中的值实例讲解
2020/02/27 jQuery
原生js实现表格翻页和跳转
2020/09/29 Javascript
[03:41]DOTA2上海特锦赛小组赛第三日recap精彩回顾
2016/02/28 DOTA
python Django模板的使用方法(图文)
2013/11/04 Python
Python接收Gmail新邮件并发送到gtalk的方法
2015/03/10 Python
Python多线程编程简单介绍
2015/04/13 Python
Python按行读取文件的简单实现方法
2016/06/22 Python
详解python实现线程安全的单例模式
2018/03/05 Python
Python使用cx_Oracle模块操作Oracle数据库详解
2018/05/07 Python
python使用wxpy轻松实现微信防撤回的方法
2019/02/21 Python
详解pandas中MultiIndex和对象实际索引不一致问题
2019/07/23 Python
Django+zTree构建组织架构树的方法
2019/08/21 Python
简单了解django处理跨域请求最佳解决方案
2020/03/25 Python
Python高并发和多线程有什么关系
2020/11/14 Python
纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)
2014/05/07 HTML / CSS
HTML5 Canvas绘制五星红旗
2016/05/04 HTML / CSS
Kidsroom台湾:来自德国的婴儿用品
2017/12/11 全球购物
英国领先的独立时装店:Van Mildert
2019/10/28 全球购物
大学生大二自我鉴定
2013/10/28 职场文书
前台接待的工作职责
2013/11/21 职场文书
公司成立感言
2014/01/11 职场文书
公司年会演讲稿范文
2014/01/11 职场文书
融资租赁计划书
2014/04/29 职场文书
超级实用!五步法则,教你写好年终工作总结
2019/12/05 职场文书
《金肉人》米特&《航海王》阿鹤声优松岛实因胰脏癌去世 享寿81岁
2022/04/13 日漫