概述
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返回就结束了整个程序,仅仅是暂停,下次需要时再出现。
最后
以上就是无语河马为你收集整理的Python生成器推导式Python 生成器推导式的全部内容,希望文章能够帮你解决Python生成器推导式Python 生成器推导式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复