Python生成器函数概述:运用实例分解说明机制

全文共5930字,预计学习时长12分钟

Python的生成器函数为数据和计算资源管理提供了强大的机制,但对于Python初学者而言,理解它们并非易事。这篇文章会分解生成器的机制,同时介绍一个管理和分类S3文件资源的小类的例子,希望能对你有所启发。

鉴于Python入门并不难,非常容易就可写出真正能够运作的代码(比如迭代一列数值,计算以及/或打印一些数值),一些Python初学者和粗心的程序员可能没有意识到该语言建立在procrastination,也即延迟计算的概念之上。对使用过编译语言(如C++)的人而言,这种根植于该语言本身的松散性,或者说惰性,可能有点陌生。

很多程序员都学过“惰性计算”以及如何写代码来实现这一操作。但Python语言本身就支持这种计算(只需一个关键词就可轻易实现),这种有效性和表达性在其他程序语言中非常罕见。所以,惰性计算这个概念被引入“拉达姆演算”,而Python尽管并非专门的功能语言(例如Lisp),也体现出功能编程的特性,也就不足为奇了,Python使用闭包函数也是拉达姆演算特性的一部分。

2001年,“PEP 255 — Simple Generators”(https://www.python.org/dev/peps/pep-0255/)介绍了生成器,提出动机是对惰性计算更加直接的表达:

当一个生产函数遇到需要保持在产出值之间的状态,面对这一难题,很多程序语言无法提供令人满意的有效解决方案……

机制

Python生成器函数是一个很强大的概念,但不同于函数装饰器(function decorators)复杂的构架,它们运行和表达机制相当简单,只需“yield”语句(yield这一新的关键词在PEP 255中被加入Python)。

作为及物动词,yield表示产出。作为不及物动词,它表示让步或撤回。这个单词的两种含义都会在Python生成器函数中出现。

人们通常认为,函数在返回单个值、以列表或词库形式返回多个值、或用户定义的对象时,会通过返回语句产生结果。返回语句是函数结束控制并将控制和结果让渡给调用者的方式。返回语句后,运行环境(解释器)将给定函数的堆栈帧从调用堆栈中移除,给定函数的“环境”就会消失(直到下一次调用该函数)

Python的yield语句则完全改变了上述操作。下面来看看一个非常简单的人为设计的生成器例子,附有额外代码以证明它的效用(代码来自iPython解释器交互对话):

In [8]: def gen(x):
   ...:     yield x

In [9]: g = gen(10)
In [10]: g
Out[10]: <generator object gen at 0x10d26ed00>

In [11]: next(g)
Out[11]: 10

In [12
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值