Python 為什麼要有 pass 語句?

2021-10-24 08:53:11 字數 2600 閱讀 1965

關於 python 中的pass語句,它似乎很簡單(只有 4 個字母),即使是沒有任何程式設計經驗的初學者也能很快地掌握它的用法。

官方文件 的介紹十分簡單,下面的三個例子可以讓我們快速地了解到如何使用它:

簡單而言,pass 是一種空操作(null operation),直譯器執行到它的時候,除了檢查語法是否合法,什麼也不做就直接跳過。

它跟 return、break、continue 和 yield 之類的非空操作相比,最大的區別是它不會改變程式的執行順序。它就像我們寫的注釋,除了占用一行**行,不會對所處的作用域產生任何影響。

python 這麼設計,到底是出於什麼原因呢?

是為了解決大部分程式語言都要面對的共性問題,還是因為它有自己的新發現,所以創造出來乙個新的特性?

換句話說:python 為什麼要有 pass 語句,它能解決什麼問題(好處),如果沒有它,會導致什麼問題(壞處)?

接下來,本文將從兩個維度展開分析。

1、對人:作為空間佔位符

我把它看作是一種言簡意賅的注釋方式,等於是說「這裡先預留位置,回頭再補上具體的**實現」。

比如在多層的 if-elif-else 結構中,我們可以先把判斷條件寫好,然後在對應的塊中寫上 pass,以後再慢慢完善。

比如上文中給出的例子,我們可以先寫好類/函式名及其入參,然後跳過(pass)主體**,以後再慢慢填充。

pass 寫起來簡單,而且由於是關鍵字,ide 會給出顯眼的顏色區分,所以就比我們寫上注釋內容來得方便些。

pass 作為空間佔位符,主要可以方便我們構思區域性的**結構,有一定的輔助提醒作用。

但是,若作為一種注釋方式,它就顯得太單薄了,比不上寫「# todo: ***x」,後者也會被 ide 用顏色突顯,而且意思更明確。雖然寫起來簡單,但它也引入了乙個看似多餘的關鍵字 pass。

所以,從空間佔位符的角度來看,pass 不是程式語言中必須的設計要素。

有了它,我們可以表達出「此處有東西,但暫時跳過」的語義,但如果沒有它,則可以用注釋內容來替代。

2、對機器:為了語法完整性

對於前一條的用法,pass 出現在**中的位置在理論上是不受限的。

但是,我們最常使用 pass 時,基本是在冒號的下一行,而且在該層縮排的**塊中,只有這一條語句。(參見前文的 3 個例子,為了方便,我們僅以以空函式為例)

我們可以設想下,如果不寫它,會怎樣?

答案是會報縮排錯誤:indentationerror: expected an indented block

'''

'''# 將函式體的 pass 去除,會報錯

deffunc()

:func(

)

因為 python 使用縮進來劃分**塊(至於原因,請查閱《python為什麼使用縮進來劃分**塊?》),而冒號標識著要出現新的縮排**塊,所以這個例子會報缺少縮排**塊。

如果我們用前文說的注釋來替代,看看會怎樣?

# 將函式體的 pass 換成注釋

deffunc()

:# todo:此處有東西,以後補上

func(

)

這樣寫,也會報錯:indentationerror: expected an indented block

原因是注釋並非有效的語法內容,它會被 python 直譯器忽略掉(ignore),不像 pass 語句那樣是「有效的語法內容,但是跳過」。

也就是說,縮排**塊中必須包含有語法意義的內容,下面的例子都是有效的:

'''

'''def

func()

:"""這是乙個字串"""

deffunc2()

:123456

python 在定義函式時,必須包含函式體,即同時包含宣告加定義兩種語義,不能像某些語言可以只使用宣告的語義,即寫成void test(); 。

但是,由於 python 不使用花括號,它無法像某些語言那樣直接定義出空函式,即寫成void test(){} 。

綜合以上的分析,python 在定義空函式時,必須要有合法的函式體,因此設計出表示空操作的 pass 語句。它是為了補充語法的完整性,連同冒號,等效於其它語言中一對空的花括號。

從語法完整性的維度上看,它是必須的設計要素,如果沒有的話,也必須用類似的空語句或特殊符號來替代。

對人方面,pass 可以表示「暫時跳過」的含義,作為臨時的佔位符,最終會被實際的**實現所替換;對機器方面,它則可以表示「直接跳過」,只為了補齊語法邏輯,並不會被其它**所替換。

其它語言沒有專門的一種語句或者符號來表示這種佔位符(即語義有所欠缺),但是它們也不需要費心思專門設計乙個關鍵字來補齊語法完整性(即語法完備)。

python 使用 pass 語句,是為了支援純粹空操作的**塊(空函式、空類、空的迴圈控制塊等等),有了它,還能額外表達出一種佔位符的語義。

前者是對於機器而言的,必須要有,等效於其它語言中空花括號的作用;後者是對於人而言的,非必須的,可以用注釋來表達,但因為 python 設計了這個語句,這種用法有時候還挺方便的。

為什麼要有cgroup

linux系統中經常有個需求就是希望能限制某個或者某些程序的分配資源。也就是能完成一組容器的概念,在這個容器中,有分配好的特定比例的cpu時間,io時間,可用記憶體大小等。於是就出現了cgroup的概念,cgroup就是controller group,最初由google的工程師提出,後來被整合進l...

為什麼要有多型?

include include using namespace std 岳不群 class yuebuqun virtual void fight virtual表7示修飾的乙個成員方法時乙個虛函式,和虛繼承含義不同 string kongfu 林平之類 class linpingzhi publi...

為什麼要有 hashCode

當你把物件加入 hashset 時,hashset 會先計算物件的 hashcode 值來判斷物件加入的位 置,同時也會與其他已經加入的物件的 hashcode 值作比較,如果沒有相符的hashcode,hashset會假設物件沒有重複出現。但是如果發現有相同 hashcode 值的物件,這時會呼叫...