前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python自学成才之路 生成器的使用

Python自学成才之路 生成器的使用

作者头像
我是李超人
修改2020-08-30 20:25:55
4700
修改2020-08-30 20:25:55
举报
文章被收录于专栏:大数据入坑指南

为何需要生成器? 假如现在有一个需求,需要打印从1到1亿的整形。如果我们采用普通的方式,直接调用range函数,那么程序肯定会崩溃,因为range(1,100000000)函数直接产生一个从1-1亿的列表,这个列表中的所有数据都是存放在内存中的,会导致内存爆满。这时候我们可以采用生成器来解决这个问题,生成器不会一次性把所有数据都加载到内存中,而是在循环的时候临时生成的,循环一次生成一个,所以在程序运行期间永远都只会生成一个数据,从而大大节省内存。

生成器是什么? 使用yield的函数是生成器,生成器是一个迭代器。

创建一个生成器 在函数中使用yield来创建一个生成器。如下所示:

代码语言:javascript
复制
def my_gen(start, end):
    index = start
    while index < end:
        yield index
        index += 1


print(isinstance(my_gen(1, 100), Iterable))

ret = my_gen(1, 10)
for x in ret:
    print(x)

怎么去理解生成器呢?可以理解为每次使用next获取生成器的值的时候会在yield出暂停并返回值,再次使用next取数时从yiled处开始执行。所以next会在yield处暂停,也在yield处被唤醒。

Send函数 send方法和next方法类似,可以用来触发生成器的下一个yield,但是send不仅可以触发下一个yield,还可以发送数据过去,作为yield表达式的值,yield表达式的值是None。

代码语言:javascript
复制
def my_gen(start):
    while start < 10:
        temp = yield start
        print(temp)
        start += 1


ret = my_gen(1)
# 在迭代开始的地方使用send只能传递None为参数
print(ret.send(None))
print(next(ret))
print(next(ret))
print(ret.send("hello"))
print(next(ret))

注意:使用send的时候,在迭代开始的地方使用send只能传递None为参数。

提前终止生成器 return语句会触发StopIteration异常,可以提前终止生成器。

代码语言:javascript
复制
def my_gen(start):
    while start < 3:
        yield start
        start += 1
        return "hello"

# 如果使用for遍历 不会出现StopIteration异常
ret = my_gen(1)
iter = my_gen(1)
while True:
    print(next(iter))
输出:
Traceback (most recent call last):
  File "D:/pycharm workspace/oopdemo/iterator_generator/generator_demo01.py", line 58, in <module>
    print(next(iter))
StopIteration: hello
1

注意:使用next会抛出StopIteration异常,for循环遍历不会抛出StopIteration异常。

生成器的应用 使用生成器创建一个斐波拉契数列。

代码语言:javascript
复制
def fib(count):
    a, b = 0, 1
    tmp = 1
    while tmp <= count:
        yield b
        c = b
        b = a + b
        a = c
        tmp += 1

for x in fib(7):
    print(x)

上面是生成器的常见的用法,实际上生成器还有一些高级的用法,后面会结合一些场景做介绍。

本人是做大数据开发的,在微信上开了个个人号,会经常在上面分享一些学习心得,原创文章都会首发到公众号上,感兴趣的盆友可以关注下哦!

大数据入坑指南
大数据入坑指南
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/08/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

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