Python生成器推导式

Python 生成器推导式

趁刚总结的列表推导式还热乎,来看看生成器推导式。
有需要了解列表推导式的小伙伴可以去看之前我的总结Python列表推导式

一.列表推导式VS生成器推导式

1.从形式上看,生成器推导式与列表推导式非常接近,只是生成器推导式使用圆括号而不是列表推导式所使用的方括号。
2.与列表推导式不同的是,生成器推导式的结果是一个生成器对象,而不是列表,也不是元祖。但使用生成器对象的元素时,可以根据需要将其根据需要转化为列表或者元祖。

二.生成器推导式 starting…

废话不多说,直接以实例说明>>
1.创建生成器推导式

>>> g = ((i+2)**2 for i in range(10))
>>> g
<generator object <genexpr> at 0x000001CA569C5AC8>

这样看来,生成器推导式创建时只不过将列表推导式的方括号改为圆括号即可(就这 ???当然不,接着往下看嘛 )
2.根据需要将创建好的生成器对象转化为列表或元祖

>>> g = ((i+2)**2 for i in range(10))
>>> g
<generator object <genexpr> at 0x000001CA569C5AC8>
>>> list(g)#将生成器对象转化为列表
[4, 9, 16, 25, 36, 49, 64, 81, 100, 121]
>>> tuple(g)#将生成器对象转化为元祖
()#为什么是空的??!看下面总结

关于惰性求值
1.是什么:惰性求值(Lazy Evaluation),又译为惰性计算、懒惰求值,也称为传需求调用(call-by-need)。
2.为什么:使用惰性求值的目的是要最小化计算机要做的工作。eg:生成器推导式是继列表推导式后的Python推导式,比列表推导式速度快,占内存少。
3.特点:不管用什么方法访问元素,当所有元素访问结束后,立马清空生成器对象。如果需要重新访问其中的元素,必须重新创建该生成器对象。

3.遍历生成器对象中的元素

>>> g = ((i+2)**2 for i in range(10))
>>> print(g.__next__())#使用生成器对象__next__()方法获取元素
4
>>> print(g.__next__())
9
>>> print(next(g))#使用内置函数next()方法获取生成器对象中的元素
16
>>> print(next(g))
25
#-----使用循环直接遍历生成器对象中的元素-------
g = ((i+2)**2 for i in range(10))
for item in g:
    print(item,end = ' ')

4.包含yield语句的函数可用来创建可迭代的生成器对象
通过一个例子体会:

def f():
    a,b = 1,1#序列解包,同时为多个元素赋值
    while True:
        yield a#暂停执行,需要时再产生一个新元素
        a,b = b,a+b#序列解包,继续生成新元素
a = f()#创建生成器对象
for i in range(10):#斐波那契数列中前十个元素
    print(a.__next__(),end = ' ')
    #结果:1 1 2 3 5 8 13 21 34 55
for i in f():
    if i > 100:#斐波那契数列中第一个大于100的元素
        print(i)
        #结果:144
        break
a = f()
print(next(a))#使用内置函数next()获取生成器对象中的元素
print(next(a))#每次获取新元素时,由yield语句生成
print(next(a))
#结果:
1
1
2

注:关于yield关键字
1.yield作为Python33个关键字之一,在生成器函数中用来返回值。Python33个关键字
2.可以把yield看做return,只不过return的作用是在程序中返回某个值,返回之后程序就不再往下运行了。而使用yield的函数是一个生成器,不仅仅是一个简单的函数。
3.可以将yield理解为:暂停执行需要时再产生一个新元素。也就是说,yield扮演的也是返回的角色,但并不意味着yield返回就结束了整个程序,仅仅是暂停,下次需要时再出现。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值