Python 函數爲何會默認返回 None?

點擊藍色「Python空間」關注我丫程序員

加個「星標」,天天一塊兒快樂的學習web


Python 有一項默認的作法,不少編程語言都沒有——它的全部函數都會有一個返回值,無論你有沒有寫 return 語句。 編程

本文出自「Python爲何」系列,在正式開始以前,咱們就用以前討論過的 pass語句…對象 做爲例子,看看 Python 的函數是怎樣「無中生有」的:微信

能夠看出,咱們定義的兩個函數都沒有寫任何的 return 語句,可是在函數調用後,都能取到一個返回值。app

它們的執行效果跟直接寫 return 語句相比,是徹底相同的:編程語言

這 4 個例子屬於兩種類型:一種沒有寫 return,可是都有隱藏的 return 返回值;一種寫了 return,並且實際也有返回值。函數

也就是說,後者在語義和行爲上表現一致,前者雖然在語義上缺失,可是卻有實際的行爲和結果;後者的行爲是顯性的,前者倒是隱性的。 學習

《Python之禪》中有一句「顯性勝於隱性(Explicit is better than implicit)」,可是,出於簡潔和便利的考慮(Simple is better than complex),實際上 Python 中有不少行爲都是隱性的,會把一些在語法層面的事交給解釋器去完成。網站

上一期的 真值判斷 是隱性的行爲,本文前兩個例子也是如此。ui

使用dis查看字節碼,就能夠看到其背後的小動做:

在這個對比圖中,能夠看出上述 4 個函數的解釋器指令如出一轍!

無論有沒有寫 return,它們都會執行 return 的邏輯,並且默認的返回值就是  None。

那麼,問題來了:Python 的函數爲何能默認返回 None 呢?它是如何實現的呢?

答案就在解釋器中,當 CPython 解釋器執行到函數的最後一個代碼塊時,若發現沒有返回值,它就會主動地加上一個 Py_None 值返回(出自:compile.c):

也就是說,若是定義的函數沒有返回值,Python 解釋器就會(強行地)默認給咱們注入一段返回邏輯!

對於解釋器的這種附贈的服務,你們是以爲很貼心,仍是嫌棄它多事呢?

這樣的作法彷佛沒多少好處,但彷佛也沒有壞處?

那麼,這就會引出新的問題:Python 爲何要求函數都要有返回值呢?爲何它不像某些語言那樣,提供一個 void 關鍵字,支持定義無返回值的空函數呢?  

我們下期見~


最後我最近建了一個讀者交流羣,想加入的能夠在公衆號後臺回覆加羣便可~


  
      
      
       
       
                
       
  
      
推薦閱讀:
爆肝整理 400 頁 《Python 修煉之道》,高清電子書送給一直支持個人讀者!
GitHub 標星 3.2w+,程序員最該看的網站都在這裏了,收藏了事半功倍!
全網最強的開發者技術路線圖已經更新到 2020 年!GitHub 標星 114k+,還有中文的!
學妹揪着讓我推薦一波 Python 視頻和書單,爲了讓她再也不煩我,我總結了這些。


👆掃描上方二維碼便可關注

本文分享自微信公衆號 - Python空間(Devtogether)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索