本章知識點
01
input 函數
在 Python 中,你可以使用 input 函數,讓用戶輸入一個數值,並賦值給一個變量。舉例如下:
1
x = input('請輸入 x 的數值:')
2
print('x = ' + x)
請輸入 x 的數值:
↓
請輸入 x 的數值:5
x = 5
(有下劃線的 5 是由用戶輸入)
在上述案例中,程序運行第一行代碼後,會在輸出窗口列印 "請輸入 x 的數值:",暫停並等待用戶輸入。用戶輸入後(假設用戶輸入 5),程序將該數值賦值給了 x,並繼續運行第二行代碼,在輸出窗口顯示 "x = 5"。
input 函數中的字符串,就是在程序暫停等待用戶輸入時出現的提示文本。
需要注意的是,input 函數總是以字符串(string)的形式賦值給指定的變量。示範如下:
1
x = input('請輸入 x 的數值:')
2
y = x * 2
3
print('x * 2 = ' + y)
請輸入 x 的數值:
↓
請輸入 x 的數值:5
x * 2 = 55
x 是字符串(x = '5'),在乘以 2 之後變為 '55'。
如果要使用輸入值進行數學計算,則需要將其轉換為整數(integer)或浮點數(float)。示範如下:
1
x = input('請輸入 x 的數值:')
2
y = float(x) * 2
3
print('x * 2 = ' + str(y))
請輸入 x 的數值:
↓
請輸入 x 的數值:5
x * 2 = 10.0
在計算 x * 2 並賦值給 y 前,對 y 使用 float() 將其轉換為浮點數,以便正確計算 x * 2 的數值。
由於 y 是浮點數(y = 10.0),第三行的字符串 'x * 2 = ' 和 y 無法相加,需要對 y 使用 str() 將其轉換為字符串,否則會出現錯誤提示。
02
if/else 判斷語句
有時候,我們希望在執行某些代碼前可以先進行一些邏輯判斷。當滿足某些情況的時候,執行一段代碼;反之,執行另一段代碼。這時就需要用到 if/else 判斷語句。
完整的 if/else 判斷語句格式如下:
1
if 判斷條件1 :
2
執行命令1
3
elif 判斷條件2 :
4
執行命令2
5
elif 判斷條件3 :
6
執行命令3
7
else:
8
執行命令4
if 是一段判斷語句的開頭,是必要的語句。在一段判斷語句中,if 僅出現一次。在沒有 if 的情況下,不可以使用 elif 和 else。有多個分支時,從第二個起用 elif,可出現多次。
從上到下,當 if 或某一個 elif 的判斷條件成立時,執行其命令,並跳過餘下的判斷語句及其分支。
當 if 和所有 elif 的判斷條件都不成立時,執行 else 下的命令。
在一段判斷語句中,else 同樣只能出現一次。
注意,上述代碼中,第二、四、六、八行,沒有進行左對齊。這在程式語言中叫做 "縮進"。縮進的長度通常是按一次 Tab 鍵或四次空格鍵。舉例如下:
1
if x == 0:
2
print('x 等於 0') # 有縮進
3
print(x) # 無縮進
在上面這個案例中,第二行進行了一次縮進,表示它是第一行 if 語句下的分支。只有 x 等於 0(即 x == 0 為 True)時,第二行才會被執行。
而第三行沒有縮進,它不是第一行 if 語句下的分支,無論 x 是否等於 0,第三行都會被執行。
Python 代碼中也可能出現多次縮進。舉例如下:
1
if x > 0:
2
if x < 5: # 一次縮進
3
print('x 大於 0 且小於 5') # 二次縮進
4
else: # 一次縮進
5
print('x 大於 5') # 二次縮進
6
else:
7
print('x 小於等於 0') # 一次縮進
在這個案例中,第一行的 if 語句先判斷 x 是否大於 0。如果成立,則在第二行進一步判斷x是否小於 5。
在有縮進的情況下,我們可以看出,第四行的 else 是對應第二行的 if,不是第一行的 if;而第六行的 else,才是對應第一行的 if。
在 Python 中,縮進不僅是必要的編程格式,同時也極大地提高了代碼的可讀性。
現在讓我們編寫一個程序:
運行時,要求用戶輸入一個數字
若該數字大於 0,列印 '輸入的數字是正數'
若該數字小於 0,列印 '輸入的數字是負數'
否則,列印 '輸入的數字是 0'
示範如下:
1
x = input('請輸入任意數字:')
2
x = float(x) #判定前,將 x 轉為浮點數
3
if x > 0:
4
print('輸入的數字是正數')
5
elif x < 0:
6
print('輸入的數字是負數')
7
else:
8
print('輸入的數字是 0')
請輸入任意數字:
↓
請輸入任意數字:5
輸入的數字是正數
請輸入任意數字:
↓
請輸入任意數字:-5
輸入的數字是負數
請輸入任意數字:
↓
請輸入任意數字:0
輸入的數字是 0
在第二行將 x 轉換為數字時,要使用 float(),而不是 int(),否則可能出現以下情況:
1
x = input('請輸入任意數字:')
2
x = int(x)
3
if x > 0:
4
print('輸入的數字是正數')
5
elif x < 0:
6
print('輸入的數字是負數')
7
else:
8
print('輸入的數字是 0')
請輸入任意數字:
↓
請輸入任意數字:0.5
輸入的數字是 0
將數字轉換為整數時,會直接刪除小數,只保留整數部分。因此,0.5 會變成 0,進而執行第八行命令。
現在我們來看下一個案例。
1
x = 10
2
if x > 0:
4
print('x 大於 0')
5
elif x > 5:
6
print('x 大於 5')
x 大於 0
雖然 x > 0 和 x > 5 都成立,但由於 x > 0 先被判定成立,會進入其分支,並跳過剩餘的判斷語句,不會對 x >5 進行判斷,因此 'x 大於 5' 不會被列印。
利用這個特性,有時候我們可以將代碼寫得稍微簡潔一些。請看下面這個案例。
假設我們有一個整數變量 x(數值範圍是 0 到 100),代表某一名學生的成績。科目評級規則如下:
85到100分:優
70到84分:良
60到69分:及格
0到59分:不及格
我們需要寫一段代碼,根據 x 的數值,輸出該學生的科目評級。
示範如下:
1
x = 90
2
if 85 <= x:
3
print('優')
4
elif 70 <= x:
5
print('良')
6
elif 60 <= x:
7
print('及格')
8
else:
9
print('不及格')
優
我們本應將第三行的判斷條件寫為 70 <= x < 85,才符合科目評級規則的描述。為什麼不需要呢?原因是,當程序開始對第三行的判斷條件進行檢查時,就意味著第一行的判斷結果是 False,也就排除了 85 <= x 的情況。
讓我們稍微修改一下上面的代碼。
1
x = 90
2
if 85 <= x:
3
print('優')
4
if 70 <= x:
5
print('良')
6
if 60 <= x:
7
print('及格')
8
else:
9
print('不及格')
優
良
及格
有時候編程者會不小心把 elif 寫成 if。當我們把第五行和第七行的 elif 改為 if 後,輸出窗口中便會多出 "良" 和 "及格" 的結果。而在我們的預期裡,我們應該只會看到一個評級被列印出來。
我們在前文提到過,if 是一段判斷語句的開頭。那麼在這串代碼中,第五行和第七行的 if 分別開啟了新的一段判斷語句,不受先前的判斷語句影響,會獨立執行。
插曲
秀一波操作
還是上面這個案例:
假設我們有一個整數變量 x(數值範圍是 0 到 100),代表某一名學生的成績。科目評級規則如下:
85到100分:優
70到84分:良
60到69分:及格
0到59分:不及格
剛剛我們用了 9 行代碼完成這個操作。不過,我們可以將其簡化為 4 行,而且不超綱,用的都是目前講過的知識點。
思路如下:
創建一個列表,rank_list = ['不及格', '及格', '良', '優']
我們可以用索引值從該列表中讀取評級(索引值 0 對應 '不及格',1 對應 '及格',以此類推)
接下來就是想辦法,讓 x 的值實現如下轉換
0 - 59 => 0
60 - 69 => 1
70 - 84 => 2
85 - 100 => 3
這樣一來,我們就可以將轉換後的數字當做索引值使用
示範如下:
1
x = 90
2
rank_index = int(x > 59) + int(x > 69) + int(x > 84)
3
rank_list = ['不及格', '及格', '良', '優']
4
print(rank_list[rank_index])
優
重點是第二行的 int(x > 59) + int(x > 69) + int(x > 84)
先不看 int(),根據 x 值的不同,各個部分的判定結果如下:
x 值
x > 59
x > 69
x > 84
0 - 59
False
False
False
60 - 69
True
False
False
70 - 84
True
True
False
85 - 100
True
True
True
我們在第一章說過,將布爾值轉為整數時,True 變為 1,False 變為 0。
那麼,套上 int() 以後,各個部分的數值如下:
x 值
int(x > 59)
int(x > 69)
int(x > 84)
0 - 59
0
0
0
60 - 69
1
0
0
70 - 84
1
1
0
85 - 100
1
1
1
把它們全加起來:
x 值
int(x > 59) + int(x > 69) + int(x > 84)
0 - 59
0
60 - 69
1
70 - 84
2
85 - 100
3
這樣一來,我們便實現了數值轉換,把 x 變成了索引值。
那最後一步就是直接對列表使用索引值,就能列印出對應的評級。
如果你非要繼續簡化,只用兩行代碼也是可以。
1
x = 90
2
print(['不及格', '及格', '良', '優'][int(x>59) + int(x>69) + int(x>84)])
優
不過這樣代碼的易讀性就有所下降。
想像一下,假如你有 100 個分支,你就需要寫 1 個 if 和 99 個 elif。在這個情況下,進行上面這樣的數據轉換,會比直接寫 if/else 判定語句更有效率。
看,是不是沒有任何超綱的東西?
將布爾值轉為整數,使用索引值讀取列表,這些都在第一章就講過。只是計算上複雜一些,但運用的命令都是最基礎的。
03
賦值時的判斷語句
直接看下面這個案例:
1
if x > 5:
2
y = 1
3
else:
4
y = 0
上面這串代碼的邏輯很好理解,就是根據 x 的值(假設 x 已被賦值),對 y 進行賦值。若 x 大於 5,則將 y 設為 1;否則,將 y 設為 0。
我們可以將這四行代碼簡化為一行:
只需一行代碼即可在不同情況下對 y 賦值。
04
謹慎使用 else
else 語句很方便,它就是排除掉所有 if 和 elif 後的情況。
不過,我個人的編程習慣是,儘量不寫 else。
舉例來說,假設我們要編寫一個程序如下:
現有一個變量 x
若 x 大於 0,列印 'x 大於 0'
若 x 小於等於 0,列印 'x 小於等於 0'
我們可以這樣寫:
1
if x > 0:
2
print('x 大於 0')
3
else:
4
print('x 小於等於 0')
我們知道,這裡的 else,就是 x 小於等於 0 的情況。
仔細想想,真的是這樣嗎?
題目裡並沒有說明,x 是一個整數或浮點數。那就有可能出現下面這種情況。
1
x = 'ABCD'
2
if x > 0:
3
print('x 大於0')
4
else:
5
print('x 小於等於0')
x 小於等於0
如果 x 是字符串,那麼 x > 0 的判定結果也是 False,會進入 else 下的分支,列印 'x 小於等於 0'。
當我們編寫的程序較為複雜時,有時候會不小心使用重複的變量名。可能在你腦海中,你認為 x 應該是個整數,但在程序中某個角落,你不小心將 x 變成了字符串。接下來,你就得花半天時間去研究,為什麼寫的 if/else 判斷語句永遠只進入 else。更糟的可能是,你的程序一直進入 else,而你卻還以為它運作正常。
實戰中,我個人會習慣這樣寫:
1
x = 'ABCD'
2
if x > 0:
3
text = 'x 大於0'
4
elif x <= 0:
5
text = 'x 小於等於0'
6
print(text)
NameError: name 'text' is not defined
若 x 不是整數或浮點數,那麼 x 就既不大於 0,也不小於等於 0,text 也就不會被賦值。在列印的時候,會出現異常提示。
總結
本章知識點
下一章,我們會講解 for 循環語句。