def intNum(): print("開始執行") for i in range(5): yield i print("繼續執行") num = intNum() print(num.send(None)) print(num.send(None))程式執行結果為:
開始執行
0
繼續執行
1
這裡重點講解一些帶引數的 send(value) 的用法,其具備 next() 函數的部分功能,即將暫停在 yield 語句出的程式繼續執行,但與此同時,該函數還會將 value 值作為 yield 語句返回值賦值給接收者。注意,雖然 send(None) 的功能是 next() 完全相同,但更推薦使用 next(),不推薦使用 send(None)。
def foo(): bar_a = yield "hello" bar_b = yield bar_a yield bar_b f = foo() print(f.send(None)) print(f.send("C語言中文網")) print(f.send("http://c.biancheng.net"))分析一下此程式的執行流程:
hello
C語言中文網
http://c.biancheng.net
def foo(): try: yield 1 except GeneratorExit: print('捕獲到 GeneratorExit') f = foo() print(next(f)) f.close()程式執行結果為:
1
捕獲到 GeneratorExit
def foo(): try: yield 1 except GeneratorExit: print('捕獲到 GeneratorExit') yield 2 #丟擲 RuntimeError 異常 f = foo() print(next(f)) f.close()程式執行結果為:
1
捕獲到 GeneratorExit Traceback (most recent call last):
File "D:python3.61.py", line 10, in <module>
f.close()
RuntimeError: generator ignored GeneratorExit
def foo(): yield "c.biancheng.net" print("生成器停止執行") f = foo() print(next(f)) #輸出 "c.biancheng.net" f.close() next(f) #原本應輸出"生成器停止執行"程式執行結果為:
c.biancheng.net
Traceback (most recent call last):
File "D:python3.61.py", line 8, in <module>
next(f) #原本應輸出"生成器停止執行"
StopIteration
def foo(): try: yield 1 except ValueError: print('捕獲到 ValueError') f = foo() print(next(f)) f.throw(ValueError)程式執行結果為:
1
捕獲到 ValueError
Traceback (most recent call last):
File "D:python3.61.py", line 9, in <module>
f.throw(ValueError)
StopIteration