生成器(generator)

生成器:

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。

什么是生成器?

一边循环一边计算的机制就是生成器

生成起的本质就是迭代器

生成器包括两种:生成器函数和生成器表达式

生成器函数:

一个包含yield关键字的函数就是生成器函数。yield不能和return共用,并且yield只能用在函数内
yield和return相同的是可以返回值,不同的是yield不会结束函数

def text():
    for i in range(5):
        yield i
t = text()
print(t)#<generator object text at 0x00000000039A0480>
#得到的是生成器对象,并没有执行生成器中的函数体

#这两种方法都可以获取值,不过每打印一次只会获得一个值,如果超出界限会报错   
print(next(t))
#0
print(t.__next__())
#1

#使用for循环遍历,可以从前往后逐个生成
for i in t:
	print(i)
0
1
2
3
4
send():send获取下一个值的效果和next()基本一致,只是在获取下一个值的时候给上一个yield的位置 传递一个数据

注意:
1.第一次使用生成器的时候需要使用next获取下一个值
2.最后一个yield不能接受外部来的值

def text():
    print('a')
    count = yield 1
    print('---->',count)
    print('b')
    yield 2
t = text()
print(next(t))#打印a和1
g = t.send('123')#原本应该会打印b和2但send会把123传递给yield1,所以会打印出123和b
print(g)#打印2,相当于第三次next取值
#原本两次next取值就可以,但由于send会给上一个yield传递数据,就相当于需要获取两次yield1
生成器表达式:

将列表推导式的 [] 改成 () 即可

g = (i for i in range(5))
print(g)
#<generator object <genexpr> at 0x00000000038CBD68>
for i in g:
    print(i)
0
1
2
3
4
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值