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 的時候,能得到符合預期的結果

如下圖所示:

Python 生成器裡面的 return 有什麼用?

但是,當我們傳入資料 5 的時候,我們來看看執行效果:

Python 生成器裡面的 return 有什麼用?

可以看到,數字 5 並沒有被打印出來,程式直接執行到了最後

之所以會出現這種情況,是因為這個同學以為,當引數大於 10 的時候,

gen_data(12)

返回的是生成器,而當引數不大於 10 的時候,返回的是一個數字

顯然這樣的想法是不對的,否則,

for num in 10

這種語法早就報錯了,數字是不能被迭代的

正確的說法應該是,因為

gen_data

裡面有

yield

,所以

gen_data(引數)

返回一個生成器。無論引數傳入的是什麼,返回的都是生成器

如下圖所示:

Python 生成器裡面的 return 有什麼用?

為了說明為什麼傳入引數為 5 的時候,for 迴圈不執行,我們簡化一下程式碼:

def gen_data():

yield

1

yield

2

yield

3

return

4

generator = gen_data()

for

num

in

generator:

print(num)

執行效果如下圖所示:

Python 生成器裡面的 return 有什麼用?

可以看到,對於這樣一個非常簡單的生成器,在 for 迴圈裡面也只是列印了數字123,並沒有列印數字 4

關於生成器中的

return

,我們可以從 Python 官方文件

PEP 255 — Simple Generators

[1]

中找到說明:

Python 生成器裡面的 return 有什麼用?

return

在生成器中,表示生成器執行完成了,可以結束了。然後生成器會丟擲一個

StopIteration

的異常。而

for

迴圈能夠檢測到這個異常,於是結束迴圈

所以當我們傳入的引數為 5 的時候,生成器直接執行到了

return

,於是它直接就丟擲

StopIteration

,於是 for 迴圈檢測到這個異常就結束了

在生成器裡面的

return

只是一個結束標誌,它不會把後面寫的值返回給呼叫者,這跟函數里面的

return

語句是不一樣的。

很多小夥伴在學習python的時候總會遇到一些問題和瓶頸,沒有方向感,不知道該從哪裡入手去提升,對此我整理了一些資料,希望能夠去幫助到小夥伴們,可以關注up主,並在後臺私信小編:“資料”即可領取。

相關文章