Excel不相邻列如何打印在一起-英雄云拓展知识分享
117
2023-11-07
【摘要】 本书摘自《Python学习笔记 从入门到实战》一书中第9章,第1节,由张学建编著。
9.1.2 创建生成器
根据本章前面内容的学习可知,在Python 程序中可以使用关键字 yield 将一个函数定义 为一个生成器。所以说生成器也是一个函数,能够生成一个值的序列,以便在迭代中使用。 例如在下面的实例代码中,演示了yield 生成器的运行机制。
实例9-2:创建一个递减序列生成器
源码路径:下载包\daimal9-2
实例文件 dijian.py 的具体实现代码如下所示。
def shengYield(n): #定义方法 shengYield()
在上述实例代码中,自定义了一个递减数字序列的生成器,每次调用时都会生成一个从 调用时所提供值为初始值的不断递减的数字序列。生成对象不但可以直接被for 循环语句遍 历,而且也可以进行手工遍历,在上述最后两行代码中便是使用的手工遍历方式。第一次 使用 for 循环语句时直接遍历自己创建的生成器,第二次用手工方式获取生成器产生的数值 序列。执行后会输出:
开始生成, .:
遍历得到的值: 4
完成一次...:
开始生成...:
遍历得到的值: 3
完成一次...:
开始生成...:
遍历得到的值: 2
完成一次...:
开始生成. .:
遍历得到的值:
完成一次...:
已经实例化生成器对象
开始生成..
第二次调用 next ()方法:
完成一次...:
开始生成..
通过上述实例的实现过程可知,当在生成器中包含yield 语句时,不但可以用for 直接遍历, 而且也可以使用手工方式调用其方法 next) 进行遍历。在Python 程 序 中 ,yield 语句是 生成器中的关键语句,生成器在实例化时并不会立即执行,而是等候其调用方法 next() 才开始运行,并且当程序运行完 yield 语句后就会保持当前状态并且停止运行,等待下一次 遍历时才恢复运行。
在上述实例的执行结果中,在空行之后的输出“已经实例化生成器对象”的前面,已经 实例化了生成器对象,但是生成器并没有运行(没有输出“开始生成”)。当第一次手工调 用方法 next )后,才输出“开始生成”提示,这说明生成器已经开始运行,并且在输出“第 二次调用 next( )方法:”文本前并没有输出“完成一次”文本,这说明 yield 语句在运 行之后就立即停止了运行。在第二次调用方法 next ) 后,才输出“完成一次…”的文本 提示,这说明从 yield 语句之后开始恢复运行生成器。
9.1.3 生成器的第一次调用
在 Python程序中,通过 yield 语句可以使函数成为生成器,返回相关的值,并即时接受 调用者传来的数值。但是读者需要注意的是,当在第一次调用生成器时,不能传送给生成器 None 值以外的值,否则会引发错误。例如在下面的实例代码中,演示了调用生成器的具体 过程。
实例9-3:重新初始化生成器生成初始值 源码路径:下载包\daima\9\9-3
实例文件 diyi.py 的具体实现代码如下所示。 def shengYield(n):
while n>rn0cv:-=1=yield n
if rcv is not None:
n =rcv
if name mai n
print(sheng_yield.__next_())
#定义方法shengYield()
#如果n 大于0则开始循环
#通过"rcv" 来接收调用者传来的值
#生成初始值的不断递减的数字序列
#当模块被直接运行时,以下代码块会运行, 当模块是被导入时不被运行。
#开始遍历时从默认值2开始递减并输出
#传给生成器一个值,重新初始化生成器
一新历
在上述实例代码中,实现了一个可以接收调用者传来的值并重新初始化生成器生成值的 过程。首先定义了一个生成器函数,其中 yield 语句为 “rcv=yield n”, 通 过“rev” 来接收 调用者传来的值。如果在调用时只提供了一个值,就会从这个值开始递减生成序列。程序运 行后,在开始遍历时从2开始递减并输出,当重新传一个值11给生成器时,会得到一个从 11 开始递减的遍历。执行后会输出:
将接力棒传递给另一个人,重新开始跑。
11
10
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~