前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python-yield生成器介绍

python-yield生成器介绍

作者头像
搁浅同学
发布2022-07-21 15:05:30
2740
发布2022-07-21 15:05:30
举报

2022年啦,新年一次发文,祝大家在新的一年里,健康快乐,立下Flag都能实现,今天主要分享yield生成器。

相信大家在学习python的时候,肯定会看到yield这个关键词,如果暂时不了解的话,我们可以将它理解为return。但是它和return有点不一样,return返回后,程序终止,但是yield返回的是一个生成器,同时会记住当前程序的执行位置。下面是一个示例代码

gen方法是一个生成器

代码语言:javascript
复制
#!/usr/bin/python
# -*- coding: utf-8 -*-

def gen():
    while True:
        print('starting......')
        res = yield 5
        print(f'res{res}')
        print('end......')


func = gen()
print(func)  # <generator object gen at 0x7fb670237eb0>
print(type(func))  # <class 'generator'>

我们看到方法gen返回的是一个generator,是一个生成器,但是怎么获取里面的值呢?通过生成器的next

代码语言:javascript
复制
#!/usr/bin/python
# -*- coding: utf-8 -*-

def gen():
    while True:
        print('starting......')
        res = yield 5
        print(f'res:{res}')
        print('end......')


func = gen()
print(func)  # <generator object gen at 0x7fb670237eb0>
print(type(func))  # <class 'generator'>
print(next(func))
# 第一个next输出
# starting......
# 5
print(next(func))
# 第二个next输出
# res:None
# end......
# starting......
# 5

我们可以看到打印输出,第二个输出是接着第一个next输出的,yield返回的值并不会直接赋值给res,yield返回的值是返回给生成器func,同时同时通过next获取。我们可以通过打断点的方式,可以看到这个程序的执行顺序:

  1. gen方法返回一个生成器之后,并不会直接执行,需要激活生成器
  2. 当遇到第一个next的时候,生成器被激活,开始执行gen方法里面的while代码,所以开始打印starting....,但是res并没有赋值,所以是None,遇到yield时,程序暂停,所以没有res,但是yield给gen函数返回了一个值5,所以会打印5
  3. 当遇到第二个next时,会重新开始执行,从打印res开始执行,执行完后续代码后,再次进入while循环,遇到yield程序再次暂停

res的值一直是None,但是有没有办法更改呢,是可以的,生成器提供了一个send方法,以下代码可以通过send方法改变res,再遇到第三个next,打印了res的值是5

代码语言:javascript
复制
#!/usr/bin/python
# -*- coding: utf-8 -*-

def gen():
    while True:
        print('starting......')
        res = yield 5
        print(f'res:{res}')
        print('end......')


func = gen()
print(func)  # <generator object gen at 0x7fb670237eb0>
print(type(func))  # <class 'generator'>
print(next(func))
print(next(func))
func.send(5)
print(next(func))
#######
starting......
5
res:None
end......
starting......
5
res:5
end......
starting......
res:None
end......
starting......
5
#####

今天关于yield就差不多结束,但是为什么要使用yield呢?一般用得比较多的是列表创建、协程等,我们去一个例子,比如我们创建一个很大的list,可能通过以下代码进行创建,但是会耗费很大的内存

代码语言:javascript
复制
def create_list():
    result = list()
    for i in range(10000):
        result.append(i)
    return result


for i in create_list():
    print(i)

我们可以通过yield实现,如下:

代码语言:javascript
复制
def create_list_gen():
    for i in range(10000):
        yield i


for i in create_list_gen():
    print(i)

只有迭代的时候才会使用内存,减少内存。

更多的使用,以后我们遇到,今天就分享到这里啦!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-01-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 暴走的软件测试Tester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档