科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件深入了解Python暂缓列表生成器

深入了解Python暂缓列表生成器

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

上周我们向你介绍了python列表推导(list comprehension),它让你能以更加自然的方式来表示列表的内容。本文将介绍它们的同类:python生成器,它可以一段一段地构成一个序列,按照你的要求完成工作量。

作者:开发者在线 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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章