1. 程式人生 > >python生成器和推導式

python生成器和推導式

繼續 循環 yield ext generator UNC for循環 [] 生成器

一.生成器
什麽是生成器.生成器實質就是叠代器.
在python中有三種方式來獲取生成器:
1.通過生成器函數
2.通過各種推導式來實現生成器
3.通過數據的裝換也可以獲取生成器
def func():
print("111")
return 222
ret = func()
print(ret)
結果:111
222

將函數中的return換成yield就是生成器
def func()
print(“111”)
yield 222
ret = func()
pritn(ret)

結果:<generator object func at 0x000000000219A390>
運行的結果和上面的不一樣。由於函數中存在了yield。這個函數就是一個生成器函數
當我們在執行這個函數的時候,就不再是函數的執行的,而是獲取這個生成器。

# def func():
# print("111")
# yield 222
# gener = func() #這個時候函數不會執行,而是獲取生成器.
# ret = gener.__next__() #這個時候函數才會執行.yield和retunr的作用一樣都是返回函數
# print(ret)
# 結果:
# 111
# 222

#yield和return的區別:yield是分段執行一個函數.return直接停止執行函數
# def func():
# print("111")
# yield 222
# print("333")
# yield 444
# gener = func()
# ret = gener.__next__()
# print(ret)
# ret2 = gener.__next__()
# print(ret2)
# 結果:
# 111
# 222
# 333
# 444

當程序運行完最後一個yield,後面繼續進行--next--()程序會報錯

生成器的應用:
# def cloth():
# lst = []
# for i in range(0,10000):
# lst.append("衣服"+str(i))
# return lst
# cl = cloth()
# print(cl) #一次把衣服全部提取出來 ,特別占內存

# def cloth():
# for i in range(0,1000):
# yield "衣服"+str(i)
# cl = cloth()
# print(cl.__next__()) #衣服0
# print(cl.__next__()) #衣服1
#區別:第一種是直接一次性全部拿出來.會很占用內存,第二種使用生成器,一次就一個
#用多少生成多少.生成器是一個一個的指向下一個.不會回去,__next__到哪,指針就指到哪裏。


def eat():
print("吃什麽")
a = yield "饅頭"
print("a=",a)
b = yield "大餅"
print("b=",b)
c = yield "韭菜盒子"
print("c=",c)
yield "game"
gen = eat() #獲取生成器
ret1 = gen.__next__()
print(ret1)
ret2 = gen.send("胡辣湯")
print(ret2)
ret3 =gen.send("狗糧")
#打印結果:
# 吃什麽
# 饅頭
# a= 胡辣湯
# 大餅
# b= 狗糧
#send()和__next__()區別:
#1.send和next()都是讓生長器向下走一次
#2.send可以給上一個yield的位置傳遞值,不能給最後一個yield發送值
# 在第一次執行生成器時候不能使用send()

#生成器可以使用for循環來獲取內部的元素:
def func():
print(111)
yield 222
print(333)
yield 444
print(555)
yield 666
gen = func()
for i in gen:
print(i)
#結果:
# 222
# 333
# 444
# 555
# 666

#二.列表推導式,生成器表達式
# lst = []
# for i in range(1,15):
# lst.append(i)
# print(lst) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
#替換成列表推導式:
lst = [i for i in range(1,15)]
print(lst) #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
#列表推導式是通過一行來構建列表

字典的推倒式:

# lis1 = ["tabai","wusir"]
# lis2 = ["henbai","hense"]
# dic = {lis1[i]:lis2[i] for i in range(len(lis1))}
# print(dic) # {‘tabai‘: ‘henbai‘, ‘wusir‘: ‘hense‘}

集合推導式:
lst = ["馬化騰", "馬化騰", "王建忠", "張建忠", "張建忠", "張雪峰", "張雪峰"]

s = {i for i in lst} # 集合推倒式
print(s)

python生成器和推導式