Python之何为yield关键字(生成器)?

yield 关键字

yield顾名思义,它是python3中33个关键字中的一个,也是非常重要的一个关键字。

yield与生成器息息相关,yield <==> 生成器

所以知道了什么是生成器,yield也自然而然地懂了。
那什么是生成器呢?

1.生成器是一个不断产生值的函数。
2.包含yield语句的函数是一个生成器。
3.生成器每次产生一个值(yield语句),函数被冻结,知道再被唤醒后再产生一个值。(也就是说,产生一个值后会在这个位置暂停,直到再被唤醒后,会从暂停的位置开始继续执行)

接下来我么来看一段代码:看看生成器的写法

#产生所有小于n的平方值
def gen(n):
    for i in range(n):
        yield i**2

按照定义,首先会执行for循环,然后执行到yield语句时,这个函数会被冻结,而当前yield对应的那一行产生的值会被返回出来,通过调用该函数,会逐渐的遍历这个循环。

生成器的使用一般与循环搭配在一起,我们可以用一个for循环来调用上边的函数代码,代码如下:

def gen(n):
    for i in range(n):
        yield i**2
for i in gen(5):
    print(i,end=" ")
输出:
0 1 4 9 16 

for循环通过遍历gen()函数,每次是的会唤醒一次这个函数,因此最后执行出小于5的整数所有的平方值。

事实上它也可以用一般写法,return生成,代码如下:

def square(n):
    ls = [i**2 for i in range(n)]
    return ls
for i in square(5):
    print(i,end=" ")
输出:
0 1 4 9 16 

但是这种普通的写法与生成器的写法是有不同的。
这种普通的写法,是指我们将所有可能得值全部计算出来并且通过一个列表返回给上乘的调用函数。
因此,我们知道,生成器相比这种普通的生成所有内容的写法它们是不同的。
那生成器有什么优势吗?
其实是非常明显的!
生成器相比一次列出所有内容的优势有三个:

1、更节省存储空间。

2、相应更迅速

3、使用更灵活

我们可以再通过上面的列子进行说明:
普通写法是一次性将所有可能的值存储起来并且通过列表返回,
而生成器呢,是每次只返回一个值。
如果上面的例子中,n不是5,而是n=1M、10M、100M或更大呢?(M为兆)
当n=1M时,
普通写法需要将所有的值全部列出来并且存储在列表中再返回,也就是说你必须得等待它将值完全列出来后才能看到结果,这里还只是1M,那如果是10M,100M,甚至是100000000000M呢,我相信结果还没出来,你就先没了。。。。而且它还需要能装得下它的存储空间才行。。。
反过来我们通过生成器呢,它在每调用一次的时候只产生一个值并返回,当它再次被调用时也就是唤醒它,它才会第二个值,以此类推。
所以即使n=10M或更多,对于生成器来说,它需要使用的存储空间仍然是一个元素的存储空间,而且不需要等待所有的值都结算完才能看到,可以逐个看,你需要的时候唤醒它,不需要的时候就不唤醒它。

说到这,我相信大家已经对yield有了很清楚的认识了

上一篇文章———>Java 完数 Mooc

下一篇文章———>Pycharm自定义更换背景图,来给代码加个PS~~~

发布了25 篇原创文章 · 获赞 52 · 访问量 2871

猜你喜欢

转载自blog.csdn.net/weixin_43347550/article/details/105197970
今日推荐