1. 程式人生 > >Python 協程函數

Python 協程函數

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 協程函數