程式分支

Write a program that prints the numbers from 1 to 100. But for multiples of three print "Fizz" instead of the number and for the multiples of five print "Buzz". For numbers which are multiples of both three and five print "FizzBuzz".

Fizz-Buzz Test

純量類型中我們提到有關布林在判斷條件或者資料篩選的應用,其中判斷條件應用是可以幫助我們在程式中撰寫不同的劇本,讓 Python 根據條件決定執行不同的程式分支(branch)。

利用 if 搭建一個程式分支

我們使用保留字 if 搭配一個布林(之後要接一個冒號 :)就能夠創建出一個程式分支,如果 if 後面的布林為 True 則執行其縮排下的程式區塊;若 if 後面的布林為 False 則跳過該區塊往後續的程式碼執行,由於 Python 不使用大括號 {} 來標註程式區塊的範圍,請記得在同一個區塊中使用相同的縮排,它的外觀架構長得像這樣子。

if 布林:
  # 程式
1
2

傳統美國職業籃球聯盟(National Basketball Association,NBA)球探對於中鋒的身高要求是七呎(一呎約為 30.48 公分),讓我們利用 if 敘述判斷身高 216 公分、NBA 史上最偉大的中鋒之一「柴油引擎」俠客歐尼爾(Shaquille O’Neal)是否符合球探對中鋒身高的要求。

player_name = input("請輸入球員姓名:")
player_height = input("請輸入球員身高(cm):")
player_height_foot = float(player_height) / 30.48

# 利用 if 搭建一個程式分支
if player_height_foot >= 7:
  print("{} 身高有七呎".format(player_name))
1
2
3
4
5
6
7
## 請輸入球員姓名:Shaquille O'Neal
## 請輸入球員身高(cm):216
## Shaquille O'Neal 身高有七呎
1
2
3

另外利用 if 敘述判斷身高 213 公分、同樣為 NBA 史上最偉大的中鋒之一「The Dream」歐拉朱萬(Hakeem Olajuwon)是否符合球探對中鋒身高的要求。

## 請輸入球員姓名:Hakeem Olajuwon
## 請輸入球員身高(cm):213
1
2

由於只搭建了一個程式分支,只有在球員身高大於等於七呎的情況下才會印出 XX 身高有七呎

利用 if 與 else 搭建兩個程式分支

我們使用保留字 ifelse 搭配一個布林(之後要接一個冒號 :)就能夠創建出兩個程式分支,如果 if 後面的布林為 True 則執行其縮排下的程式區塊;若 if 後面的布林為 False 則跳過該區塊改為執行 else 縮排下的程式區塊,它的外觀架構長得像這樣子。

if 布林:
  # 程式
else:
  # 程式
1
2
3
4

這次搭建了兩個程式分支,除了在球員身高大於等於七呎的情況下會印出 XX 身高有七呎

player_name = input("請輸入球員姓名:")
player_height = input("請輸入球員身高(cm):")
player_height_foot = float(player_height) / 30.48

# 利用 if 與 else 搭建兩個程式分支
if player_height_foot >= 7:
  print("{} 身高有七呎".format(player_name))
else:
  print("{} 身高未滿七呎".format(player_name))
1
2
3
4
5
6
7
8
9
## 請輸入球員姓名:Shaquille O'Neal
## 請輸入球員身高(cm):216
## Shaquille O'Neal 身高有七呎
1
2
3

在球員身高小於七呎的情況下亦會印出 XX 身高不滿七呎

## 請輸入球員姓名:Hakeem Olajuwon
## 請輸入球員身高(cm):213
## Hakeem Olajuwon 身高未滿七呎
1
2
3

利用 if、elif 與 else 搭建三個以上的程式分支

我們使用保留字 ifelifelse 搭配布林就能夠創建出三個以上的程式分支,如果 if 後面的布林為 True 則執行其縮排下的程式區塊;若 if 後面的布林為 False 則跳過該區塊改為檢視 elif 後面的布林,如果是 True 就執行其縮排下的程式區塊;若 elif 後面的布林為 False 則跳過該區塊繼續檢視下一個 elif 後面的布林,若是所有的條件都判斷為 False 就會執行 else 縮排下的程式區塊,它的外觀架構長得像這樣子。

if 布林:
  # 程式
elif 布林:
  # 程式
elif 布林:
  # 程式
# ...
# elif 布林:
#   # 程式
# ...
else:
  # 程式
1
2
3
4
5
6
7
8
9
10
11
12

我們搭建四個程式分支,依據 Body mass index 中的 BMI Chart 將 BMI 對應到四個不同區間:Underweight、Normal weight、Overweight 與 Obese,透過這個程式分支,我們不僅可以回答使用者所輸入的身高與體重對應的 BMI 量值,還有分類的標籤。

BMI Chart

player_name = input("請輸入球員姓名:")
player_height = input("請輸入球員身高(cm):")
player_weight = input("請輸入球員體重(kg):")
player_height = float(player_height)
player_weight = float(player_weight)
player_bmi = player_weight / (player_height*0.01)**2

# 利用 if、elif 與 else 搭建三個以上的程式分支
if player_bmi < 18.5:
  bmi_label = "Underweight"
elif player_bmi > 30:
  bmi_label = "Obese"
elif 25> player_bmi >= 18.5:
  bmi_label = "Normal Weight"
else:
  bmi_label = "Overweight"

print("{} 的 BMI 為 {:.2f},區間標籤為 {}".format(player_name, player_bmi, bmi_label))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

例如我們輸入 Shawn Kemp 在魔術隊時期的身高與體重,會顯示 Obese 的標籤。

## 請輸入球員姓名:Shawn Kemp
## 請輸入球員身高(cm):208
## 請輸入球員體重(kg):143
## Shawn Kemp 的 BMI 為 33.05,區間標籤為 Obese
1
2
3
4

輸入 LeBron James 的身高與體重,會顯示 Overweight 的標籤(由此可知這是很不靠譜的指標。)

## 請輸入球員姓名:LeBron James
## 請輸入球員身高(cm):203
## 請輸入球員體重(kg):113
## LeBron James 的 BMI 為 27.42,區間標籤為 Overweight
1
2
3
4

輸入 Steve Nash 的身高與體重,會顯示 Normal Weight 的標籤。

## 請輸入球員姓名:Steve Nash
## 請輸入球員身高(cm):191
## 請輸入球員體重(kg):82
## Steve Nash 的 BMI 為 22.48,區間標籤為 Normal Weight
1
2
3
4

輸入 Manute Bol 的身高與體重,會顯示 Underweight 的標籤。

## 請輸入球員姓名:Manute Bol
## 請輸入球員身高(cm):231
## 請輸入球員體重(kg):91
## Manute Bol 的 BMI 為 17.05,區間標籤為 Underweight
1
2
3
4

程式分支應用,以 Fizz Buzz 為例

創建四個程式分支,當使用者透過 input() 函數傳入的數字為 3 的倍數時候,印出 "Fizz" 替代數字,5 的倍數用 "Buzz" 代替,既是 3 的倍數又是 5 的倍數印出 "FizzBuzz" ,否則就直接印出該數字即可。特別值得注意的地方在於既是 3 又是 5 的倍數(即 15 的倍數)在邏輯判斷的順序上必須先讓 15 被判斷,否則都會先被 3 或 5 的判斷捷足先登,導致永遠印不出 "FizzBuzz"

user_input = input("請輸入一個整數:")
user_input = int(user_input)
if user_input % 15 == 0:
  print("FizzBuzz")
elif user_input % 3 == 0:
  print("Fizz")
elif user_input % 5 == 0:
  print("Buzz")
else:
  print(user_input)
1
2
3
4
5
6
7
8
9
10

例如我們輸入 9 (3 的倍數)會印出 "Fizz"

## 請輸入一個整數:9
## Fizz
1
2

輸入 10(5 的倍數)會印出 "Buzz"

## 請輸入一個整數:10
## Buzz
1
2

輸入 30(既是 3 又是 5 的倍數)會印出 "FizzBuzz"

## 請輸入一個整數:30
## FizzBuzz
1
2

輸入 31(不是 3、5 的倍數)會印出 31。

## 請輸入一個整數:31
## 31
1
2

小結

在這個小節中我們簡介 Python 為因應不同程式劇本需求所發展的流程控制技法:程式分支,如何利用 if 搭建一個程式分支、如何利用 ifelse 搭建兩個程式分支、如何利用 ifelifelse 搭建三個以上的程式分支和程式分支應用,以 Fizz Buzz 為例。

延伸閱讀