Python
到目前為止,我們的程式都是一行一行全部讀下來執行的,這種程式結構我們稱它為順序結構。 然而只有順序結構並不夠,有些狀況是順序結構無法完成的,舉個例子,我們寫了一個遊戲,遊戲中玩家會來到兩扇門前,如果玩家選擇了左邊的門,便會傳送到A點,如果選擇了右邊的門,便會傳送到B點。 這種狀況就無法用順序結構完成,因為進了A點,玩家就不會進到B點,反之亦然。 當然,設計上面也不能讓他兩個都選,此時就需要分支結構了。
在 Python 中要建構分支結構,可以使用 if
、elif
和 else
關鍵字,下面我們來給個例子:
print("你來到了門前,有兩扇門,如果你想進入左邊的門,請輸入1,如果想進入右邊的門,請輸入2")
n = int(input("> "))
s = "初始位置"
if(n == 1):
print("你進入了左邊的門,將把你傳送至A點")
s = "A點"
elif(n == 2):
print("你進入了右邊的門,將把你傳送至B點")
s = "B點"
else:
print("無效的輸入,請輸入 1 或 2")
print("你現在位於" + s)
這邊用了一個新的函式,叫做 input()
,當程式執行到這個函式時,會要求使用者輸入一個值,並回傳輸入的值,後方括號內要填入「要求使用者輸入時,要印出什麼東西」。 回傳值的型態預設是 String ,但這個程式內我希望它輸入的是一個整數 int ,因此我們可以使用強轉函式 int()
來將字串轉為整數,再使用 賦值運算符 =
來將回傳的值丟給「變數n」。
if
、elif
和 else
等關鍵字的後方需要有「冒號」來表示一個代碼塊的開頭,像是上例中, if(n == 1):
下方的 print("你進入了左邊的門,將把你傳送至A點")
與 s = "A點"
就是一個代碼塊。
與C/C++、JAVA等語言不同,Python不使用大括號,而是使用縮進的方式來構造代碼塊,上方這個例子內,在 if(n == 1):
下方的 print("你進入了左邊的門,將把你傳送至A點")
與 s = "A點"
,前方都有四格空白(一個tab),而到了 elif(n == 2):
這行時前方並沒有空格,因此上方這兩行便形成了一個構造代碼塊。
在 if(n == 1):
內, n == 1
是判斷式,它會回傳一個布林值,如果回傳的是true,程式便會執行它下方的代碼塊,如果是false,則跳過下方的代碼塊,檢查下一個條件 (n == 2) , 而 else
的後方並沒有判斷式, else
的作用是 「當前面的條件全部不符合時,便會進到 else 後方的代碼塊」
那假設今天的條件變複雜了,假如你進入了左邊的門,而你的職業是戰士,那你便會被傳送到A點,而如果你的職業是法師,那便會被傳送到B點。 但如果你選了右邊的門,而你的職業是戰士,那你會被傳送到C點,而如果你的職業是法師,便會傳送到D點。 文字敘述看起來很複雜,讓我們畫個表格來看:
選擇的門 | 職業 | 被傳送到的地點 |
---|---|---|
左邊的門 | 戰士 | A點 |
左邊的門 | 法師 | B點 |
右邊的門 | 戰士 | C點 |
右邊的門 | 法師 | D點 |
這樣就清楚多了! 那我們的程式該怎麼寫呢? 我們可以列舉:
import sys
print("你來到了門前,有兩扇門,如果你想進入左邊的門,請輸入1,如果想進入右邊的門,請輸入2")
n = int(input("> "))
if(n != 1 and n != 2):
sys.exit("無效的輸入,請輸入 1 或 2")
print("請問您的職業是戰士還是法師? 如果是戰士,請輸入1,如果是法師,請輸入2")
role = int(input("> "))
if(role != 1 and role != 2):
sys.exit("無效的輸入,請輸入 1 或 2")
s = "初始位置"
if(n == 1 and role == 1):
print("您將被傳送至A點")
s = "A點"
elif(n == 1 and role == 2):
print("您將被傳送至B點")
s = "B點"
elif(n == 2 and role == 1):
print("您將被傳送至C點")
s = "C點"
elif(n == 2 and role == 2):
print("您將被傳送至D點")
s = "D點"
print("你現在位於" + s)
這邊我們又看見了新東西 import sys
, 至今為止我們都只利用了最基本的函式,像是 input()
、print()
之類的,然而,當我們需要用到一些比較特別的函式時,我們需要去尋找它的函式庫名稱,並於一開始寫下 import 函式庫名稱
。
那什麼是函式庫呢? 我們之前提過,input()
和print()
這類的東西叫做函式,括號內通常會填入一些參數,然後這段程式便會利用我們填入的東西去做一些事情,像是print()
便會把我們填入的東西給印出來。 那在一開始我們講說可以把它當成一個語法,那麼函式庫就是一個倉庫,裡面裝了很多別人已經幫妳寫好的語法(函式),當你需要用到這個語法(函式)的時候,我們便要告訴系統,這個函式要從這個倉庫裡去找,因此我們才需要import 函式庫名稱
。
那麼上方這個例子中的 sys.exit()
的作用就是印出括號內填入的字串,並結束程式。 可以看見 sys
的後面有一個點,這個就代表我們接下來要用的函式要去 sys
這個倉庫(函式庫)裡面找,而後方的 exit()
便是我們要使用的語法(函式)。
那關於這部分後面的課還會有更詳細的講解,這邊只是先稍微提個概念而已。
在上方那個例子內我們列舉出了所有的狀況,然而它並不好閱讀,這時我們可以使用「巢狀if」。 if
、elif
和 else
關鍵字後方的代碼塊內也能再寫一次 If Else 判斷式,這種狀況我們就稱它為 巢狀if:
print("你來到了門前,有兩扇門,如果你想進入左邊的門,請輸入1,如果想進入右邊的門,請輸入2")
n = int(input("> "))
place = "初始位置"
role = 0
if(n == 1):
print("請問您的職業是戰士還是法師? 如果是戰士,請輸入1,如果是法師,請輸入2")
role = int(input("> "))
if(role == 1):
print("您將被傳送至A點")
place = "A點"
elif(role == 2):
print("您將被傳送至B點")
place = "B點"
else:
print("無效的輸入,請輸入 1 或 2")
elif(n == 2):
print("請問您的職業是戰士還是法師? 如果是戰士,請輸入1,如果是法師,請輸入2")
role = int(input("> "))
if(role == 1):
print("您將被傳送至C點")
place = "c點"
elif(role == 2):
print("您將被傳送至D點")
place = "D點"
else:
print("無效的輸入,請輸入 1 或 2")
else:
print("無效的輸入,請輸入 1 或 2")
print("經過了傳送,你現在位於" + place)
這樣就好閱讀多了!
要求:如果輸入的成績在90分以上(含90分)輸出A;80分-90分(不含90分)輸出B;70分-80分(不含80分)輸出C;60分-70分(不含70分)輸出D;60分以下輸出E。
參考解答:
score = float ( input ( '請輸入成績: ' ))
if score >= 90 :
grade = 'A'
elif score >= 80 :
grade = 'B'
elif score >= 70 :
grade = 'C'
elif score >= 60 :
grade = 'D'
else :
grade = 'E'
print ('對應的等級是:' , grade )
a = float ( input ( 'a = ' ))
b = float ( input ( 'b = ' ))
c = float ( input ( 'c = ' ))
if a + b > c and a + c > b and b + c > a :
print ( '周長: %f' % ( a + b + c ))
p = ( a + b + c ) / 2
area = ( p * ( p - a ) * ( p - b ) * ( p - c )) ** 0.5
print ( '面積: %f' % ( area ))
else :
print ( '不能構成三角形' )
我國民法在民國100年以前,規定男女結婚最低限度的年齡則分別為 18 歲及 16 歲。 要求:輸入小明的性別和年齡,判斷它可不可以結婚,性別可以像前面一樣用 1 和 2 來表示。
參考解答:
print("請輸入生理性別,如果是男性則輸入 1 ,女性則輸入 2")
sex = int(input("> "))
print("請輸入年齡")
age = int(input("> "))
if( sex == 1 ):
if( age >= 18 ):
print("小明可以結婚")
else:
print("小明不能結婚")
elif( sex==2 ):
if( age >= 16 ):
print("小明可以結婚")
else:
print("小明不能結婚")
else:
print("無效的輸入")
註:此題取自 巢狀 if | C++與演算法
如果你的 If Else 判斷句的結構很簡單,那可能就可以用三元運算子簡寫它:
如果你是學過其他語言的朋友,在學Python的時候可能會對它的全域變數與區域變數感到疑惑,那你可以看看這篇文章: