`

生成器

 
阅读更多
基于yield指令,可以暂停一个函数并返回中间结果。该函数将保存执行环境并且可以在必要
时恢复。
>>> def fibonacci():
...     a, b = 0, 1
...     while True:
...             yield b
...             a, b = b, a + b
...
>>> fib = fibonacci()
>>> fib.next()
1
>>> fib.next()
1
>>> fib.next()
2
>>> [fib.next() for i in range(10)]
[3, 5, 8, 13, 21, 34, 55, 89, 144, 233]
>>>

该函数将返回一个特殊的迭代器,也就是generator对象,它知道如何保存执行环境。对它的
调用是不确定的,每次都将产生序列中的下一个元素。

生成器对降低程序复杂性很有帮助:
>>> def power(values):
...     for value in values:
...             print 'powering %s' % value
...             yield value
...
>>> def adder(values):
...     for value in values:
...             print 'adding to %s' % value
...             if value % 2 == 0:
...                     yield value + 3
...             else:
...                     yield value + 2
...
>>> elements = [1, 4, 7, 9, 12, 19]
>>> res = adder(power(elements))
>>> res.next()
powering 1
adding to 1
3
>>> res.next()
powering 4
adding to 4
7


Python引入的与生成器相关的最后一个特性是提供了与next方法调用的代码进行交互的
功能。yield将变成一个表达式,而一个值可以通过名为send的新方法来传递:
>>> def psychologist():
...     print 'Please tell me your problems'
...     while True:
...             answer = (yield)
...             if answer is not None:
...                     if answer.endswith('?'):
...                             print ("Don't ask yourself too much questions")
...                     elif 'good' in answer:
...                             print "A that's good, go on"
...                     elif 'bad' in answer:
...                             print "Don't be so negative"
...
>>> free = psychologist()
>>> free.next()
Please tell me your problems
>>> free.send('I feel bad')
Don't be so negative
>>> free.send("Why i shouldn't ?")
Don't ask yourself too much questions

send的工作机制与next一样,但是yield将变成能够返回传入的值。因为,这个函数可以
根据客户端代码来改变其行为。同时,还添加了throw和close两个函数,以完成该行为。
它们将向生成器抛出一个错误:
    throw允许客户端代码传入要抛出的任何类型的异常;
    close的工作方式是相同的,但是将会抛出一个特定的异常----GeneratorExit,在
         这种情况下,生成器函数必须再次抛出GeneratorExit或StopIteration异
         常。
>>> def my_generator():
...     try:
...             yield 'something'
...     except ValueError:
...             yield 'dealing with the exception'
...     finally:
...             print "ok let's clean"
...
>>> gen = my_generator()
>>> gen.next()
'something'
>>> gen.throw(ValueError('mean mean mean'))
'dealing with the exception'
>>> gen.close()
ok let's clean
>>> gen.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration


生成器表达式:
>>> iter = (x**2 for x in range(10) if x % 2 == 0)
>>> for e1 in iter:
...     print e1
...
0
4
16
36
64
>>> iter.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration


>>> iter = (x**2 for x in range(10) if x % 2 == 0)
>>> iter.next()
0
>>> iter.next()
4

这种表达式常被称为生成器表达式或genexp。每当在yield表达式上创建简单的循环时,
都应该使用它,或者用它来代替表现类似迭代器的列表推导。
分享到:
评论

相关推荐

    QT皮肤生成器 QT皮肤生成器

    QT皮肤生成器QT皮肤生成器QT皮肤生成器QT皮肤QT皮肤生成器QT皮肤生成器QT皮肤生成器QT皮肤生成器QT皮肤生成器QT皮肤生成器QT皮肤生成器QT皮肤生成器QT皮肤生成器QT皮肤生成器QT皮肤生成器QT皮肤生成器QT皮肤生成器QT...

    迷宫生成器1.0迷宫生成器1.0

    迷宫生成器1.0 迷宫生成器1.0迷宫生成器1.0迷宫生成器1.0迷宫生成器1.0迷宫生成器1.0迷宫生成器1.0迷宫生成器1.0迷宫生成器1.0迷宫生成器1.0迷宫生成器1.0迷宫生成器1.0迷宫生成器1.0迷宫生成器1.0迷宫生成器1.0迷宫...

    java ID生成器工具类 java ID生成器工具类

    java ID生成器工具类 java ID生成器工具类java ID生成器工具类 java ID生成器工具类java ID生成器工具类 java ID生成器工具类java ID生成器工具类 java ID生成器工具类java ID生成器工具类 java ID生成器工具类java ...

    C#代码生成器

    《C#代码生成器详解与应用》 C#代码生成器是一种高效开发工具,它能够帮助程序员快速生成符合特定需求的C#源代码,极大地提高了编程效率和代码质量。在.NET框架下,C#作为主要的开发语言,其代码生成器的作用显得尤...

    超级好用的长图生成器电脑版 长微博生成器 离线电脑版

    长微博生成器电脑版是一款可以在微博上发布长篇大论的工具,能帮做用户把长文章生成图片,有需要把文章生成图片的都可以使用长微博生成器,简单操作即可帮你完成,速度快可直接上传微博。 长微博生成器电脑版简介 发...

    LCD字库生成器 LCD字库生成器

    LCD字库生成器是一款专为液晶显示器(LCD)设计的工具,用于创建和管理自定义的字符库。在嵌入式系统和物联网设备中,LCD显示通常需要特定的字库来呈现文字信息。这款生成器可以帮助开发者根据需求生成适配LCD屏幕的...

    微信小程序 二维码生成器 (源码)

    微信小程序 二维码生成器 (源码)微信小程序 二维码生成器 (源码)微信小程序 二维码生成器 (源码)微信小程序 二维码生成器 (源码)微信小程序 二维码生成器 (源码)微信小程序 二维码生成器 (源码)微信小程序 二维码...

    asp.net 代码生成器 .NET代码生成器 C#代码生成器 三层源代码生成器

    asp.net 代码生成器 【基本说明】 1、能够生成三层模式操作的所有后台代码,简单的SQL Server 2005数据库操作。 2、生成的代码包括了 MODEL、BLL、DAL、DBHelper、Config 生成的代码内有详细注释可提供参考。 ...

    微信小程序 小程序页面生成器 (源码)

    微信小程序 小程序页面生成器 (源码)微信小程序 小程序页面生成器 (源码)微信小程序 小程序页面生成器 (源码)微信小程序 小程序页面生成器 (源码)微信小程序 小程序页面生成器 (源码)微信小程序 小程序页面生成器 ...

    人人代码生成器贼好用啊

    人人代码生成器是一款高效实用的工具,主要用于自动化代码编写过程,极大地提高了开发人员的生产力。在软件开发领域,代码生成器扮演着至关重要的角色,它能够根据预设的模板或模型自动生成符合特定规范的源代码,...

    组织机构代码生成器

    关于压缩包中的"51CTO下载-组织机构代码生成器",这可能是指在51CTO网站上可以下载到的特定版本的代码生成器软件。51CTO是中国一个知名的IT技术交流平台,提供各种软件下载、技术教程和论坛讨论服务。下载这款工具后...

    mybatis 代码生成器

    MyBatis 代码生成器是一款高效实用的工具,旨在帮助开发者自动创建常见的CRUD操作代码,从而节省在数据库交互上花费的时间,提高开发效率。它支持多种数据库,包括Oracle和MySQL,这意味着无论你使用哪种数据库,都...

    16点阵字模生成器_16点阵字模生成器_

    在电子显示领域,16点阵字模生成器是一个非常实用的工具,尤其对于制作电子广告牌、LED显示屏等需要显示汉字的设备来说。这个生成器可以将汉字转化为16*16像素的图形,也就是16点阵字模。16点阵是一种常见的字符表示...

    CSharp C#代码生成器

    【CSharp C#代码生成器】是一个强大的工具,专为C#开发者设计,旨在提高开发效率,尤其是在处理大量数据操作和界面构建时。这个代码生成器可以自动生成用于Web应用程序和Windows Forms(Winform)应用的C#代码,极大...

    淘宝快递单号生成器2.0

    淘宝快递单号生成器2.0是一款专门设计用于模拟生成淘宝平台上的快递单号的工具。在电商行业中,每个订单都会关联一个独特的快递单号,以便于跟踪包裹的物流状态。这款生成器可以帮助用户快速创建测试数据,尤其对于...

    代码生成器 代码生成器 代码生成器

    代码生成器是一种强大的工具,它能够自动生成符合特定规范或模式的源代码,极大地提高了开发效率,降低了程序员的重复劳动。在IT行业中,代码生成器的应用广泛,尤其在大型项目或者需要大量标准化代码的场景下,如...

    代码生成器(Asp.net(c#))源码

    《Asp.net(C#)代码生成器源码详解》 在软件开发过程中,代码生成器是一种提高效率的重要工具,尤其在Asp.net(C#)框架下,它能够自动生成大量基础代码,帮助开发者快速构建应用的骨架。本文将深入探讨Asp.net(C#)...

    情书生成器 情书生成器

    情书生成器是一种基于人工智能技术的应用程序,它能够根据用户输入的信息自动生成具有情感色彩的信件,通常用于表达浪漫的情感。在当前数字化时代,情书生成器利用自然语言处理(NLP)和机器学习算法,帮助那些不...

    短信内容生成器

    在IT行业中,短信内容生成器是一种实用工具,主要用于自动化生成短信文本,特别是在企业或服务提供商中,例如中国电信的无线工位。这样的工具可以显著提高工作效率,减少人为操作的错误,同时能够快速响应大规模的...

Global site tag (gtag.js) - Google Analytics