一、什么是生成器?
生成器 是自定義的迭代器,
通過定義函式的方式,可以得到一個生成器物件,
在定義函式的時候,使用yield關鍵字,之后再呼叫函式,就可以得到一個生成器物件,
所以如何去自定義一個迭代器呢? 就是通過使用yield關鍵字定義函式后呼叫函式,就可以獲得一個自定義的迭代器物件,也就是生成器物件,
迭代器如何去取值,生成器就如何取值 ,呼叫函式的時候,會拿到生成器物件,如果要執行函式取值,還需要通過next方法,next方法 會呼叫執行函式,碰到yield 就停下來,再次呼叫next, 函式才會再次運行,函式所有值取進之后,再執行next方法,會拋出例外,
除了使用next 方法來執行函式,其實還可以使用send()方法,
def dog():
print("dog準備吃東西...“ )
while True:
x = yield # x拿到的是send給yield的值
print("dog吃了%s" %x)
g = dog() # 呼叫函式得到一個生成器物件g
g.send(None) # 第一次send傳值給yiled的時候,必須是一個None值,相當于使用next(g),必須要讓函式掛起到某個位置,才能再給yield傳值
g.send('骨頭') # dog 吃了骨頭
g.send('肉包子') # dog吃了肉包子
=======================================================》
yield 除了 可以接收send()傳入的值,還可以用于函式回傳值,用法類似于return,不過函式碰到return就停止,碰到yield是掛起,再次next 或者send的時候從掛起的地方繼續運行,
def dog():
food_list = []
print("dog準備吃東西...“ )
while True:
x = yield food_list # x拿到的是send給yield的值
print("dog吃了%s" %x)
food_list.append(x)
g = dog() # 呼叫函式得到一個生成器物件g
res = g.send(None) # 第一次send傳值給yiled的時候,必須是一個None值,相當于使用next(g),必須要讓函式掛起到某個位置,才能再給yield傳值
print(res) # food_list = []
res = g.send('骨頭') # dog 吃了骨頭
print(res) # food_list = ['骨頭‘]
res = g.send('肉包子') # dog吃了肉包子
print(res) # food_list = ['骨頭‘,'肉包子']
二、生成式
1.串列生成式
l = ['a_l','b_l','c_l','d_l','e_l','a',]
l1 = [x for x in l if x.endswith('l')] # for回圈拿出一個值,只要值滿足條件(條件也可以省略,就是默認成 if True),就把X放到串列中,
相當于下面這段代碼的操作,但是更精簡,
l2 = []
for i in l:
if i.endswith('l'):
l2.append(i)
l3 = [x.upper() for x in l] # ['A_L', 'B_L', 'C_L', 'D_L', 'E_L', 'A']
l4 = [x.replace('_l','') for x in l] # ['a', 'b', 'c', 'd', 'e', 'a']
2.字典生成式
keys = ['name','age','gender']
dic = {key:[] for key in keys} # {'name': [], 'age': [], 'gender': []}
items = [('name','bob'),('age',16),('gender','male')]
dic2 = { x[0]:x[1] for x in items if x[0] != 'gender'} # {'name': 'bob', 'age': 16}
dic3 = {k:v for k,v in items if k != 'gender'} # {'name': 'bob', 'age': 16}
3.集合生成式
keys = ['name','age','gender']
set1 = {key for key in keys} # {'age', 'gender', 'name'}
4.元祖生成式(然鵝,沒有元祖生成式)
g = (i for i in range(10) if i > 3) # <generator object <genexpr> at 0x002610B0>
帶上小括號的可不是元祖生成式,他是生成器運算式,所以我們現在又得到了一個拿到生成器的方法啦,
print(sum(g)) # 不占用記憶體,括號還可以省略,print(sum(i for i in range(10) if i > 3))也可以的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/71706.html
標籤:Python
上一篇:面試了一家四方集團(只有4個人的公司),面試官和我大談夢想
下一篇:三元運算式
