Python生成器和迭代器


作者:王大为
时间:2016-10-24 11:00


一、生成器generator

分为以下两种:

1、列表生成器,形如:( i * i for i in range(10))
2、函数生成器,yield关键字

1、列表生成器


1.1、第一种情况(基本)
代码code:

结果result:


1.2、第二种情况(if判断)
代码code:

结果result:


1.3、第三种情况(循环for嵌套)
代码code:

结果result:


1.4、第四种情况(使用字典)
代码code:

结果result:


2、函数生成器
和函数一起使用:可以使函数中断并保存函数的中断状态,yield关键字,可以减少程序的阻塞


2.1、next()方法

yield 对应值:调用__next__()方法时返回的值
例如yield a,则__next__()方法时返回ayield + 后面的值:整个表达式为none(send函数传递的就是整个表达式的值进去)1、例如c = yield a,则c为None2、例如c = yield a,并且send('hello'),则c为'hello'

代码code:

def fib(s):n, a, b = 0, 0, 1while n < s:print('-------')yield bprint('hello')a, b = b, a + bn += 1return 'out of range'fib_gen = fib(5)
a = fib_gen.__next__()
print(a)

结果result:


2.2、异常StopIteration

异常的信息value就是函数生成器的return返回值信息

代码code:

def fib(s):n, a, b = 0, 0, 1while n < s:print('-------')yield ba, b = b, a + bn += 1return 'out of range'fib_gen = fib(5)
for i in range(6):try:print(fib_gen.__next__())except StopIteration as e:print(e.value)

结果result:


2.3、send()方法

生成器的send方法可以传递整个表达式(yield a)的值需要注意的是:生成器必须被运行后才可以使用send方法,表现为必须首先调用__next__方法,然后才可以使用send方法原因:就是python中,在执行fib_gen = fib(5),并没有进入函数内部执行,这个时候,只是把fib_gen定义为了一个生成器;只有等fib_gen被执行了以后,才会启动生成器;所以在python代码里面,send比yield还早,这是有问题的需要首先添加fib_gen.__next__()方法

2.3.1、直接调用send方法
代码code:

def fib(s):n, a, b = 0, 0, 1while n < s:a = yield bprint(a)n += 1return 'out of range'fib_gen = fib(5)
fib_gen.send('hello')

结果result:


2.3.2、首先next()启动生成器,然后调用send方法
代码code:

def fib(s):n, a, b = 0, 0, 1while n < s:a = yield bprint(a)n += 1return 'out of range'fib_gen = fib(5)
fib_gen.__next__()
fib_gen.send('hello')

结果result:


二、迭代器iterator


1、迭代器的组成分类

一类是集合数据类型,例如:list,tuple,dict,set,str等
一类是generator对象,包括列表生成器和带yield的generator function

2、可迭代对象
定义:凡是可作用于for循环的对象都是iterable类型,可迭代对象

判断:使用isinstance()函数判断是否是可迭代对象
代码code:

from collections import Iterable
a = isinstance([], Iterable)
b = isinstance((), Iterable)
c = isinstance('', Iterable)
d = isinstance({}, Iterable)
e = isinstance(12, Iterable)
print(a)
print(b)
print(c)
print(d)
print(e)

结果result:


3、迭代器
定义:凡是可作用于next()的对象都是iterator类型,迭代器


4、可迭代对象——>迭代器的转化,iter()内置函数,将iterable可迭代对象转化为iterator迭代器
代码code:

from collections import Iterator
a = isinstance([], Iterator)
b = isinstance(iter(()), Iterator)print(a)
print(b)

结果result:


5、总结

生成器一定是迭代器,但是迭代器不一定是生成器(集合数据类型转化的迭代器)可作用于for循环的对象是可迭代对象可作用于next()的对象是迭代器可迭代对象可以通过iter()函数转化为迭代器

Python的生成器和迭代器相关推荐

  1. [转载] Python中生成器和迭代器的区别

    参考链接: Python迭代器 Python中生成器和迭代器的区别(代码在Python3.5下测试): Num01–>迭代器 定义: 对于list.string.tuple.dict等这些容器对 ...

  2. python 面试生成器和迭代器_Python 中的迭代器与生成器

    导读 这篇文章主要介绍了 python 当中的迭代器与生成器,在涉及到大数量的场景应该考虑使用迭代器与生成器. 原文链接: https://russellgao.cn/python-iter/ 可迭代 ...

  3. python迭代器创建序列_第五章:Python基础の生成器、迭代器、序列化和虚拟环境的应用...

    本课主题 生成器介紹和操作实战 迭代器介紹和操作实战 序例化和反序例化 Json 和 Pickle 操作实战 字符串格式化的应用 创建虚拟环境实战 本周作业 生成器介紹和操作实战 什么是生成器,生成器 ...

  4. 彻底理解Python生成器和迭代器

    目录 1.列表生成式 2.生成器 3.迭代器 4.对yield的总结 5.补充:itertools库学习 1.列表生成式 首先举个例子 现在有个需求,看列表 [0,1,2,3,4,5,6,7,8,9] ...

  5. Python生成器与迭代器详细教程

    一.列表生成器 首先举个例子 现在有个需求,看列表 [0,1,2,3,4,5,6,7,8,9],要求你把列表里面的每个值加1,你怎么实现呢? 方法一(简单): info = [0, 1, 2, 3, ...

  6. 完全理解 Python 迭代对象、迭代器、生成器(转)

    完全理解 Python 迭代对象.迭代器.生成器 本文源自RQ作者的一篇博文,原文是Iterables vs. Iterators vs. Generators » nvie.com,俺写的这篇文章是 ...

  7. Python高级特性:切片、迭代、列表生成式、生成器与迭代器

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 接着廖雪峰老师的学习教程,小编要开始加快推进Python的学习进程 ...

  8. Python(迭代、三元表达式、列表生成、生成器、迭代器)

    迭代 什么是迭代1 重复2 下次重复一定是基于上一次的结果而来 如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration). 在 ...

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

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

最新文章

  1. html怎么让导航栏平均分布,CSS 怎么让按钮平均分布
  2. 90后斯坦福博士论文登Science封面!AI算法准确预测RNA三维结构
  3. 谷歌 Pixel 4 人像模式拍照算法揭秘
  4. oracle一个表拆成多个表,oracle拆分函数,将字符串拆分成多行多字段表数据
  5. Linux 快捷键记录栏
  6. c# mysql varbinary_数据库中用varbinary存储二进制数据
  7. Favicon网页收藏图标在线制作PHP网站源码/ICO图片在线生成/支持多种图片格式转换
  8. css样式表的作用和意义,什么是CSS?
  9. Python-Locust接口压力测试
  10. javascript 中文转拼音代码
  11. python成功安装cartopy之后,调用crs时却出现错误,如何解决
  12. 央视名嘴转播欧洲冠军杯
  13. Jmeter如何分析压测结果
  14. IDEA 文件夹颜色对目录的影响分析
  15. 注册非公共邮箱,学校邮箱
  16. 《实践论》、《矛盾论》
  17. libreoffice calc 插入多行
  18. 【AppCan开发者故事 第九期】泡泡:KTV包厢里的移动开发技术
  19. 4万字总结,关于数据仓库与数据湖
  20. Omnifocus使用1【基础篇】

热门文章

  1. jieba对红楼梦进行分词(一)
  2. fluent并行 linux_Ansys 14中Fluent并行计算MPI全程详解
  3. 山西应用科技学院计算机应用在哪个校区,山西应用科技学院有几个校区,哪个校区最好及各校区介绍...
  4. 站在程序员的角度,来谈谈B站的《后浪》,真情流露
  5. 及时止损,及时止损,及时止损
  6. python读xml文件生成.h头文件_Python创建xml文件示例
  7. Java—学生管理系统使用文件永久存储
  8. selenium 火狐下载弹框去除
  9. 超全教授svg图标素材网站整理
  10. 电商微营销茶会第2期 | “微信营销、淘宝成交”玩法解析