浅谈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操作MySQL数据库具体方法
Oct 28 Python
python查找第k小元素代码分享
Dec 18 Python
用Python的Django框架编写从Google Adsense中获得报表的应用
Apr 17 Python
在Python中使用HTML模版的教程
Apr 29 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
Dec 19 Python
python集合的创建、添加及删除操作示例
Oct 08 Python
基于django 的orm中非主键自增的实现方式
May 18 Python
python里的单引号和双引号的有什么作用
Jun 17 Python
Python headers请求头如何实现快速添加
Nov 03 Python
python如何编写类似nmap的扫描工具
Nov 06 Python
详解Pytorch显存动态分配规律探索
Nov 17 Python
Python利用capstone实现反汇编
Apr 06 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常用代码
2006/11/23 PHP
30 个很棒的PHP开源CMS内容管理系统小结
2011/10/14 PHP
如何在php中正确的使用json
2013/08/06 PHP
PHP统计二维数组元素个数的方法
2013/11/12 PHP
PHP实现字母数字混合验证码功能
2019/07/11 PHP
Laravel实现ApiToken认证请求
2019/10/14 PHP
新闻内页-JS分页
2006/06/07 Javascript
匹配任意字符的正则表达式写法
2010/04/29 Javascript
JavaScript访问样式表代码
2010/10/15 Javascript
Backbone.js中的集合详解
2015/01/14 Javascript
laypage分页控件使用实例详解
2016/05/19 Javascript
jQuery实现查找链接文字替换属性的方法
2016/06/27 Javascript
bootstrap datepicker限定可选时间范围实现方法
2016/09/28 Javascript
JS刷新父窗口的几种方式小结(推荐)
2016/11/09 Javascript
自己封装的一个简单的倒计时功能实例
2016/11/23 Javascript
AJAX和jQuery动态加载数据的实现方法
2016/12/05 Javascript
完美实现js选项卡切换效果(一)
2017/03/08 Javascript
详解在AngularJS的controller外部直接获取$scope
2017/06/02 Javascript
javascript实现电脑和手机版样式切换
2017/11/10 Javascript
JavaScript去掉数组重复项的方法分析【测试可用】
2018/07/19 Javascript
微信小程序常用赋值方法小结
2019/04/30 Javascript
小程序中this.setData的使用和注意事项
2019/08/28 Javascript
vue.js实现二级菜单效果
2019/10/19 Javascript
vue实现循环滚动列表
2020/06/30 Javascript
Python2.7下安装Scrapy框架步骤教程
2017/12/22 Python
Python TestCase中的断言方法介绍
2019/05/02 Python
我们为什么要减少Python中循环的使用
2019/07/10 Python
Pytorch实现WGAN用于动漫头像生成
2021/03/04 Python
深入理解css属性的选择对动画性能的影响
2016/04/20 HTML / CSS
html5 标签
2009/07/16 HTML / CSS
火锅店营销方案
2014/02/26 职场文书
党员廉洁自律承诺书
2014/05/26 职场文书
大学新生军训自我鉴定
2014/09/18 职场文书
给校长的一封检讨书
2014/09/20 职场文书
销售业务员岗位职责
2015/02/13 职场文书
公司安全管理制度范本
2015/08/05 职场文书