點擊藍色「Python空間」關注我丫程序員
加個「星標」,天天一塊兒快樂的學習web
![](http://static.javashuo.com/static/loading.gif)
Python 有一項默認的作法,不少編程語言都沒有——它的全部函數都會有一個返回值,無論你有沒有寫 return 語句。 編程
本文出自「Python爲何」系列,在正式開始以前,咱們就用以前討論過的 pass語句 和 …對象 做爲例子,看看 Python 的函數是怎樣「無中生有」的:微信
![](http://static.javashuo.com/static/loading.gif)
能夠看出,咱們定義的兩個函數都沒有寫任何的 return 語句,可是在函數調用後,都能取到一個返回值。app
它們的執行效果跟直接寫 return 語句相比,是徹底相同的:編程語言
![](http://static.javashuo.com/static/loading.gif)
這 4 個例子屬於兩種類型:一種沒有寫 return,可是都有隱藏的 return 返回值;一種寫了 return,並且實際也有返回值。函數
也就是說,後者在語義和行爲上表現一致,前者雖然在語義上缺失,可是卻有實際的行爲和結果;後者的行爲是顯性的,前者倒是隱性的。 學習
《Python之禪》中有一句「顯性勝於隱性(Explicit is better than implicit)」,可是,出於簡潔和便利的考慮(Simple is better than complex),實際上 Python 中有不少行爲都是隱性的,會把一些在語法層面的事交給解釋器去完成。網站
上一期的 真值判斷 是隱性的行爲,本文前兩個例子也是如此。ui
使用dis
查看字節碼,就能夠看到其背後的小動做:
![](http://static.javashuo.com/static/loading.gif)
在這個對比圖中,能夠看出上述 4 個函數的解釋器指令如出一轍!
無論有沒有寫 return,它們都會執行 return 的邏輯,並且默認的返回值就是 None。
那麼,問題來了:Python 的函數爲何能默認返回 None 呢?它是如何實現的呢?
答案就在解釋器中,當 CPython 解釋器執行到函數的最後一個代碼塊時,若發現沒有返回值,它就會主動地加上一個 Py_None 值返回(出自:compile.c):
![](http://static.javashuo.com/static/loading.gif)
也就是說,若是定義的函數沒有返回值,Python 解釋器就會(強行地)默認給咱們注入一段返回邏輯!
對於解釋器的這種附贈的服務,你們是以爲很貼心,仍是嫌棄它多事呢?
這樣的作法彷佛沒多少好處,但彷佛也沒有壞處?
那麼,這就會引出新的問題:Python 爲何要求函數都要有返回值呢?爲何它不像某些語言那樣,提供一個 void 關鍵字,支持定義無返回值的空函數呢?
我們下期見~
最後我最近建了一個讀者交流羣,想加入的能夠在公衆號後臺回覆「加羣」便可~
推薦閱讀: 爆肝整理 400 頁 《Python 修煉之道》,高清電子書送給一直支持個人讀者! GitHub 標星 3.2w+,程序員最該看的網站都在這裏了,收藏了事半功倍!
全網最強的開發者技術路線圖已經更新到 2020 年!GitHub 標星 114k+,還有中文的!
學妹揪着讓我推薦一波 Python 視頻和書單,爲了讓她再也不煩我,我總結了這些。
👆掃描上方二維碼便可關注
本文分享自微信公衆號 - Python空間(Devtogether)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。