千锋教育-做有情怀、有良心、有品质的职业教育机构

Python函数式编程指南之生成器

来源:千锋教育
发布时间:2023-11-07 03:00:39
分享

生成器(generator)

1.生成器简介

首先请确信,生成器就是一种迭代器。生成器拥有next方法并且行为与迭代器完全相同,这意味着生成器也可以用于Python的for循环中。另外,对于生成器的特殊语法支持使得编写一个生成器比自定义一个常规的迭代器要简单不少,所以生成器也是最常用到的特性之一。

从Python2.5开始,[PEP342:通过增强生成器实现协同程序]的实现为生成器加入了更多的特性,这意味着生成器还可以完成更多的工作。这部分我们会在稍后的部分介绍。

2.生成器函数

2.1.使用生成器函数定义生成器

如何获取一个生成器?首先来看一小段代码:

>>>defget_0_1_2():

...yield0

...yield1

...yield2

...

>>>get_0_1_2

我们定义了一个函数get_0_1_2,并且可以查看到这确实是函数类型。但与一般的函数不同的是,get_0_1_2的函数体内使用了关键字yield,这使得get_0_1_2成为了一个生成器函数。生成器函数的特性如下:

调用生成器函数将返回一个生成器;

>>>generator=get_0_1_2()

>>>generator

第一次调用生成器的next方法时,生成器才开始执行生成器函数(而不是构建生成器时),直到遇到yield时暂停执行(挂起),并且yield的参数将作为此次next方法的返回值;

>>>generator.next()

之后每次调用生成器的next方法,生成器将从上次暂停执行的位置恢复执行生成器函数,直到再次遇到yield时暂停,并且同样的,yield的参数将作为next方法的返回值;

>>>generator.next()

>>>generator.next()

如果当调用next方法时生成器函数结束(遇到空的return语句或是到达函数体末尾),则这次next方法的调用将抛出StopIteration异常(即for循环的终止条件);

>>>generator.next()

Traceback(mostrecentcalllast):

File"",line1,in

StopIteration

生成器函数在每次暂停执行时,函数体内的所有变量都将被封存(freeze)在生成器中,并将在恢复执行时还原,并且类似于闭包,即使是同一个生成器函数返回的生成器,封存的变量也是互相独立的。

我们的小例子中并没有用到变量,所以这里另外定义一个生成器来展示这个特点:

>>>deffibonacci():

...a=b=1

...yielda

...yieldb

...whileTrue:

...a,b=b,a+b

...yieldb

...

>>>fornuminfibonacci():

...ifnum>100:break

...printnum,

...

1123581321345589

看到whileTrue可别太吃惊,因为生成器可以挂起,所以是延迟计算的,无限循环并没有关系。这个例子中我们定义了一个生成器用于获取斐波那契数列。

以上内容为大家介绍了Python函数式编程指南之生成器,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注IT培训机构:千锋教育。

声明:本站部分稿件版权来源于网络,如有侵犯版权,请及时联系我们。

相关推荐

  • Python 数组ndarray Numpy中定义的最重要的对象是成为ndarray的N维数组类型。它描述相同类型的元素集合。可以使用基于零的索引访问集合中的项目。大部分的数组操作仅仅是修改元数据部分,而不改变其底层的实际数据。数组的
  • Python 线程对象 先了解一下Python守护线程基本概念。守护线程:当一个线程被标记为守护线程时,Python程序会在剩下的线程都是守护线程时退出,即等待所有非守护线程运行完毕;守护线程在程序关闭时会突然关闭,可能会导
  • Python 条件对象 条件对象总是与某种类型的锁对象相关联,锁对象可以通过传入获得,或者在缺省的情况下自动创建。threading.Condition(lock=None)实现条件对象的类。它具有如下方法:acquire(
  • Python 信号量对象 和锁机制一样,信号量机制也是一种实现线程同步的机制,不过它比锁多了一个计数器,这个计数器主要用来计算当前剩余的锁的数量。threading.Semaphore(value=1)信号量实现类,可选参数v
  • Python 事件对象 一个线程发出事件信号,其他线程等待该信号,这是最简单的线程之间通信机制之一。threading.Event实现事件对象的类。它有如下方法:is_set():当内部标志为True时返回True。set(
  • Python 解释器的作用 python解释器的主要作用是将我们在.py文件中写好的代码交给机器去执行,比较常见的解释器包括如下几种:CPython:官方解释器,我们从官网下载安装后获得的就是这个解释器,它使用C语言开发,是使用