Python生成器(send,close,throw)方法详解
《Python生成器》一节中,详细介绍了如何创建一个生成器,以及生成器的基础用法。本节将在其基础上,继续讲解和生成器有关的一些方法。
Python生成器send()方法
我们知道,通过调用 next() 或者 __next__() 方法,可以实现从外界控制生成器的执行。除此之外,通过 send() 方法,还可以向生成器中传值。
值得一提的是,send() 方法可带一个参数,也可以不带任何参数(用 None 表示)。其中,当使用不带参数的 send() 方法时,它和 next() 函数的功能完全相同。例如:
- def intNum():
- print("开始执行")
- for i in range(5):
- yield i
- print("继续执行")
- num = intNum()
- print(num.send(None))
- print(num.send(None))
程序执行结果为:
开始执行
0
继续执行
1
注意,虽然 send(None) 的功能是 next() 完全相同,但更推荐使用 next(),不推荐使用 send(None)。
这里重点讲解一些带参数的 send(value) 的用法,其具备 next() 函数的部分功能,即将暂停在 yield 语句出的程序继续执行,但与此同时,该函数还会将 value 值作为 yield 语句返回值赋值给接收者。
注意,带参数的 send(value) 无法启动执行生成器函数。也就是说,程序中第一次使用生成器调用 next() 或者 send() 函数时,不能使用带参数的 send() 函数。
举个例子:
- def foo():
- bar_a = yield "hello"
- bar_b = yield bar_a
- yield bar_b
- f = foo()
- print(f.send(None))
- print(f.send("C语言中文网"))
- 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 异常。
举个例子:
- def foo():
- try:
- yield 1
- except GeneratorExit:
- print('捕获到 GeneratorExit')
- f = foo()
- print(next(f))
- f.close()
程序执行结果为:
1
捕获到 GeneratorExit
注意,虽然通过捕获 GeneratorExit 异常,可以继续执行生成器函数中剩余的代码,带这部分代码中不能再包含 yield 语句,否则程序会抛出 RuntimeError 异常。例如:
- def foo():
- try:
- yield 1
- except GeneratorExit:
- print('捕获到 GeneratorExit')
- yield 2 #抛出 RuntimeError 异常
- f = foo()
- print(next(f))
- 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 异常。例如:
- def foo():
- yield "c.biancheng.net"
- print("生成器停止执行")
- f = foo()
- print(next(f)) #输出 "c.biancheng.net"
- f.close()
- 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 异常。
举个例子:
- def foo():
- try:
- yield 1
- except ValueError:
- print('捕获到 ValueError')
- f = foo()
- print(next(f))
- 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)方法详解相关推荐
- python画简单的图形的代码-Python实现画图软件功能方法详解
概述 虽然Python的强项在人工智能,数据处理方面,但是对于日常简单的应用,Python也提供了非常友好的支持(如:Tkinter),本文主要一个简单的画图小软件,简述Python在GUI(图形用户 ...
- python流获取控制台_对Python捕获控制台输出流的方法详解
有时候我们的代码里可能要调用控制台命令,比如我想用Python写一个批量编译 .java 文件的脚本,用到如下代码 常规用法 os.system import os,traceback try: p ...
- python画图代码大全-Python实现画图软件功能方法详解
概述 虽然Python的强项在人工智能,数据处理方面,但是对于日常简单的应用,Python也提供了非常友好的支持(如:Tkinter),本文主要一个简单的画图小软件,简述Python在GUI(图形用户 ...
- python中累加函数_对Python实现累加函数的方法详解
对Python实现累加函数的方法详解 发布时间:2020-10-26 00:02:44 来源:脚本之家 阅读:120 作者:岚漾忆雨 这个需求比较奇怪,要求实现Sum和MagaSum函数,实现以下功能 ...
- python字符串format方法参数解释,一文秒懂!Python字符串格式化之format方法详解
一文秒懂!Python字符串格式化之format方法详解 一文秒懂!Python字符串格式化之format方法详解 format是字符串内嵌的一个方法,用于格式化字符串.以大括号{}来标明被替换的字符 ...
- python按键脚本教程-在自动化中用python实现键盘操作的方法详解
原来在robotframework中使用press key方法进行键盘的操作,但是该方法需要写被操作对象的locator,不是很方便,现在找到了一种win32api库写键盘操作的一个方法(注意:此方法 ...
- python3占位符详解_占位符最新:Python 占位符的使用方法详解_爱安网 LoveAn.com
关于"占位符"的最新内容 聚合阅读 这篇文章主要介绍了Python 占位符的使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以 ...
- 【Python入门】Python字符串的45个方法详解
Python中字符串对象提供了很多方法来操作字符串,功能相当丰富.必须进行全面的了解与学习,后面的代码处理才能更得心应手,编程水平走向新台阶的坚实基础.目前一共有45个方法,给大家分类整理,可以收藏查 ...
- python html文本 转义字符,python处理html转义字符的方法详解
搜索热词 本文实例讲述了python处理html转义字符的方法.分享给大家供大家参考,具体如下: 最近在用Python处理网页数据时,经常遇到一些html转义字符(也叫html字符实体),例如< ...
- python中requests库的用途-数据爬虫(三):python中requests库使用方法详解
有些网站访问时必须带有浏览器等信息,如果不传入headers就会报错,如下 使用 Requests 模块,上传文件也是如此简单的,文件的类型会自动进行处理: 因为12306有一个错误证书,我们那它的网 ...
最新文章
- 7个珍藏多年的网站,颠覆你的想象,值得收藏起来!
- 独立成分分析ICA、因子分析、LDA降维、NMF非负矩阵分解
- Halcon初学者知识:用set_paint直观显示图像的属性
- 没有域可以加文件服务器吗,文件服务器没有域
- [转]被当做狗和鸡来驱赶的百姓
- 独家 | 2019届互联网校招本科薪酬清单|湾区人工智能
- maven gradle等三放jar包仓库
- 关于在window下使用docker的备选方案
- 极客大学架构师训练营 大数据架构、Spark、Storm、Spark Streaming、Flink、HiBench、Impala 第25课 听课总结
- 奇妙生活-神奇的数字-1的故事
- MQTT客户端代码(C语言)
- 飞鹅WiFi打印机配置,php调用接口
- html图片excel路径,jsp方式导出Excel能不能导出图片_html/css_WEB-ITnose
- Easyexcel 获取表格具体位置的内容
- 问题:设计一个大学教师和学生管理程序, 教师包括 编号、姓名、职称和教研室 数据的输入输出; 大学生包括编号、姓名、性别、班号、英语、高等数学和数据结构三门课程成绩的输入输出和计算平均分; 研究生包
- mysql数据库搭建动态网站_数据库和动态网页怎么建立联系
- PyTorch深度学习基础之Reduction归约和自动微分操作讲解及实战(附源码 超详细必看)
- Linux (Centos)删除文件找回
- DRUCK德鲁克压力校验仪维修DPI620G-IS
- 《我的PaddlePaddle学习之路》笔记一——PaddlePaddle的安装
热门文章
- JavaScript高级程序设计(第三版)学习笔记1~5章
- 二维码类库--phpqrcode使用简介
- 基于InkCanvas实现的桌面涂鸦工具-[ WPF开发 ]
- ASP.NET MVC 环境配置,从1.0到2.0的转换和学习资源等
- sql 2005分区表
- 2021牛客多校3 - Kuriyama Mirai and Exclusive Or(差分+倍增)
- HDU - 5521 Meeting(最短路+思维建边)
- POJ1265(Pick定理的应用)
- 32.生命周期注释.rs
- C++ 私有成员变量的理解