《Python生成器》一节中,详细介绍了如何创建一个生成器,以及生成器的基础用法。本节将在其基础上,继续讲解和生成器有关的一些方法。

Python生成器send()方法

我们知道,通过调用 next() 或者 __next__() 方法,可以实现从外界控制生成器的执行。除此之外,通过 send() 方法,还可以向生成器中传值。

值得一提的是,send() 方法可带一个参数,也可以不带任何参数(用 None 表示)。其中,当使用不带参数的 send() 方法时,它和 next() 函数的功能完全相同。例如:

  1. def intNum():
  2. print("开始执行")
  3. for i in range(5):
  4. yield i
  5. print("继续执行")
  6. num = intNum()
  7. print(num.send(None))
  8. print(num.send(None))

程序执行结果为:

开始执行
0
继续执行
1

注意,虽然 send(None) 的功能是 next() 完全相同,但更推荐使用 next(),不推荐使用 send(None)。

这里重点讲解一些带参数的 send(value) 的用法,其具备 next() 函数的部分功能,即将暂停在 yield 语句出的程序继续执行,但与此同时,该函数还会将 value 值作为 yield 语句返回值赋值给接收者。

注意,带参数的 send(value) 无法启动执行生成器函数。也就是说,程序中第一次使用生成器调用 next() 或者 send() 函数时,不能使用带参数的 send() 函数。

举个例子:

  1. def foo():
  2. bar_a = yield "hello"
  3. bar_b = yield bar_a
  4. yield bar_b
  5. f = foo()
  6. print(f.send(None))
  7. print(f.send("C语言中文网"))
  8. print(f.send("http://c.biancheng.net"))

分析一下此程序的执行流程:
1) 首先,构建生成器函数,并利用器创建生成器(对象)f 。

2) 使用生成器 f 调用无参的 send() 函数,其功能和 next() 函数完全相同,因此开始执行生成器函数,即执行到第一个 yield "hello" 语句,该语句会返回 "hello" 字符串,然后程序停止到此处(注意,此时还未执行对 bar_a 的赋值操作)。

3) 下面开始使用生成器 f 调用有参的 send() 函数,首先它会将暂停的程序开启,同时还会将其参数“C语言中文网”赋值给当前 yield 语句的接收者,也就是 bar_a 变量。程序一直执行完 yield bar_a 再次暂停,因此会输出“C语言中文网”。

4) 最后依旧是调用有参的 send() 函数,同样它会启动餐厅的程序,同时将参数“http://c.biancheng.net”传给 bar_b,然后执行完 yield bar_b 后(输出 http://c.biancheng.net),程序执行再次暂停。

因此,该程序的执行结果为:

hello
C语言中文网
http://c.biancheng.net

Python生成器close()方法

当程序在生成器函数中遇到 yield 语句暂停运行时,此时如果调用 close() 方法,会阻止生成器函数继续执行,该函数会在程序停止运行的位置抛出 GeneratorExit 异常。

举个例子:

  1. def foo():
  2. try:
  3. yield 1
  4. except GeneratorExit:
  5. print('捕获到 GeneratorExit')
  6. f = foo()
  7. print(next(f))
  8. f.close()

程序执行结果为:

1
捕获到 GeneratorExit

注意,虽然通过捕获 GeneratorExit 异常,可以继续执行生成器函数中剩余的代码,带这部分代码中不能再包含 yield 语句,否则程序会抛出 RuntimeError 异常。例如:

  1. def foo():
  2. try:
  3. yield 1
  4. except GeneratorExit:
  5. print('捕获到 GeneratorExit')
  6. yield 2 #抛出 RuntimeError 异常
  7. f = foo()
  8. print(next(f))
  9. f.close()

程序执行结果为:

1
捕获到 GeneratorExit Traceback (most recent call last):
  File "D:\python3.6\1.py", line 10, in <module>
    f.close()
RuntimeError: generator ignored GeneratorExit

另外,生成器函数一旦使用 close() 函数停止运行,后续将无法再调用 next() 函数或者 __next__() 方法启动执行,否则会抛出 StopIteration 异常。例如:

  1. def foo():
  2. yield "c.biancheng.net"
  3. print("生成器停止执行")
  4. f = foo()
  5. print(next(f)) #输出 "c.biancheng.net"
  6. f.close()
  7. next(f) #原本应输出"生成器停止执行"

程序执行结果为:

c.biancheng.net
Traceback (most recent call last):
  File "D:\python3.6\1.py", line 8, in <module>
    next(f) #原本应输出"生成器停止执行"
StopIteration

Python生成器throw()方法

生成器 throw() 方法的功能是,在生成器函数执行暂停处,抛出一个指定的异常,之后程序会继续执行生成器函数中后续的代码,直到遇到下一个 yield 语句。需要注意的是,如果到剩余代码执行完毕没有遇到下一个 yield 语句,则程序会抛出 StopIteration 异常。

举个例子:

  1. def foo():
  2. try:
  3. yield 1
  4. except ValueError:
  5. print('捕获到 ValueError')
  6. f = foo()
  7. print(next(f))
  8. f.throw(ValueError)

程序执行结果为:

1
捕获到 ValueError
Traceback (most recent call last):
  File "D:\python3.6\1.py", line 9, in <module>
    f.throw(ValueError)
StopIteration

显然,一开始生成器函数在 yield 1 处暂停执行,当执行 throw() 方法时,它会先抛出 ValueError 异常,然后继续执行后续代码找到下一个 yield 语句,该程序中由于后续不再有 yield 语句,因此程序执行到最后,会抛出一个 StopIteration 异常。

Python生成器(send,close,throw)方法详解相关推荐

  1. python画简单的图形的代码-Python实现画图软件功能方法详解

    概述 虽然Python的强项在人工智能,数据处理方面,但是对于日常简单的应用,Python也提供了非常友好的支持(如:Tkinter),本文主要一个简单的画图小软件,简述Python在GUI(图形用户 ...

  2. python流获取控制台_对Python捕获控制台输出流的方法详解

    有时候我们的代码里可能要调用控制台命令,比如我想用Python写一个批量编译 .java 文件的脚本,用到如下代码 常规用法 os.system import os,traceback try: p ...

  3. python画图代码大全-Python实现画图软件功能方法详解

    概述 虽然Python的强项在人工智能,数据处理方面,但是对于日常简单的应用,Python也提供了非常友好的支持(如:Tkinter),本文主要一个简单的画图小软件,简述Python在GUI(图形用户 ...

  4. python中累加函数_对Python实现累加函数的方法详解

    对Python实现累加函数的方法详解 发布时间:2020-10-26 00:02:44 来源:脚本之家 阅读:120 作者:岚漾忆雨 这个需求比较奇怪,要求实现Sum和MagaSum函数,实现以下功能 ...

  5. python字符串format方法参数解释,一文秒懂!Python字符串格式化之format方法详解

    一文秒懂!Python字符串格式化之format方法详解 一文秒懂!Python字符串格式化之format方法详解 format是字符串内嵌的一个方法,用于格式化字符串.以大括号{}来标明被替换的字符 ...

  6. python按键脚本教程-在自动化中用python实现键盘操作的方法详解

    原来在robotframework中使用press key方法进行键盘的操作,但是该方法需要写被操作对象的locator,不是很方便,现在找到了一种win32api库写键盘操作的一个方法(注意:此方法 ...

  7. python3占位符详解_占位符最新:Python 占位符的使用方法详解_爱安网 LoveAn.com

    关于"占位符"的最新内容 聚合阅读 这篇文章主要介绍了Python 占位符的使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以 ...

  8. 【Python入门】Python字符串的45个方法详解

    Python中字符串对象提供了很多方法来操作字符串,功能相当丰富.必须进行全面的了解与学习,后面的代码处理才能更得心应手,编程水平走向新台阶的坚实基础.目前一共有45个方法,给大家分类整理,可以收藏查 ...

  9. python html文本 转义字符,python处理html转义字符的方法详解

    搜索热词 本文实例讲述了python处理html转义字符的方法.分享给大家供大家参考,具体如下: 最近在用Python处理网页数据时,经常遇到一些html转义字符(也叫html字符实体),例如< ...

  10. python中requests库的用途-数据爬虫(三):python中requests库使用方法详解

    有些网站访问时必须带有浏览器等信息,如果不传入headers就会报错,如下 使用 Requests 模块,上传文件也是如此简单的,文件的类型会自动进行处理: 因为12306有一个错误证书,我们那它的网 ...

最新文章

  1. 7个珍藏多年的网站,颠覆你的想象,值得收藏起来!
  2. 独立成分分析ICA、因子分析、LDA降维、NMF非负矩阵分解
  3. Halcon初学者知识:用set_paint直观显示图像的属性
  4. 没有域可以加文件服务器吗,文件服务器没有域
  5. [转]被当做狗和鸡来驱赶的百姓
  6. 独家 | 2019届互联网校招本科薪酬清单|湾区人工智能
  7. maven gradle等三放jar包仓库
  8. 关于在window下使用docker的备选方案
  9. 极客大学架构师训练营 大数据架构、Spark、Storm、Spark Streaming、Flink、HiBench、Impala 第25课 听课总结
  10. 奇妙生活-神奇的数字-1的故事
  11. MQTT客户端代码(C语言)
  12. 飞鹅WiFi打印机配置,php调用接口
  13. html图片excel路径,jsp方式导出Excel能不能导出图片_html/css_WEB-ITnose
  14. Easyexcel 获取表格具体位置的内容
  15. 问题:设计一个大学教师和学生管理程序, 教师包括 编号、姓名、职称和教研室 数据的输入输出; 大学生包括编号、姓名、性别、班号、英语、高等数学和数据结构三门课程成绩的输入输出和计算平均分; 研究生包
  16. mysql数据库搭建动态网站_数据库和动态网页怎么建立联系
  17. PyTorch深度学习基础之Reduction归约和自动微分操作讲解及实战(附源码 超详细必看)
  18. Linux (Centos)删除文件找回
  19. DRUCK德鲁克压力校验仪维修DPI620G-IS
  20. 《我的PaddlePaddle学习之路》笔记一——PaddlePaddle的安装

热门文章

  1. JavaScript高级程序设计(第三版)学习笔记1~5章
  2. 二维码类库--phpqrcode使用简介
  3. 基于InkCanvas实现的桌面涂鸦工具-[ WPF开发 ]
  4. ASP.NET MVC 环境配置,从1.0到2.0的转换和学习资源等
  5. sql 2005分区表
  6. 2021牛客多校3 - Kuriyama Mirai and Exclusive Or(差分+倍增)
  7. HDU - 5521 Meeting(最短路+思维建边)
  8. POJ1265(Pick定理的应用)
  9. 32.生命周期注释.rs
  10. C++ 私有成员变量的理解