python 迭代器协议_浅谈Python中的生成器和迭代器
迭代器
迭代器协议
对象必须提供一个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)
生成器表达式
类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表,按需取出对象
注意生成器 用()包裹起来
>>> generator = (i for i in range(10))
>>> generator.__next__()
0
>>> generator.__next__()
1
>>> type(generator)
以上就是浅谈Python中的生成器和迭代器的详细内容,更多关于Python 生成器和迭代器的资料请关注python博客其它相关文章!
python 迭代器协议_浅谈Python中的生成器和迭代器相关推荐
- python生成器和迭代器作用_浅谈Python中的生成器和迭代器
迭代器 迭代器协议 对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么返回一个异常来终止本次迭代.(只能往前走,不能往后退!) 迭代器对象 遵循了(实现了)迭代器协议的对象.(对象内 ...
- python hasattr函数_浅谈python中的getattr函数 hasattr函数
hasattr(object, name) 作用:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(ojbect, name)是否抛出异常来实现的). 示例: & ...
- python编写函数_浅谈Python 函数式编程
匿名函数lambda表达式 什么是匿名函数? 匿名函数,顾名思义就是没有名字的函数,在程序中不用使用 def 进行定义,可以直接使用 lambda 关键字编写简单的代码逻辑.lambda 本质上是一个 ...
- python static方法_浅谈python 类方法/静态方法
1.类方法 类方法是从属于"类对象"的方法.类对象可以通过装饰器@classmethod来定义,具体格式如下: @classmethod def 类方法名(cls [, 形参列表] ...
- python表格对齐_浅谈python str.format与制表符\t关于中文对齐的细节问题
写了一个练手的爬虫...在输出的时候出现了让人很不愉♂悦的问题 像这样: 令人十分难受啊! #------------------------------------------ 在此之前先说一下py ...
- python未定义_浅谈Python程序的错误:变量未定义
Python程序的错误种类 Python程序的错误分两种.一种是语法错误(syntax error).这种错误是语句的书写不符合Python语言的语法规定.第二种是逻辑错误(logic error). ...
- python制表符对齐_浅谈python str.format与制表符\t关于中文对齐的细节问题
写了一个练手的爬虫...在输出的时候出现了让人很不愉♂悦的问题 像这样: 令人十分难受啊! #------------------------------------------ 在此之前先说一下py ...
- python float 精度_浅谈Python里面小数点精度的控制
要求较小的精度 round()内置方法 这个是使用最多的,刚看了round()的使用解释,也不是很容易懂.round()不是简单的四舍五入的处理方式. For the built-in types s ...
- python字符串操作_浅谈Python 字符串特有的操作方法
来源:(微信号:python_cat)" 正如<你真的知道Python的字符串是什么吗?>所写,Python中字符串是由Uniocde编码的字符组成的不可变序列,它具备与其它序列 ...
最新文章
- 用于RGB-D显著目标检测的自监督表示学习
- 两个input在一行让它们能对齐
- LTE 有关HARQ
- 【盘它!】那些让效率MAX的工具和方法(Mac篇)
- PHP验证码相关函数
- Linux下使用g++编译C++程序——Compiling Cpp
- linux c变量命名规则,C语言中变量名及函数名的命名规则与驼峰命名法
- C#获得SQLServer服务器名、数据库名、表名、以及字段名
- 视频去水印,去水印微信小程序,短视频去水印微信小程序,免费去除视频水印
- 子进程 已安装 pre-removal 脚本 返回了错误号 1或2 与 子进程 已安装 post-installation 脚本 返回了错误号 1或2
- 51c语言编程入门教程,51单片机C语言入门教程
- 网页弹出窗口代码全攻略
- halcon 条形码识别(持续更新)
- win7电脑如何提升开机速度?
- 基于Java的实验室预约管理系统
- __stack_chk_fail问题及解决方案
- 华为交换机调试软件_无忌之谈华为005丨 “华为系”黄埔军校诞生记
- 张学友 - 蓝雨(粤)
- 深圳市威视爱普手术示教系统
- 牛顿下山法(C++版)
热门文章
- 引导linux的工具下载,多系统引导工具(BootThink)下载_多系统引导工具(BootThink)官方下载-太平洋下载中心...
- 移动端引导页UI设计临摹模板,ui设计师进阶必备
- html质感阴影_CSS3 阴影(text-shadow)
- 错过就找不到了 Java API文档 免费下载!!!
- SVGA转html最快方法(使用Python直接转)
- gettid()和pthread_self()的区别
- C语言骚操作:结构体初始化方法
- c++函数可变参数列表foo(int a, ...){}中的省略号“...”
- css动画逐帧播放、缩放
- java编程思想2_《JAVA编程思想2》笔记