Python if else條件語句詳解

kboypkb發表於2021-09-11

Python if else條件語句詳解

if 分支使用布林表示式或布林值作為分支條件來進行分支控制。Python 的 if 分支既可作為語句使用,也可作為表示式使用。下面先介紹 if 分支作為語句使用的情形。

if 語句可使用任意表示式作為分支條件來進行分支控制。Python 的 if 語句有如下三種形式:

第一種形式:

if expression:
    statements...

第二種形式:

if expression
    statements...
else:
    statements...

第三種形式:

if expression:
    statements...
elif expression:
    statements...
...//可以有零條或多條elif語句
else:
    statement...

在上面 if 語句的三種形式中,第二種形式和第三種形式是相通的,如果第三種形式中的 elif 塊不出現,則變成了第二種形式。

對於上面的 if 分支語句,執行過程是非常簡單的,即如果 if 條件為“真”,程式就會執行 if 條件後面的多條語句;否則就會依次判斷 elif 條件,如果 elif 條件為“真”,程式就會執行 elif 條件後面的多條語句……如果前面所有條件都為“假”,程式就會執行 else 後的程式碼塊(如果有)。

在上面的條件語句中,if expression:、elif expression:及 else:後縮排的多行程式碼被稱為程式碼塊,一個程式碼塊通常被當成一個整體來執行(除非在執行過程中遇到return、break、continue等關鍵字),因此這個程式碼塊也被稱為條件執行體。

Python是一門很“獨特”的語言,它的程式碼塊是透過縮排來標記的(大部分語言都使用花括號或 end 作為程式碼塊的標記),具有相同縮排的多行程式碼屬於同一個程式碼塊。如果程式碼莫名其妙地亂縮排,Python 直譯器會報錯(前文說過,Python 不是格式自由的語言)。

例如如下程式:

s_age = input("請輸入您的年齡:")
age = int(s_age)
if age > 20 :
    # 只有當age > 20時,下面用整體縮排的程式碼塊才會執行
    # 整體縮排的語句是一個整體,要麼一起執行,要麼一起不執行
    print("年齡已經大於20歲了")
    print("20歲以上的人應該學會承擔責任...")

執行上面程式碼,如果輸入年齡小於 20,將會看到如下執行結果:

請輸入您的年齡:18

從上面程式碼可以看出,如果輸入的年齡小於 20,則程式沒有任何輸出,整體縮排的語句作為整體都不會執行。

執行上面程式碼,如果輸入年齡大於 20,將會看到如下執行結果:

請輸入您的年齡:24
年齡已經大於20歲了
20歲以上的人應該學會承擔責任...

從上面程式碼可以看出,如果輸入的年齡大於 20 ,則程式會執行整體縮排的程式碼塊。

程式碼塊一定要縮排,否則就不是程式碼塊。例如如下程式:

s_age = input("請輸入您的年齡:")
age = int(s_age)
if age > 20 :
print("年齡已經大於20歲了")

上面程式的 if 條件與下面的 print 語句位於同一條豎線上,這樣在 if 條件下就沒有受控制的程式碼塊了。因此,上面程式執行時會報出如下錯誤:

IndentationError: expected an indented block

if 條件後的條件執行體一定要縮排。只有縮排後的程式碼才能算條件執行體。

接下來讀者會產生一個疑問:程式碼塊(條件執行體)到底要縮排多少呢?這個隨意。你可以縮排 1 個空格、2 個空格、3 個空格…… 或 1 個 Tab 位,這都是符合語法要求的。但從程式設計習慣來看,Python 通常建議縮排 4 個空格。

有些時候,Python 直譯器不會報錯,但並不代表程式沒有錯誤。例如如下程式碼:

s_age = input("請輸入您的年齡:")
age = int(s_age)
if age > 20 :
    print("年齡已經大於20歲了")
print("20歲以上的人應該學會承擔責任...")

解釋執行上面程式,程式不會報任何錯誤。但如果輸入一個小於 20 的年齡,則可看到如下執行過程:

請輸入您的年齡:12
20歲以上的人應該學會承擔責任...
從執行過程可以看出,我們輸入的年齡明明小於20,但執行結果還是會列印“20歲以上…”。這是為什麼呢?就是因為這條 print 語句沒有縮排。如果這行程式碼不縮排,那麼 Python 就不會把這行程式碼當成條件執行體,它就不受 if  條件的控制,因此無論使用者輸入什麼年齡,print 語句總會執行。

如果忘記正確地縮排,很可能導致程式的執行結果超出我們的預期。例如如下程式:

#定義變數b,併為其賦值
b = 5
if b > 4 :
    #如果b>4,則執行下面的條件執行體,只有一行程式碼作為程式碼塊
    print("b大於4")
else:
    #否則,執行下面的條件執行體,只有一行程式碼作為程式碼塊
    b -= 1
#對於下面程式碼而言,它己經不再是條件執行體的一部分,因此總會執行
print("b不大於4")

上面程式碼中,最後一行程式碼總會執行,因為這行程式碼沒有縮排,因此它就不屬於 else 後的條件執行體,else 後的條件執行體只有 b -= 1 這一行程式碼。

如果要讓 print("b不大於4") 語句也處於 else 控制之下,則需要讓這行程式碼也縮排 4 個空格。

if、else、elif 後的條件執行體必須使用相同縮排的程式碼塊,將這個程式碼塊整體作為條件執行體。當if後有多條語句作為條件執行體時,如果忘記了縮排某一行程式碼,則會引起語法錯誤。看下面程式碼:

# 定義變數c,併為其賦值
c = 5
if c > 4:
    # 如果c>4,則執行下面的執行體,將只有c--一行程式碼為執行體
    c -= 1
# 下面是一行普通程式碼,不屬於執行體
print("c大於4")
# 此處的else將沒有if語句,因此編譯出錯
else
    # 否則,執行下面的執行體,只有一行程式碼作為程式碼塊
    print("c不大於4")

在上面程式碼中,因為 if 後的條件執行體的最後一條語句沒有縮排,所以系統只把 c-= 1 一行程式碼作為條件執行體,當 c-=1 語句執行結束後,if 語句也就執行結束了。後面的 print("c大於4") 己經是一行普通程式碼,不再屬於條件執行體,從而導致 else 語句沒有if語句,引發編譯錯誤。

執行上面程式碼,將看到如下錯誤:

SyntaxError : invalid syntax

不要隨意縮排

需要說明的是,雖然 Python 語法允許程式碼塊隨意縮排 N 個空格,但同一個程式碼塊內的程式碼必須保持相同的縮排,不能一會縮排 2 個空格,一會縮排 4 個空格。

例如如下程式碼:

s_age = input("請輸入您的年齡:")
age = int(s_age)
if age > 20 :
    print("年齡已經大於20歲了")
     print("20歲以上的人應該學會承擔責任...")

上面程式中第 2 個 print 語句縮排了 5 個空格,在這樣的情況下,Python 直譯器認為這條語句與前一條語句(縮排了 4 個空格)不是同一個程式碼塊(這就是遊標卡尺笑話的由來),因此 Python 直譯器會報錯。執行上面程式碼,將會報出如下錯誤:

IndentationError : unexpected indent

把程式碼改為如下形式:

s_age = input("請輸入您的年齡:")
age = int(s_age)
if age > 20 :
    print("年齡已經大於20歲了")
   print("20歲以上的人應該學會承擔責任...")

上面程式中第二條 print 語句只縮排了 3 個空格,它與前一條 print 語句(縮排了 4 個空格)同樣不屬於同一個程式碼塊,因此 Python 直譯器還是會報錯。執行上面程式碼,則會報出如下錯誤:

IndentationError: unindent does not match any outer indentation level

透過上面介紹可以看出,Python 程式碼塊中的所有語句必須保持相同的縮排,既不能多,也不能少。

不要遺忘冒號

從 Python 語法直譯器的角度來看,Python 冒號精確表示程式碼塊的開始點這個功能不僅在條件執行體中如此,後面的迴圈體、方法體、類體全部遵守該規則。

如果程式遺忘了冒號,那麼 Python 直譯器就無法識別程式碼塊的開始點。例如如下程式:

age = 24
if age > 20
    print("年齡已經大於20歲了")
    print("20歲以上的人應該學會承擔責任...")

上面 if 條件後忘了寫冒號,因此 Python 就不知道條件執行體的開始點。執行上面程式,將會報出如下錯誤:

SyntaxError : invalid syntax
if 條件的型別

從前面的示例可以看到,Python 執行 if 語句時,會判斷 if 條件是 True 還是 False 。那麼 if 條件是不是隻能使用 bool 型別的表示式呢?

不是。if 條件可以是任意型別,當下面的值作為 bool 表示式時,會被直譯器當作 False 處理:

False、None、0、""、()、[]、{}

從上面介紹可以看出,除了 False 本身,各種代表“空”的 None、空字串、空元組、空列表、空字典都會被當成 False 處理。

例如如下程式碼:

s = ""
if s :
    print('s不是空字串')
else:
    print('s是空字串')
# 定義空列表
my_list = []
if my_list:
    print('my_list不是空列表')
else:
    print('my_list是空列表')
# 定義空字典
my_dict = {}
if my_dict:
    print('my_dict不是空字典')
else:
    print('my_dict是空字典')

從上面的粗體字程式碼可以看出,這些 if 條件分別使用了 str 型別、list 型別、dict 型別,由於這些 str、list、dict 都是空值,因此 Python 會把它們當成 False 處理。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1916/viewspace-2837336/,如需轉載,請註明出處,否則將追究法律責任。

相關文章