python的生成器的功能,yield关键词,实例解析

python的生成器是什么,英文为generator,是一种特殊的迭代器,概念与迭代器iterator一样有些抽象。我们可以从其功能的角度来进行了解。


python生成器的功能

python生成器能够按需地逐次地返回结果,可以节省内存,使程序更加高效。

我们将通过两个例子来说明python生成器的这一功能。我们可以用生成器表达式(推导式)和yield关键词来创建生成器。


python生成器表达式(推导式)

和前面的列表推导式、集合推导式和字典推导式一样,python的生成器也有其推导式,格式差不多,不过是用圆括号来讲表达式括起来,并且也可以用next()函数逐个访问,这一点与迭代器iterator十分相似,迭代器的使用实例可以参考上一节中的通关游戏实例

生成器表达式实例

>>> g = (x for x in range(10)) #记住要用圆括号“()”
>>> type(g)
<class 'generator'>
>>> next(g)
0
>>> next(g)
1

实例解析

重点:我们可以这样理解,如上例,g = (x+1 for x in range(10)) 创建了生成器,并赋值给变量g,便于访问,虽然我们创建了一个生成器,但是该表达式并没有像列表推导式或其他的推导式那样,直接生成一个数据序列,比如上式要是列表推导式的话,会直接生成一个[0,1,2...,9]的列表,而生成器则不会,它会在我们调用next()函数时,“才”返回一个值,比如第一次使用next()函数的时候,“才”生成一个返回值,并返回(0),第二次使用时在“才”又生成一个返回值,并返回(1)——可以想象成生成器是生成了一个不占内存的列表,然后在用next()函数时根据其索引顺序逐一返回值。


yield关键词

在函数中出现yield关键词,那么该函数便是生成器,yield关键词用来返回一个值,但是与return不同的是,yiled返回值之后,程序仍可继续进行,而return则会终止函数程序的进行,这一点区别是显而易见的。下面我们来通过一个实例来看看yield关键词创建的函数生成器——它的作用仍然是节省程序执行过程中内存的占用。

yield实例

我们将上面例子中的生成器表达式写成函数的形式:

In[1]:
def r(x):
    i = 0
    while x>=0 and i<=x:
        yield i #yield关键词使函数r()变成了一个生成器,第一次调用next()函数时,函数执行到这里停止,并返回值
        i += 1 #再次调用next()函数,函数从这里继续执行
ra = r(10) #可以用next()函数来获取值,也可以用for循环来遍历迭代
type(ra)
<class 'generator'>
next(ra)
0
next(ra)
1

实例解析

函数r()因为yield关键词变成了一个生成器,并且通过yiled关键词返回一个值,比如用next(ra)时,while第一次循环,函数返回0,并停止,当再次使用next(ra)时,函数从yield下面的i += 1处继续执行。


生成器的for循环

生成器也可以用for循环来遍历迭代,但总感觉没有next()更契合生成器的功能,所以这里就不举例了,大家有兴趣的话,可以自己写个生成器,并用for循环来遍历迭代一下。


python生成器的内容就暂时介绍到这里,下一章节我们将继续介绍python的装饰器。


全栈后端 / python教程 :


























Copyright © 2022-2024 笨鸟工具 x1y1z1.com All Rights Reserved.