Python 生成器


一、生成器(generator)

  • Python 的生成器是一种特殊的程序,可以被用作控制循环的迭代行为。生成器可以暂时挂起函数,并保留函数的局部变量等数据,然后在再次调用它的时候,从上次暂停的位置继续执行下去。
  • 如果所要的序列的元素可以按照某种算法推算出来,可以采用迭代器一边循环一边计算的机制,这样就不必创建完整的序列,从而节省大量的空间。
  • Python 的生成器是迭代器的一种。
  • 协程是基于生成器实现的。

二、基于列表生成式的生成器

1、创建生成器:列表生成式的 [ ] 改成 ( )

# 创建一个生成器,查看其类型
g = (x * x for x in range(5))
print(g)
>>> <generator object <genexpr> at 0x00000173441AB2B0>

2、使用生成器:next()

每次调用next(g),就计算出生成器g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误

# 获得生成器的下一个值
next(g)
>>> 0
next(g)
>>> 1
......
next(g)
>>> Traceback (most recent call last):File "<stdin>", line 1, in <module>StopIteration# 遍历生成器
for n in g:print(n)
>>> 0 1 4 9 16

三、yield 生成器

1、创建生成器:yield

# 创建一个生成器,查看其类型
def f(n):i = 0while i < n:yield i**2i += 1return 'finish'g = f(5)
print(g)
>>> <generator object f at 0x000001F73626B2B0>

2、使用生成器:next()

# 遍历生成器
while True:try:x = next(g)print(x)except StopIteration as e:print('Generator return value:', e.value)break
>>> 0 1 4 9 16Generator return value: finish

3、生成器传递参数:send()

  • yield 语句执行返回操作后会马上挂起,等待接收值。send() 值时会马上进行赋值,如果没有接收者,会执行代码直至 yield 语句。
  • 启动生成器:.send(None),第一次使用 send(),这时候没有 yield 接收值,执行函数的初始化代码,直到 yield 语句,返回 yield 后面的值(语句的赋值操作没有执行),生成器挂起。
  • 生成器再次传递值:.send(n),生成器会先接收值 n 赋值给 yield 语句的变量,然后执行 yield 语句之后的代码,直至遇到下一个 yield 语句把 yield 后面的值返回给调用者,生成器再次挂起,等待接收值。
# 消费者
def consumer():r = ''while True:n = yield rif not n:returnprint('[CONSUMER] Consuming %s...' % n)r = 'done'# 生产者
def produce(c):c.send(None)n = 0while n < 5:n = n + 1print('[PRODUCER] Producing %s...' % n)r = c.send(n)print('[PRODUCER] Consumer return: %s' % r)c.close()c = consumer()
produce(c)>>> [PRODUCER] Producing 1...[CONSUMER] Consuming 1...[PRODUCER] Consumer return: done......[PRODUCER] Producing 5...[CONSUMER] Consuming 5...[PRODUCER] Consumer return: done

GOOD LUCK!


Python 生成器(yield)相关推荐

  1. js date 当前日志往后一个月_【应用实例】如何利用 Python 生成器 yield 监控日志?...

    Python 生成器 yield 是编写基于处理管道,流或数据流程序的一种极其强大的方式,在<Python参考手册>中有一则实例非常简单实用,略加修改,分享一下给大家.如果你对生成器yie ...

  2. python生成器yield原理_Python generator生成器和yield表达式详解

    前言 Python生成器(generator)并不是一个晦涩难懂的概念.相比于MetaClass和Closure等概念,其较为容易理解和掌握.但相对于程序结构:顺序.循环和分支而言其又不是特别的直观. ...

  3. python生成器yield原理_Python的迭代器和生成器 使用实例及yield的使用

    <派森>(Python)3.13 win32 英文安装版 类型:编程工具大小:21M语言:英文 评分:8.7 标签: 立即下载 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素 ...

  4. python生成器yield原理_生成器yield关键字详解

    鉴于yield关键字的原理大家理解的都不是很深刻,今天我们主要就这一课题进行探讨. 生成器可以用什么方式得到? 方法一: 利用推导式的方式得到生成器# 列表推导式 list1 = [i for i i ...

  5. Python生成器 yield

    迭代器与list相比较,就for in句型循环拿数据而言: 用list写很简洁,但如果list数据过大,会很消耗资源. 用iteration 迭代器写,则不会消耗那么多资源.他会随用随取,用一个拿一个 ...

  6. Python生成器next方法和send方法区别详解

    yield的语法规则是: 在yield这里暂停函数执行,并返回yield后面表达式的值(默认为None),直到被next()再次调用时,从上次暂停的yield代码处继续往下执行.当没有可继续next( ...

  7. python中yield的认识与学习|生成器

    接触python,yield就有点难度啦.都知道包含这个yield的函数就不是普通函数啦.就是一个生成器函数. 类型:<generator object test1 at 0x01D89220& ...

  8. python生成器单线程_【Python】迭代器、生成器、yield单线程异步并发实现详解

    转自http://blog.itpub.net/29018063/viewspace-2079767 大家在学习python开发时可能经常对迭代器.生成器.yield关键字用法有所疑惑,在这篇文章将从 ...

  9. Python 生成器 和 yield 关键字

    Python 中 yield 的作用:http://youchen.me/2017/02/10/Python-What-does-yield-do/# Python 生成器详解:http://codi ...

最新文章

  1. 微信公众号开发本地环境开发_如何在5分钟内使HTTPS在本地开发环境上工作
  2. 乐山师范计算机科学与技术怎么样,乐山师范学院计算机科学与技术(本科)教育概况...
  3. 关于Configuration.ConfigurationManager
  4. 生成release版本的Android系统
  5. Linux内核链表深度分析【转】
  6. 《系统集成项目管理工程师》必背100个知识点-49质量管理的流程
  7. android 代码 lut,Android BitmapFactory.decodeResource()错误或用于加载大LUT的替代选项...
  8. Lua 学习笔记(四)语句与控制结构
  9. IE是怎么处理meta steam的编码的 那100+个xss
  10. python distance matrix_机器学习中的距离盘点
  11. CSS color设置与调色板
  12. php大文件去重,详细解说PHP多个进程配合redis的有序集合实现大文件去重
  13. go语言swag注解示例
  14. 建筑设计的未来是什么?| 建筑 · 人工智能专栏
  15. 「咕咕网校 - 基础省选」树上问题的进阶 by Drench
  16. week6 day4 并发编程之多线程 理论
  17. CVPR2019| 百度17篇CVPR论文学习记录(包含:无人驾驶、神经网络、GAN、无监督学习、目标检测)
  18. DSP RS232 RS485通信
  19. 二维表转换为一维列表
  20. mysql 备份多个库_使用mysqldump备份多个库

热门文章

  1. iptables基本配置方法
  2. 解析XML的4种方式及优缺点比较
  3. 手机app常见bug积累
  4. ObservableCollection 类 详解
  5. FastThreadLocal
  6. Linux下Makefile学习笔记
  7. Visual Subst - 简单将任意文件夹挂载模拟成驱动器盘符硬盘分区的小工具
  8. python爬虫scrapy步骤mac系统_python scrapy简单爬虫记录(实现简单爬取知乎)
  9. 解决PyCharm中报出 “Shadows built-in name xxx“ 的警告
  10. 【OpenCV入门学习笔记1】:Mat对象的指针操作和掩膜操作