浅谈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 encode和decode的妙用
Sep 02 Python
Python迭代用法实例教程
Sep 08 Python
零基础写python爬虫之爬虫的定义及URL构成
Nov 04 Python
python中使用xlrd、xlwt操作excel表格详解
Jan 29 Python
基于python(urlparse)模板的使用方法总结
Oct 13 Python
python实现多线程网页下载器
Apr 15 Python
解决pycharm运行时interpreter为空的问题
Oct 29 Python
PyQt QCombobox设置行高的方法
Jun 20 Python
在Pycharm中调试Django项目程序的操作方法
Jul 17 Python
python3 tkinter实现添加图片和文本
Nov 26 Python
pycharm的python_stubs问题
Apr 08 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
Jun 03 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
Smarty模板快速入门
2007/01/04 PHP
PHP+mysql实现从数据库获取下拉树功能示例
2017/01/06 PHP
Laravle eloquent 多对多模型关联实例详解
2017/11/22 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
在网页里看flash的trace数据的js类
2009/01/10 Javascript
jQuery TextBox自动完成条
2009/07/22 Javascript
javascript动画之圆形运动,环绕鼠标运动作小球
2010/07/20 Javascript
JS获取html对象的几种方式介绍
2013/12/05 Javascript
js返回上一页并刷新的多种实现方法
2014/02/26 Javascript
javascript制作的简单注册模块表单验证
2015/04/13 Javascript
javascript实现点击提交按钮后显示loading的方法
2015/07/03 Javascript
JavaScript观察者模式(经典)
2015/12/09 Javascript
详解Bootstrap创建表单的三种格式(一)
2016/01/04 Javascript
如何让一个json文件显示在表格里【实现代码】
2016/05/09 Javascript
详解jQuery选择器
2016/12/21 Javascript
ES6新特性四:变量的解构赋值实例
2017/04/21 Javascript
React-native桥接Android原生开发详解
2018/01/17 Javascript
vue+webpack 打包文件 404 页面空白的解决方法
2018/02/28 Javascript
AngularJS使用Filter自定义过滤器控制ng-repeat去除重复功能示例
2018/04/21 Javascript
原生JS实现的放大镜特效示例【测试可用】
2018/12/08 Javascript
微信小程序实现卡片左右滑动效果的示例代码
2019/05/01 Javascript
p5.js实现简单货车运动动画
2019/10/23 Javascript
使用PreloadJS加载图片资源的基础方法详解
2020/02/03 Javascript
javascript+css实现俄罗斯方块小游戏
2020/06/28 Javascript
vue-video-player视频播放器使用配置详解
2020/10/23 Javascript
[02:44]DOTA2英雄基础教程 克林克兹
2014/01/15 DOTA
Python解决鸡兔同笼问题的方法
2014/12/20 Python
python实现简单的计时器功能函数
2015/03/14 Python
python的keyword模块用法实例分析
2015/06/30 Python
Python实现子类调用父类的初始化实例
2020/03/12 Python
python如何对链表操作
2020/10/10 Python
html5使用canvas实现弹幕功能示例
2017/09/11 HTML / CSS
Watchshop德国:欧洲在线手表No.1
2019/06/20 全球购物
爱我中华教学反思
2014/04/28 职场文书
党的生日演讲稿
2014/09/10 职场文书
领导班子对照检查剖析材料
2014/10/13 职场文书