Python 生成器裡面的 return 有什麼用?
最近,在交流群裡,有一位小夥伴問了這樣一個問題:
def gen_data(num):
if
num >
10
:
for
i
in
range(num):
yield
i
else
:
return
num
generator = gen_data(
5
)
for
num
in
generator:
print(num)
當傳入的
的
引數小於等於 10 的時候,為什麼沒有返回這個引數本身?
這道題,當我們傳入的引數大於 10 的時候,能得到符合預期的結果
如下圖所示:
但是,當我們傳入資料 5 的時候,我們來看看執行效果:
可以看到,數字 5 並沒有被打印出來,程式直接執行到了最後
之所以會出現這種情況,是因為這個同學以為,當引數大於 10 的時候,
gen_data(12)
返回的是生成器,而當引數不大於 10 的時候,返回的是一個數字
顯然這樣的想法是不對的,否則,
for num in 10
這種語法早就報錯了,數字是不能被迭代的
正確的說法應該是,因為
gen_data
裡面有
yield
,所以
gen_data(引數)
返回一個生成器。無論引數傳入的是什麼,返回的都是生成器
如下圖所示:
為了說明為什麼傳入引數為 5 的時候,for 迴圈不執行,我們簡化一下程式碼:
def gen_data():
yield
1
yield
2
yield
3
return
4
generator = gen_data()
for
num
in
generator:
print(num)
執行效果如下圖所示:
可以看到,對於這樣一個非常簡單的生成器,在 for 迴圈裡面也只是列印了數字123,並沒有列印數字 4
關於生成器中的
return
,我們可以從 Python 官方文件
PEP 255 — Simple Generators
[1]
中找到說明:
return
在生成器中,表示生成器執行完成了,可以結束了。然後生成器會丟擲一個
StopIteration
的異常。而
for
迴圈能夠檢測到這個異常,於是結束迴圈
所以當我們傳入的引數為 5 的時候,生成器直接執行到了
return
,於是它直接就丟擲
StopIteration
,於是 for 迴圈檢測到這個異常就結束了
在生成器裡面的
return
只是一個結束標誌,它不會把後面寫的值返回給呼叫者,這跟函數里面的
return
語句是不一樣的。
很多小夥伴在學習python的時候總會遇到一些問題和瓶頸,沒有方向感,不知道該從哪裡入手去提升,對此我整理了一些資料,希望能夠去幫助到小夥伴們,可以關注up主,並在後臺私信小編:“資料”即可領取。
相關文章
- 2021-06-14軸距超2米7,比昂科威靠譜的德系SUV
- 2021-06-11將SHAP用於特徵選擇和超引數調優
- 2021-06-09多久做次四輪定位?你可別被忽悠了就行
- 2021-04-21虎牙獨播LCK:尺帝厄斐琉斯力挽狂瀾,GEN讓一追二險勝AF
- 2021-04-12LPL最強對手誕生!DK決賽奪冠,零封GEN嚇壞LPL觀眾