Python 協程函數
阿新 • • 發佈:2017-07-31
htm res ini mark 證明 div 初始 wrapper **kwargs
1.1 協程函數理解
協程函數就是使用了yield表達式形式的生成器
def eater(name):
print("%s eat food" %name)
while True:
food = yield
print("done")
g = eater("gangdan")
print(g)
結果:
generator object eater at 0x00000000028DC048
這裏就證明了g現在就是生成器函數
1. 2 協程函數賦值過程
用的是yield的表達式形式
要先運行next(),讓函數初始化並停在yield,相當於初始化函數,然後再send() ,send會給yield傳一個值
** next()和send() 都是讓函數在上次暫停的位置繼續運行,
next是讓函數初始化
send在觸發下一次代碼的執行時,會給yield賦值
**
def eater(name):
print(‘%s start to eat food‘ %name)
food_list=[]
while True:
food=yield food_list
print(‘%s get %s ,to start eat‘ %(name,food))
food_list.append(food)
e=eater(‘鋼蛋‘) # wrapper(‘‘)
# print(e)
print(next(e)) # 現在是運行函數,讓函數初始化
print(e.send(‘包子‘)) #
print(e.send(‘韭菜餡包子‘))
print(e.send(‘大蒜包子‘))
這裏的關鍵是:
要先運行next()函數
用裝飾器函數把next()函數先運行一次:
def start(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs) # next()
next(res) # 這是關鍵
return res
return wrapper
@start # e = start(e)
def eater(name):
print(‘%s start to eat food‘ %name)
food_list=[]
while True:
food=yield food_list
print(‘%s get %s ,to start eat‘ %(name,food))
food_list.append(food)
e=eater(‘鋼蛋‘) # wrapper(‘鋼蛋‘)
print(e.send(‘包子‘))
print(e.send(‘韭菜餡包子‘))
print(e.send(‘大蒜包子‘))
[email protected] # e = start(e) 後面寫上,運行start函數,start函數返回wrapper
1.3 協程函數使用裝飾器初始化
這裏主要是為了防止忘記初始化next操作,在裝飾器中添加
def init(func):
def wrapper(*args,**kwargs):
res = func(*args,**kwargs)
next(res) # 在這裏執行next
return res
return wrapper
@init # eater=init(rater)
def eater(name):
print("%s eat food" %name)
food_list=[]
while True:
food = yield food_list
print("%s star to eat %s" %(name,food))
food_list.append(food)
print("done")
g = eater("gangdan")
# 這裏就不需要next
print(g.send("1"))
print(g.send("2"))
print(g.send("3"))
print(g.send("4"))
結果:
gangdan eat food
gangdan star to eat 1
[‘1‘]
gangdan star to eat 2
[‘1‘, ‘2‘]
gangdan star to eat 3
[‘1‘, ‘2‘, ‘3‘]
gangdan star to eat 4
[‘1‘, ‘2‘, ‘3‘, ‘4‘]
```
只要用到裝飾器函數,馬上寫裝飾器函數,[email protected]** eater=init(eater) **,先執行裝飾器函數。
關鍵是next(res),這裏是是對生成器進行初始化。這裏就會只執行一次,執行完後後面運行的都是e.send()
轉載出自:http://www.cnblogs.com/Python666/p/6702422.html
Python 協程函數