1,什麼是生成器?編程
只要函數內部包含yield關鍵字,那麼函數名()獲得的結果就是生成器,並且不會執行函數內部代碼app
def func():
print('============first')
yield 1函數
print('second)code
yield 2內存
print(third)input
yield3generator
print('end')it
g=func()object
print(g)yield
2 ,生成器就是迭代器
g.__iter__
g.__next__
生成器就是迭代器,所以能夠這麼取值
res=next(g)
print(res)
3,攜程函數 yield
yield 關鍵字的另一種使用形勢:表達式形式的yield
def eater(name):
print('%s 準備開始吃飯啦'%name)
foo_list=[]
while True:
food=yield food_list
print('%s吃了%s'%(name,food_list)
food_list.append(food)
g=eater('egon')
g.send(None)#對於表達式形式的yield,在使用時,第一次必須傳None,g.send(None)等同於next(g)
g.send('真顱骨')
g.send('蒸熊掌')
yield 總結
1,把函數作成迭代器
2,對比return, 能夠返回屢次值,能夠掛起\保存函數的運行狀態
4,三元表達式
name=input('姓名')
res='sb ' if name =='alex' else 'NB'
列表推導式
egg_list=[]
for i in range (10):
egg_list.append('雞蛋%s' %i)
egg_list =['雞蛋%s'%i for i in range(10)]
優勢:方便,改變了編程習慣,可稱之爲聲明式編程
五,生成器表達式
1, 把 列表推導式的[ ]換成()就是生成器表達式
一、把列表推導式的[]換成()就是生成器表達式 #二、示例:生一筐雞蛋變成給你一隻老母雞,用的時候就下蛋,這也是生成器的特性 >>> chicken=('雞蛋%s' %i for i in range(5)) >>> chicken <generator object <genexpr> at 0x10143f200> >>> next(chicken) '雞蛋0' >>> list(chicken) #因chicken可迭代,於是能夠轉成列表 ['雞蛋1', '雞蛋2', '雞蛋3', '雞蛋4',] #三、優勢:省內存,一次只產生一個值在內存中