Python:筆記(7)——yield關鍵字

Python:筆記(7)——yield關鍵字

yield與生成器

  所謂生成器是一個函數,它能夠生成一個值的序列,以便在迭代中使用。函數使用yield關鍵字能夠定義生成器對象。python

一個例子

  咱們調用該函數,就會發現其中的代碼不會開始執行函數

def countdown(n):
    print('從%d開始減小'%n)
    while(n>0):
        yield n
        n-=1
    return

countdown(10)

  相應的,該函數返回一個生成器對象。接着該生成器對象就會在__next__被調用時執行函數,如:協程

c = countdown(10)
# <generator object countdown at 0x102d0b780>
print(c.__next__())
# 10
print(c.__next__())
# 9

  調用next時,生成器函數開始執行語句,直至遇到yield語句爲止。yield語句在函數執行中止的地方生成一個結果,直至再次調用next。而後繼續執行yield以後的語句。對象

生成器的用法

  一般不會在生成器上直接調用next()方法,而是經過for語句,sum()或一些消耗序列的其餘操做使用生成器。blog

for n in countdown(5):
    print(n)

print(sum(countdown(5)))

  

協程與yield表達式

  在函數內,yield語句還能夠做爲表達式使用,出如今賦值運算符的右邊,例如:generator

def receiver():
    print('Ready to receive')
    while True:
        n = (yield)
        print(n)

r = receiver()
r.__next__()
# Ready to receive
r.send(1)
# 1
r.send(2)
# 2
r.send('Hello')
# Hello

  以這種方式使用yield語句的函數稱爲協程,向函數發送值時函數將執行。接收到值後,協程就會執行語句,直至遇到下一個yield語句。class

說明:一開始必須先執行next函數,這樣協程才能執行第一個yield表達式以前的語句object

關閉協程

  協程通常會不斷地執行下去,除非被顯式關閉或本身退出,顯式關閉執行close語句便可。yield

相關文章
相關標籤/搜索