void
是編程語言中最多見的關鍵字之一,從字面上理解,它是「空的、空集、空白」的意思,最經常使用於 表示函數的一種返回值類型。python
維基百科上有一個定義:git
The void type, in several programming languages derived from C and Algol68, is the type for the result of a function that returns normally, but does not provide a result value to its caller.程序員
在 C、Algol68 及它們所派生的幾種編程語言中,void 類型是函數正常返回的一種類型,可是不會給調用者返回一個值。github
簡單來講,void 是一種類型(type),可是沒有具體的值(value)。編程
這究竟是什麼意思呢?異步
以 Python 的幾種常見類型爲例,咱們能夠從對比中看出規律:int 是一種表示整數的類型,它有無限個可能的整數值;bool 是一種布爾類型,它有兩個可能的值(True 和 False);NoneType 是一種表示 None 的類型,它只有一個值(None)。編程語言
至於 void,它是一種更爲抽象的特殊類型,可是不包含任何值。ide
介紹完概念上的含義,咱們就能夠進入正題了。標題中的問題能夠進一步分解成兩個:函數
對於第一個問題,咱們以 C/C++ 爲例,先看看 void 的兩種使用場景(PS:此處只考慮函數的用法,不考慮指針的用法,由於 Python 沒有指針):設計
當 void 用在函數的參數位置時,它表示該函數不須要傳參。
最初 C 語言的f()
表示參數數量不肯定,爲了另外表達「不須要參數」的語義,因此引入f(void)
做爲限定。後來的語言(包括 Python)基本不在參數中使用 void,而是直接用f()
表示不需傳參。C++ 爲了兼容 C,因此才同時支持這兩種語法。
當 void 用在函數前做修飾時,它表示該函數沒有返回值。
在 C 語言中,若不聲明返回類型,則f()
函數在編譯後會返回整型的值。爲了不混亂,當不須要返回值時,就使用void f()
來做限定。
同時,更主要的是,它還起到了佔位符的做用,代表一個函數的類型是已知的,這對代碼可讀性和編譯都有所幫助。
void 做爲函數的空返回值類型,這種用法在 C++/Java 中也被繼承了。另外,在 Javascript 中也有 void 的身影,只不過它成了一種操做符,起到了徹底不一樣的做用,此處不表。
可是,Python 從頭至尾都沒有 void 關鍵字。
爲何會這樣?難道是由於在 Python 中不存在其它語言所面對的問題麼?仍是說,Python 中有本身的一套解決方案?
仍以跟函數相關的兩種用法爲例做分析吧。
在表示函數不需傳參時,f(void)
這種寫法根本就是多餘的,因此 Python 使用了最簡單明瞭的無參式寫法f()
。
至於返回值類型的用法,在咱們定義出一個函數時,例如最簡單的def func():pass
,爲了讓它的調用結果func()
是一個合法的對象,那它必須具備一個有效的類型(type)。
這應該是以類型爲基的編程語言都會遇到的共性問題,Python 也不例外。
這個時候,若是函數自己沒有顯式地 return 出一個對象的話,就有兩種可能的解決辦法:
簡單而言,Python 的設計思路是直接複用已有的 NoneType 類型,並讓解釋器來填補缺失掉的函數類型。
關於 Python 解釋器的這個隱式填補過程,我已在上一篇《Python 函數爲何會默認返回 None?》文章詳細分析過,感興趣的同窗可去查閱。
這樣作的好處至少有兩點:一是沒有引入新的 void 類型和關鍵字;二是不須要程序員在函數前聲明返回類型,這就跟有顯式返回值的寫法保持了一致。
試想一下,若是 Python 不讓函數默認有返回值的話,就可能要寫成 void def func():...
這樣的形式,那它就變成了函數定義時的一種特例。與另外一種特例函數相比,即異步函數asyc def func():...
,就可能引發混亂。
整體而言,Python 彷佛認爲 void 空類型不是那麼有存在的必要,彷佛 NoneType 類型就足夠了,而當缺乏返回值時,讓解釋器統一注入是極爲方便的,所以纔出現了咱們看到的現狀。
至此,文章標題的問題算是圓滿回答了。
最後,讓咱們開始進入 ending 吧:本文明面上是以「Python 爲何沒有 void 關鍵字」爲切入點,然而,它實際上瞄準的倒是「Python 爲何須要返回 None」的問題。
在《Python 函數爲何會默認返回 None?》這篇文章中,我介紹了 Python 中函數默認返回 None 的機制,它是屬於「how can」的內容。可是爲何要默認返回 None 呢?這則是屬於「why need」或者「why should」的問題,而它須要從 void 關鍵字的缺失開始談起……
那麼,爲何 Python 沒有 void 關鍵字呢?請往上翻,從新閱讀本文……
本文屬於「Python爲何」系列(Python貓出品),該系列主要關注 Python 的語法、設計和發展等話題,以一個個「爲何」式的問題爲切入點,試着展示 Python 的迷人魅力。全部文章將會歸檔在 Github 上,項目地址:https://github.com/chinesehuazhou/python-whydo