python 3 協程函式

2022-08-02 02:51:08 字數 2065 閱讀 1759

1:把函式的執行結果封裝好__iter__和__next__,即得到乙個迭代器

2:與return功能類似,都可以返回值,但不同的是,return只能返回一次值,而yield可以返回多次值

3:函式暫停與再繼續的狀態是由yield儲存的

def

func(count):

print('

start')

while

true:

yield

count

count+=1g=func(10)

print

(next(g))

print

(next(g))

使用了yield表示式形式

defeater(name):

print('

%s 說:我開車啦

' %name)

while

true:

food=yield

#預設返回為空,實際上為x=yield none

print('

%s eat %s

' %(name,food))

alex_g=eater('

alex')

print

(alex_g)

結果:generator object eater at 0x000000000271b200alex 說:我開車啦

yield表示式形式要先執行next(),讓函式初始化並停在yield,相當於初始化函式,然後再send() ,send會給yield傳乙個值 ** next()和send() 都是讓函式在上次暫停的位置繼續執行,next是讓函式初始化,send在觸發下一次**的執行時,會給yield賦值

def

eater(name):

print('

%s 說: 我開動啦

' %name)

food_list=

while

true:

food=yield

food_list

#['骨頭','菜湯']

print('

%s eat %s

' %(name,food))

alex_g=eater('

alex')

next(alex_g)

#讓函式初始化,等同於alex_g.send(none)

# next(alex_g)  #讓函式初始化,等同於alex_g.send(none) 如果注釋這行執行時會報錯: typeerror: can't send non-none value to a just-started generator

#第二階段:給yield傳值

print(alex_g.send('骨頭')) # #1 先給當前暫停位置的yield傳骨頭 2 繼續往下執行,直到再次碰到yield,然後暫停並且把yield後的返回值當做本次呼叫的返回值

print(alex_g.send('肉包子'))

print(alex_g.send('菜湯'))

使用裝飾器初始化

1

definit(func):

23 res = func(*args,**kwargs)

4 next(res) #

初始化next操作,

5return

res6

return

7@init

8def

eater(name):

9print('

%s 說: 我開動啦

' %name)

10 food_list=

11while

true:

12 food=yield

food_list

1314

print('

%s eat %s

' %(name,food))

1516 g = eater('

alex')

17print(g.send('

骨頭'))

view code

python3協程學習筆記

在此之前,協程對我來說是乙個比較陌生的概念,學習之後,發現其應用場景還是有不少,大師之言 協程能自然地表述很多演算法,例如 遊戲 非同步i o,以及其他事件驅動型邊吃形式活協作式多工。舉例來說,asyncio tornado twisted simpy庫都是基於協程特性在單個執行緒中管理多個併發活動...

python3協程數量限制 多工 3 協程

環境 python3.6 非同步io 我們知道,cpu 速度遠遠快於磁碟 網路等 io。在 io 程式設計中,假如乙個 io 操作阻塞了當前執行緒,會導致其他 無法執行,所以我們使用多執行緒或者多程序來併發執行 針對這個問題,我們需要另一種解決方法 非同步 io。非同步 io,即當 需要執行乙個耗時...

python協程函式

例項 def menu x print welcome s to shaxian restaurant x men list while true print men list food yield men list print s start to eat s x,food g menu 張三 n...