1:把函式的執行結果封裝好__iter__和__next__,即得到乙個迭代器
2:與return功能類似,都可以返回值,但不同的是,return只能返回一次值,而yield可以返回多次值
3:函式暫停與再繼續的狀態是由yield儲存的
defyield表示式形式要先執行next(),讓函式初始化並停在yield,相當於初始化函式,然後再send() ,send會給yield傳乙個值 ** next()和send() 都是讓函式在上次暫停的位置繼續執行,next是讓函式初始化,send在觸發下一次**的執行時,會給yield賦值func(count):
print('
start')
while
true:
yield
count
count+=1g=func(10)
(next(g))
(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')
(alex_g)
結果:generator object eater at 0x000000000271b200alex 說:我開車啦
def# next(alex_g) #讓函式初始化,等同於alex_g.send(none) 如果注釋這行執行時會報錯: typeerror: can't send non-none value to a just-started generatoreater(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)
#第二階段:給yield傳值
print(alex_g.send('骨頭')) # #1 先給當前暫停位置的yield傳骨頭 2 繼續往下執行,直到再次碰到yield,然後暫停並且把yield後的返回值當做本次呼叫的返回值
print(alex_g.send('肉包子'))
print(alex_g.send('菜湯'))
使用裝飾器初始化
1view codedefinit(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('
骨頭'))
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...