迭代器

迭代器协议

对象必须提供一个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中的生成器和迭代器相关推荐

  1. python生成器和迭代器作用_浅谈Python中的生成器和迭代器

    迭代器 迭代器协议 对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么返回一个异常来终止本次迭代.(只能往前走,不能往后退!) 迭代器对象 遵循了(实现了)迭代器协议的对象.(对象内 ...

  2. python hasattr函数_浅谈python中的getattr函数 hasattr函数

    hasattr(object, name) 作用:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(ojbect, name)是否抛出异常来实现的). 示例: & ...

  3. python编写函数_浅谈Python 函数式编程

    匿名函数lambda表达式 什么是匿名函数? 匿名函数,顾名思义就是没有名字的函数,在程序中不用使用 def 进行定义,可以直接使用 lambda 关键字编写简单的代码逻辑.lambda 本质上是一个 ...

  4. python static方法_浅谈python 类方法/静态方法

    1.类方法 类方法是从属于"类对象"的方法.类对象可以通过装饰器@classmethod来定义,具体格式如下: @classmethod def 类方法名(cls [, 形参列表] ...

  5. python表格对齐_浅谈python str.format与制表符\t关于中文对齐的细节问题

    写了一个练手的爬虫...在输出的时候出现了让人很不愉♂悦的问题 像这样: 令人十分难受啊! #------------------------------------------ 在此之前先说一下py ...

  6. python未定义_浅谈Python程序的错误:变量未定义

    Python程序的错误种类 Python程序的错误分两种.一种是语法错误(syntax error).这种错误是语句的书写不符合Python语言的语法规定.第二种是逻辑错误(logic error). ...

  7. python制表符对齐_浅谈python str.format与制表符\t关于中文对齐的细节问题

    写了一个练手的爬虫...在输出的时候出现了让人很不愉♂悦的问题 像这样: 令人十分难受啊! #------------------------------------------ 在此之前先说一下py ...

  8. python float 精度_浅谈Python里面小数点精度的控制

    要求较小的精度 round()内置方法 这个是使用最多的,刚看了round()的使用解释,也不是很容易懂.round()不是简单的四舍五入的处理方式. For the built-in types s ...

  9. python字符串操作_浅谈Python 字符串特有的操作方法

    来源:(微信号:python_cat)" 正如<你真的知道Python的字符串是什么吗?>所写,Python中字符串是由Uniocde编码的字符组成的不可变序列,它具备与其它序列 ...

最新文章

  1. 用于RGB-D显著目标检测的自监督表示学习
  2. 两个input在一行让它们能对齐
  3. LTE 有关HARQ
  4. 【盘它!】那些让效率MAX的工具和方法(Mac篇)
  5. PHP验证码相关函数
  6. Linux下使用g++编译C++程序——Compiling Cpp
  7. linux c变量命名规则,C语言中变量名及函数名的命名规则与驼峰命名法
  8. C#获得SQLServer服务器名、数据库名、表名、以及字段名
  9. 视频去水印,去水印微信小程序,短视频去水印微信小程序,免费去除视频水印
  10. 子进程 已安装 pre-removal 脚本 返回了错误号 1或2 与 子进程 已安装 post-installation 脚本 返回了错误号 1或2
  11. 51c语言编程入门教程,51单片机C语言入门教程
  12. 网页弹出窗口代码全攻略
  13. halcon 条形码识别(持续更新)
  14. win7电脑如何提升开机速度?
  15. 基于Java的实验室预约管理系统
  16. __stack_chk_fail问题及解决方案
  17. 华为交换机调试软件_无忌之谈华为005丨 “华为系”黄埔军校诞生记
  18. 张学友 - 蓝雨(粤)
  19. 深圳市威视爱普手术示教系统
  20. 牛顿下山法(C++版)

热门文章

  1. 引导linux的工具下载,多系统引导工具(BootThink)下载_多系统引导工具(BootThink)官方下载-太平洋下载中心...
  2. 移动端引导页UI设计临摹模板,ui设计师进阶必备
  3. html质感阴影_CSS3 阴影(text-shadow)
  4. 错过就找不到了 Java API文档 免费下载!!!
  5. SVGA转html最快方法(使用Python直接转)
  6. gettid()和pthread_self()的区别
  7. C语言骚操作:结构体初始化方法
  8. c++函数可变参数列表foo(int a, ...){}中的省略号“...”
  9. css动画逐帧播放、缩放
  10. java编程思想2_《JAVA编程思想2》笔记