扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:开发者在线 2007年7月20日
关键字: Nick Gibson 生成器 python
在本页阅读全文(共19页)
关键字:python
有的时候你的程序精力过剩,把你不需要或者不希望它做的事情都给做了——你想要它懒一点才好。这就是生成器的用武之地。使用python的生成器(generator)能够让你精确地决定要它做多少以及什么时候去做。
上周我们向你介绍了python列表推导(list comprehension),它让你能以更加自然的方式来表示列表的内容。本文将介绍它们的同类:python生成器,它可以一段一段地构成一个序列,按照你的要求完成工作量。
这被叫做暂缓求值(lazy evaluation),用来推迟某个特定值的计算,直到程序某个点需要才开始。暂缓求值在很多类型的编程中非常有用,因为它不用计算从来都不使用的值,因而可以带来性能上的提升。有的语言,比如Haskell和Miranda,在默认情况下都使用暂缓求值;而其他的语言,像Scheme、Ocaml和python,都可以通过专门的句法来使用暂缓求值。在python里,实现暂缓求值的方式是使用生成器。
利用生成器你可以编写出这样一个函数,它能够返回结果然后暂停,当你下一次调用这个函数的时候它会从暂停的地方恢复。你不需要任何专门的句法来编写生成器,要做的只是表示一下什么时候使用yield语句返回一个中间值。说明这一点的最简单方法是举一个例子:
>>> def generator1():...yield "first"...yield "second"...yield "third"... >>> gen = generator1()>>> gen >>> gen.next()'first'>>> gen.next()'second'>>> gen.next()'third'>>> gen.next()Traceback (most recent call last):File "", line 1, in ?StopIteration>>>在这个例子中,我们首先定义一个叫做generator1的生成器,它会生成三个值:“first”、“second”和“third”三个字符串。当我们创建一个新的生成器对象(gen)时,它就开始执行函数。每当你调用生成器next方法时,它会继续执行这个函数,直到生成下一个值。当生成器达到块结尾的时候,或者碰到返回语句时,它会产生一个StopIteration异常。
生成器本质上就是迭代器,这也就是说它们可以用在很多表达式里,而不需要用序列(列表等)。例如,你可以不使用上面的代码,而改用下面的:
>>> gen2 = generator1()>>> for i in gen2:...print i... firstsecondthird类似的,你可以一次就把生成器转换成为列表:
>>> gen3 = generator1()>>> list(gen3)['first', 'second', 'third']如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者