python生成器呼叫方法引發異常

petterchx發表於2021-09-11

python生成器呼叫方法引發異常

(推薦作業系統:windows7系統、Python 3.9.1、DELL G3電腦。)

注意,在生成器已經執行時呼叫下面的任何生成器方法會引發 ValueError 異常。

1、__next__

開始執行一個生成器或者從上一次 yield 語句後繼續執行。當使用該方法繼續(注意是繼續而不是第一次執行)時,那麼當前 yield 的返回值為 None,直到執行到下一次的 yield 語句時,yield 語句後的表示式的結果才會返回給呼叫者。當迭代器結束時會丟擲 StopIteration 異常。

該方法會被 for 以及內建函式 next 隱式的呼叫。

2、send

繼續執行生成器(注意是繼續而不是第一次執行),併傳送一個值到生成器函式。send 方法的引數是下一個 yield 語句的返回值,前提是 yield 語句中要事先接收它傳遞的引數。如果使用該方法啟動(也就是第一次執行)生成器,必須使用 None 作為其引數,因為此時還沒有 yield 能夠接收它的值(畢竟接收該值的語句還沒有開始執行)。

def fn():
    a = 0
    while True:
        a += 1
        r = yield # r 就是接收 send 引數的變數
        print('{} => {}'.format(a, r))
 
>>> f = fn()
>>> f.send('a') # 不傳遞 None 的後果
Traceback (most recent call last):
  File "/opt/python3/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 2910, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-31-6f758a7cad28>", line 1, in <module>
    f.send('a')
TypeError: can't send non-None value to a just-started generator
>>> next(f) # 也可以不傳遞 None 而是使用 next 執行,兩種方式都可以
>>> f.send('a')
1 => a
>>> f.send('b')
2 => b

以上就是python生成器呼叫方法引發異常,希望能對大家有所幫助。更多Python學習指路:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4606/viewspace-2830544/,如需轉載,請註明出處,否則將追究法律責任。

相關文章