Excel不相邻列如何打印在一起-英雄云拓展知识分享
125
2023-11-07
【摘要】 本书摘自《Python学习笔记 从入门到实战》一书中第19章,第1节,由张学建编著。
第九章 生成器 装饰器和闭包
( 视频讲解:38分钟)
在前面的内容中,已经讲解了在 Python 程序中导入模块、包和使 用迭代器的知识,在本章的内容中,将进一步讲解 Python 面向对象的 知识,详细讲解生成器、装饰器、命名空间和闭包等内容,为读者步入 本书后面知识的学习打下坚实的基础。
9.1 生成器:边循环边计算
9.1.1 生成器的运行机制
在Python 程序中,生成器是一个记住上一次返回时在函数体中位置的函数。对生成器 函数的第二次(或第n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。 生成器不仅“记住”了它的数据状态,还“记住”了它在流控制构造(在命令式编程中,这 种构造不只是数据值)中的位置。
概括来说,生成器的特点如下所示。
(1)生成器是一个函数,而且函数的参数都会保留。
(2)当迭代到下一次的调用时,所使用的参数都是第一次所保留下的。也就是说,在
整个所有函数调用的参数都是第一次所调用时保留的,而不是新创建的。
在 Python程序中,使用关键字yield 定义生成器。当向生成器索要一个数时,生成器就
会执行,直至出现 yield 语句时,生成器把yield 的参数传给你,之后生成器就不会往下继续 运行。当向生成器索要下一个数时,它会从上次的状态开始运行,直至出现 yield语句时把 参数传给你,然后停下。如此反复,直至退出函数为止。
当在 Python程序中定义一个函数时,如果使用了关键字 yield, 那么这个函数就是一个
生成器,它的执行会和其他普通的函数有很多不同,函数返回的是一个对象,而不是平常函
数所用的 return 语句那样,能得到结果值。如果想取得值,还需要调用 next() 函数,例如在 下面的演示代码中,每当调用一次迭代器的 next 函数,生成器函数便会运行到 yield 位置, 返回 yield 后面的值,并且在这个地方暂停,所有的状态都会被保持住,直到下次next 函数 被调用或者碰到异常循环时才退出。
例如在下面的实例代码中,演示了使用 yield 生成器的过程。
实例9-1:使用 yield 生成器显示奥运会金牌榜的变化
源码路径:下载包\daimal9\9-1
在上述实例代码中,当程序运行到 yield 这行时就不会继续往下执行,而是返回一个包
含当前函数所有参数状态的iterator 对象。目的就是为了第二次被调用时,能够访问到函数 所有的参数值都是第一次访问时的值,而不是重新赋值。当程序第一次调用时:
yield a #这时a,b 值分别为1,1,当然,程序也在执行到这行时,返回
当程序第二次调用时,从前面可知,当第一次调用时,a,b=1,1, 那么第二次调用时(其 实就是调用第一次返回的iterator 对象的next) 方法),程序跳到yield 语句处,当执行“a,b=b,
a+b” 语句时,此时值变为:a,b=1,(1+1)=>a,b=1,2 。 然后程序继续执行 while 循环,这样
会再一次碰到 yield a语句,也是像第一次那样,保存函数所有参数的状态,返回一个包含这 些参数状态的 iterator 对象。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~