Python 定義生成器的函數的返回值

mywang88

2019-05-28

在 Python 的函數定義部分使用 yield 表達式,可以將函數轉化爲一個生成器函數

def count():
    for n in range(99):
        yield n

使用 type 內置函數進行檢查,會發現 count 是一個函數對象,而 count() 是一個生成器對象。

很多教程在此處的描述對初學者來說總是有些模糊,筆者初學時做了如下嘗試:

def count():
    for n in range(99):
        yield n
print(next(count()))
print(next(count()))
print(next(count()))

發現 next 內置函數似乎無法令 count() 這個生成器生成下一個值。

這當然是由於筆者沒能理解好 Python 中函數和生成器的概念,於是筆者做了如下實驗:

def count():
    for n in range(99):
        yield n
a = count()
b = count()
print(a is b)

代碼的結果不出意外是 False

也就是說, count 作爲一個生成器函數,它的返回值 count() 實際上是一個新的生成器對象。

a = count()
b = count()

兩次調用函數,返回值分別是兩個新的生成器對象,賦值給了兩個變量。

是否可以理解爲,含有 yield 表達的函數實際上還是一個函數呢?只是它的返回值變成了一個生成器對象?有待進一步學習。

這樣再回到開始的嘗試:

def count():
    for n in range(99):
        yield n
a = count()
print(next(a))
print(next(a))
print(next(a))

終於可以得到想象中的結果了,因爲變量 a 引用的纔是一個確定的生成器對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章