python基础-生成器

生成器是根据某种算法得出的一系列元素,需要用到该元素,才会生成出来,比列表节省内存空间。生成器相当于保存算法,授人以渔,列表之类的是授人以鱼。


第一种创建生成器的方法:

1、gen = (x **2  for x in range(5))
type(gen)
<class 'generator'>


通过next()函数得到生成器的每个值

next(gen)
0
next(gen)
1
next(gen)
4
next(gen)
9
next(gen)
16
next(gen)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
StopIteration


不过一般用for循环来使用生成器:

gen2 = (x * 9  for x in range(3))
for a in gen2:
    print(a)
    
0
9
18


第二种创建生成器的方法:

def gen4(num):
    for a in range(num):
        yield a


调用了这个函数,才会返回一个生成器对象,判断是否是生成器对象

>>>type(gen4)
<class 'function'>
>>>type(gen4(1))
<class 'generator'>

>>>from types import GeneratorType
>>>isinstance(gen4,GeneratorType)
False
>>>isinstance(gen4(1),GeneratorType)
True


生成器的执行流程:遇到yield语句后返回,下次调用在上次返回处的下一语句开始执行。

def gen5():
    yield 1
    print('aaa')
    print('bbb')
    yield 2


rr = gen5()
next(rr)
1
next(rr)
aaa
bbb
2

有个疑问,为啥在next()函数直接用gen5()的时候是这样的?

>>>next(gen5())
1
>>>next(gen5())
1

原来这样的话,是两次调用了gen5(),每次返回了一个生成器,调用两次,就返回两个,然后各自使用next()函数,各自都是首次调用next()函数,就返回1



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值