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
引用的纔是一個確定的生成器對象。