浅谈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解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
Jul 06 Python
pyQt4实现俄罗斯方块游戏
Jun 26 Python
钉钉群自定义机器人消息Python封装的实例
Feb 20 Python
python写程序统计词频的方法
Jul 29 Python
python进程的状态、创建及使用方法详解
Dec 06 Python
Python调用.NET库的方法步骤
Dec 27 Python
Python3.7实现验证码登录方式代码实例
Feb 14 Python
django2.2 和 PyMySQL版本兼容问题
Feb 17 Python
vue学习笔记之动态组件和v-once指令简单示例
Feb 29 Python
django模型动态修改参数,增加 filter 字段的方式
Mar 16 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
Mar 30 Python
pycharm专业版远程登录服务器的详细教程
Sep 15 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
菜鸟修复电子管记
2021/03/02 无线电
Linux下CoreSeek及PHP扩展模块的安装
2012/09/23 PHP
LotusPhp笔记之:Logger组件的使用方法
2013/05/06 PHP
编译php 5.2.14+fpm+memcached(具体操作详解)
2013/06/18 PHP
PHP开发Apache服务器配置
2015/07/15 PHP
php实现将数组或对象写入到文件的方法小结【三种方法】
2020/04/22 PHP
json 定义
2008/06/10 Javascript
JQuery表格内容过滤的实现方法
2013/07/05 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
2013/11/03 Javascript
js css 实现遮罩层覆盖其他页面元素附图
2014/09/22 Javascript
jQuery验证插件validate使用方法详解
2020/09/13 Javascript
浅谈react-native热更新react-native-pushy集成遇到的问题
2017/09/30 Javascript
在vue中实现简单页面逆传值的方法
2017/11/27 Javascript
JS实现利用两个队列表示一个栈的方法
2017/12/13 Javascript
webpack3里使用uglifyjs压缩js时打包报错的解决
2018/12/13 Javascript
vue 表单之通过v-model绑定单选按钮radio
2019/05/13 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
2020/05/26 Javascript
ng-alain的sf如何自定义部件的流程
2020/06/12 Javascript
python中的列表推导浅析
2014/04/26 Python
Python xlrd读取excel日期类型的2种方法
2015/04/28 Python
flask中过滤器的使用详解
2018/08/01 Python
python文件操作之批量修改文件后缀名的方法
2018/08/10 Python
python使用PIL给图片添加文字生成海报示例
2018/08/17 Python
解决python3中的requests解析中文页面出现乱码问题
2019/04/19 Python
python 读写excel文件操作示例【附源码下载】
2019/06/19 Python
Python3+Appium安装使用教程
2019/07/05 Python
python db类用法说明
2020/07/07 Python
如何利用Python动态模拟太阳系运转
2020/09/04 Python
CHARLES & KEITH加拿大官网:新加坡时尚品牌
2020/03/26 全球购物
俄罗斯三星品牌商店:GalaxyStore
2020/11/04 全球购物
市级文明单位申报材料
2014/05/07 职场文书
大气污染防治方案
2014/05/19 职场文书
企业环保标语
2014/06/10 职场文书
2014年国庆节活动总结
2014/08/26 职场文书
写给老师的感谢信
2015/01/20 职场文书
会计出纳岗位职责
2015/03/31 职场文书