if 分支判斷

April 14, 2022

流程語法中最簡單也最常見的是 if 分支判斷,在 Python 中是這樣寫的:

import sys

name = 'Guest'
if len(sys.argv) > 1:
    name = sys.argv[1]

print(f'Hello, {name}')

if/else 區塊

程式區塊是使用冒號 : 開頭,同一區塊範圍要有相同的縮排,不可混用不同空白數量,不可混用空白與 Tab,Python 建議使用四個空白作為縮排。

這個範例中,預設的名稱是 'Guest',如果執行時提供命令列引數,sys.argv 的長度就會大於 1(記得索引 0 會是.py 檔案名稱),len(sys.argv) > 1 的結果是 Trueif 條件成立,因而將name設定為使用者提供的命令列引數。一個執行範例如下:

>python hello.py
Hello, Guest

>python hello.py Justin
Hello, Justin

if 可以搭配 else,在if條件不成立時,執行 else 定義的程式碼,例如寫個判斷數字為奇數或偶數的範例:

import sys

number = int(sys.argv[1])
if number % 2:
    print('f{number} 為奇數')
else:
    print(f'{number} 為偶數')

若是偶數,那麼 number % 2 會是0,在 if 判斷式中就會被認定為 False,因此會執行 else 區塊內容。一個執行範例如下:

>python is_odd.py 10
10 為偶數

>python is_odd.py 9
9 為奇數

Python的 區塊定義方式,可以避免 C/C++、Java 這類 C-like 語言中,某些不明確的狀況。例如在 C-like 語言中,可能會出現這樣的程式碼:

if(condition1)
    if(condition2)
         doSometing();
else
    doOther();

乍看之下,else 似乎是與第一個if配對,但實際上,else 是與最近的 if 配對,也就是第二個 if。在 Python 中的區塊定義,就沒有這個問題:

if condition1:
    if condition2:
         do_something()
else:
    do_other()

以上例而言,else 必定是與第一個 if 配對,如果是下例,else 必定是與第二個 if 配對:

if condition1:
    if condition2:
         do_something()
    else:
         do_other()

if/elif/else 區塊

只不過,if/else 在某些情況下若構成巢狀會不易閱讀,例如:

score = int(input('輸入分數:'))
if score >= 90:
    print('得 A')
else:
    if 90 > score >= 80:
        print('得 B')
    else:
        if 80 > score >= 70:
            print('得 C')
        else:
            if 70 > score >= 60:
                print('得 D')
            else:
                print('不及格')

這類多重判斷,在 C-like 語言中,可以透過適當的排版,讓程式碼在視覺上形成瀑布式流程,不過 Python 中不能這麼做,因此提供了 if/elif/else 結構來解決這類多重判斷。例如:

score = int(input('輸入分數:'))
if score >= 90:
    print('得 A')
elif 90 > score >= 80:
    print('得 B')
elif 80 > score >= 70:
    print('得 C')
elif 70 > score >= 60:
    print('得 D')
else:
    print('不及格')

談談 pass

有時在某個區塊中,並不想做任何的事情,或者是稍後才會寫些什麼,對於還沒打算寫任何東西的區塊,可以放個 pass。例如:

if is_prime:
    print('找到質數')
else:
    pass

pass 就真的是 pass,什麼都不做,只是用來維持程式碼語法結構的完整性,雖然如此,未來也許會常常用到它,因為經常地,你會想要作做些小測試,或者是先執行一下程式,看看其他已撰寫好的程式碼是否如期運作,這時 pass就會派上用場。

pass 可以放在各式區塊,像是後續會談的 whilefor、函式、類別定義區塊等。

if/else 運算式

Python 有個 if/else 運算式語法。直接來看看如何改寫先前奇偶數判斷程式碼:

import sys

number = int(sys.argv[1])
print('{}{}'.format(number, '奇數' if number % 2 else '偶數'))

if 的條件式成立時,會傳回 if 前的數值,若不成立則傳回 else 後的數值。

分享到 LinkedIn 分享到 Facebook 分享到 Twitter