簡體   English   中英

python生成器中產量的確切返回點

[英]Exact return point of yield in python generators

為了自學Python生成器,尤其是它們的send()方法,我想寫一個玩具示例,讓我計算一個“可中斷的”斐波那契序列。

最終我成功了,但是我不知道到底發生了什么。 考慮這兩個例子。

成功的例子:

def genFib(a=0, b=1):
    while True:
        c = yield a+b
        if c:
            a, b = b, c
        else:
            a, b = b, a+b
    return
​
fib_number = genFib()
​
print fib_number.next()
print fib_number.next()
print fib_number.next()
print fib_number.next()
print fib_number.next()
print fib_number.send(100)
print fib_number.next()
print fib_number.next()
​
1
2
3
5
8
105
205
310

我認為可以解決的失敗:

def genFib(a=0, b=1):
    while True:
        c = yield a+b
        a, b = b, c
    return
​
fib_number = genFib()
​
print fib_number.next()
print fib_number.next()
1
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-59-4513153ea517> in <module>()
      8 
      9 print fib_number.next()
---> 10 print fib_number.next()

<ipython-input-59-4513153ea517> in genFib(a, b)
      1 def genFib(a=0, b=1):
      2     while True:
----> 3         c = yield a+b
      4         a, b = b, c
      5     return

TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'

為什么第二個示例不起作用? 特別是,第二個示例似乎在生成器的第一次執行之外的所有其他操作中為c分配了None值。 為什么? 如何知道第一次調用next()而不是下next()時分配給c

我的理解是,生成器從屈服線之后的行開始恢復執行(當再次調用它們時),但是我的示例讓我認為這是錯誤的,至少在某些情況下是這樣。 執行從何處恢復? 它會重新執行yield線,但是這次以某種方式放棄了yield后的所有內容嗎? c如何分配給None

yield有點奇怪。 在評估右側之后但在分配發生之前,執行會在yield處暫停。

yield語句中返回的值是您.send給生成器的任何.send 由於您正在調用.next而不是.send ,因此yield表達式( c )返回的值為None 在第一個示例中,這很好,因為會檢查c的真實性,然后在它為假的情況下不使用它(例如None )。 但是,在第二個示例中,未選中c因此最終將None添加到整數(這顯然不會產生理想的結果)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM