申明: 本站飛宇網 https://feiyetopro.blogspot.com/。自網路收集整理之書籍、文章、影音僅供預覽交流學習研究,其[書籍、文章、影音]情節內容, 評論屬其個人行為, 與本網站無關。版權歸原作者和出版社所有,請在下載 24 小時內刪除,不得用作商業用途;如果您喜歡其作品,請支持訂閱購買[正版]。謝謝!
第 7 章 判斷再判斷
在前幾章中,我們已經看到了程式的一些基本構成模組。現在可以利用輸入、處理和輸出建立一個程式了。我們甚至還可以通過使用 GUI 讓輸入和輸出更有意思一些。我們可以把輸入賦給一個變數,以便以後使用,還可以使用一些數學運算來進行處理。現在來看可以通過哪些方法對程式的工作進行控制。
如果一個程式每次都做同樣的事情,這會有些枯燥,而且用處不大。程式要能夠決定接下來做什麼。我們已經掌握了一些處理技術,下面再來補充另外一些決策(decision-making)技術。
7.1 測試,測試
程式需要能夠根據輸入做不同的事情。下面給出幾個例子:
·
如果 Tim 給出的答案正確,就為他加 1 分;
·
如果 Jane 擊中外星人,就發出爆炸聲;
·
如果檔沒找到,就顯示錯誤消息。
決策時,程式要做出檢查(完成一個測試),查看某個條件是否為真。在上面的第一個例子中,這個條件就是“答案正確”。
Python 完成測試的方法很有限,而且每個測試只有兩個可能的答案:真(true)或者假(false)。
Python 在測試時可能會問下面這些問題。
·
這兩個東西相等嗎?
·
其中一個是不是小於另一個?
·
其中一個是不是大於另一個?
不過等一下,剛才說過第一個例子的測試條件是“答案正確”,但是這不屬於我們能做的測試,至少不能直接測試。這說明,我們需要用一種 Python 能理解的方式來描述測試。
想要知道 Tim 的答案是否正確時,我們需要知道正確的答案是什麼,還要知道 Tim 的答案。可以寫成這種形式:
如果 Tim 的答案是正確的,這兩個變數就是相等的,所以條件(condition)為真(true)。如果他的答案不正確,這兩個變數就不相等,條件則為假(false)。
術語箱
完成測試並根據結果做出判斷稱為分支(branching)。程式根據測試的結果來決定走哪條路,或者沿哪個分支執行。
Python 使用關鍵字 if 來測試條件,如下:
術語箱
代碼塊(block)是一行或放在一起的多行代碼。它們都與程式的某個部分相關(比如一個 if 語句)。在 Python 中,通過將塊中的代碼行縮進來構成代碼塊。
if 行末尾的冒號告訴 Python 下面將是一個指令塊。這個塊包括從前面的 if 行以下直到下一個不縮進的代碼行之間的所有縮進代碼行。
術語箱
縮進(indenting)是指一個代碼行稍稍靠右一點。它不是從最左端開始,而是前面有一些空格,所以會從距左邊界幾個字元之後開始。
如果條件為真,就會完成之後代碼塊中的所有工作。在前面的小例子中,第 2 行和第 3 行構成了第 1 行中 if 的相應語句塊。
現在來討論縮進和代碼塊。
7.2 縮進
有些語言中,縮進只是一個風格問題,不論你喜歡還是不喜歡,都可以縮進。不過,在 Python 中,編寫代碼時縮進是必不可少的一部分。縮進會告訴 Python 代碼塊從哪裡開始,到哪裡結束。
Python 中的一些語句(如 if 語句)需要一個代碼塊來告訴它們要做什麼。對於 if 語句,代碼塊會告訴 Python 如果條件為真時做什麼。
將代碼塊縮進多遠並不重要,只要保證整個代碼塊縮進的程度是一樣的。Python 中有一個慣例:總是將代碼塊縮進 4 個空格。在你的程式中最好也採用這種風格。
術語箱
慣例(convention)就是大多數人都採用的做法。
7.3 是不是有問題
if 語句中真的有兩個等號嗎(if
timsAnswer == correctAnswer)?沒錯,確實是這樣,下面來告訴你這是為什麼。
人們通常這麼說,“5 加 4 等於 9”,另外會這麼問“5 加 4 等於 9 嗎?”。前一個是陳述句(statement);另一個是疑問句(question)。
在 Python 中,也同樣有陳述句(或語句)以及疑問句(或問題)。語句可能將值賦給一個變數。問題可能查看變數是否等於某個值。前者是在做某種設置(賦值或設置為相等),後者在做某種檢查或測試(是否相等,對還是錯),所以 Python 使用了兩種不同的符號。
我們已經看到,等號(=)用來設置變數或賦值。下面再給出幾個例子:
correctAnswer
= 5 + 3
temperature
= 35
name
= "Bill"
要測試兩個東西是否相等,Python 使用了一個雙等號(==),如下:
if
myAnswer == correctAnswer:
if
temperature == 40:
if
name == "Fred":
切記!
混淆 = 和 == 是程式設計中最常見的錯誤之一。很多語言(而不只是 Python)都使用了這兩個符號,另外每天 都有很多程式師用錯這兩個符號。
當心!
測試或檢查也稱為比較。雙等號稱為一個比較操作符。應該記得,我們在第 3 章討論過操作符。操作符就是會對兩邊的值進行操作的一個特殊符號。在這裡,操作就是測試兩個值是否相等。
7.4 其他類型的測試
很幸運,其他比較操作符更容易記:小於(<)、大於(>)和不等於(!=)。(還可以使用 <> 表示不等於,不過大多數人都用 !=。)還可以把 > 或 < 與 = 結合起來表示大於或等於(>=)以及小於或等於(<=)。數學課上你可能已經見過這樣一些符號。
不等於
在 Python 3 中,不再支持 <> 形式的不等於,只能使用 != 來表示不等於。
還可以把兩個大於和小於操作符“串”在一起完成一個範圍測試,比如:
if 8
< age < 12:
這會檢查變數 age 的值是否介於(但不包含)8 和 12 之間。如果 age 等於 9、10 或 11(或者 8.1 或 11.6 等),這就會是 true。如果希望包含年齡為 8 和 12 的情況,可以這樣做:
if 8
<= age <= 12:
術語箱
比較操作符(comparison operator)也稱為關係操作符(relational operator),因為它們要測試兩邊值的關係(relation):相等還是不相等,大於還是小於。比較也稱為條件測試(conditional test)或邏輯測試(logical test)。在程式設計中,邏輯(logical)就是指某個結論的答案是真還是假。
代碼清單 7-1 顯示了一個使用比較的示例程式。先在 IDLE 編輯器中創建一個新檔,鍵入這個程式並保存,把它命名為 compare.py。然後運行這個程式。試著用不同的數運行多次。可以試試不同的情況,比如第一個數較大、第一個數較小,以及兩個數相等,看看會得到什麼結果。
代碼清單 7-1 使用比較操作符
7.5 如果測試為假會怎麼樣
我們已經看到了,如果測試的結果為真,Python 會做些什麼。不過,如果測試為假,Python 又會做一些什麼呢?在 Python 中,有以下 3 種可能。
· 做另一個測試。如果第一個測試結果為假,可以利用關鍵字 elif(這是 else if 的簡寫)讓 Python 再做另一個測試,例如:
·
if answer >= 10:
·
print "You got at least 10!"
·
elif answer >= 5:
·
print "You got at least 5!"
·
elif answer >= 3:
·
print "You got at least 3!"
·
在 if 後面,elif 語句你想要有多少就可以有多少。
·
如果所有其他測試結果都是假,做其他工作。這要利用 else 關鍵字完成。它總是在最後出現,也就是完成 if 和所有 elif 語句之後。
·
if answer >= 10:
·
print "You got at least 10!"
·
elif answer >= 5:
·
print "You got at least 5!"
·
elif answer >= 3:
·
print "You got at least 3!"
·
else:
·
print "You got less than 3."
·
· 繼續。如果 if 塊後面沒有放任何其他東西,程式會繼續執行下一行代碼(如果有的話),或者會結束(如果再沒有更多代碼)。
試著用上面的代碼建立一個程式,在最開始增加一行代碼輸入一個數:
answer
= float(raw_input ("Enter a number from 1 to 15"))
記住要保存這個檔(這一次由你來選擇檔案名),再運行這個程式。用不同的輸入多試幾次,看看會得到什麼結果。
如果想要測試好幾件事情該怎麼辦?假設你要為 8 歲以上的人創建一個遊戲,另外你希望玩家至少上三年級。這就要滿足兩個條件。下面是測試這兩個條件的一種方法:
age =
float(raw_input("Enter your age: "))
grade
= int(raw_input("Enter your grade: "))
if
age >= 8:
if grade >= 3:
print "You can play this
game."
else:
print "Sorry, you can't play the
game."
注意第一個 print 行縮進 8 個空格,而不只是 4 個空格。這是因為每個 if 都需要自己的代碼塊,所以都要縮進 4 個空格。
提示
記住,如果你使用 Python 3 的話,需要將 raw_input() 替換為 input(),調用 print 時也需要加上括弧,像這樣:
print("You
can play this game.")
7.7 使用 and
上面最後這個例子可以達到目的。不過還有一種更簡便的方法來做同樣的事情。可以像下面這樣結合兩個條件:
我們使用 and 關鍵字來結合這兩個條件。and 表示兩個條件都必須為真才能執行下面的代碼塊。
可以用 and 把兩個以上的條件放在一起:
age =
float(raw_input("Enter your age: "))
grade
= int(raw_input("Enter your grade: "))
color
= raw_input("Enter your favorite color: ")
if
age >= 8 and grade >= 3 and color == "green":
print "You are allowed to play this
game."
else:
print "Sorry, you can't play the
game."
如果有兩個以上的條件,所有條件都必須為真,這個 if 語句才能為真。
還有其他方法來結合多個條件。
7.8 使用 or
or 關鍵字也是用來把多個條件放在一起。如果使用 or,只要任意一個條件為真,就會執行代碼塊。
color
= raw_input("Enter your favorite color: ")
if
color == "red" or color == "blue" or color ==
"green":
print "You are allowed to play this
game."
else:
print "Sorry, you can't play the game."
7.9 使用 not
還可以用 not 把比較倒過來,表示相反的邏輯。
color
= raw_input("Enter your favorite color: ")
if
color == "red" or color == "blue" or color ==
"green":
print "You are allowed to play this
game."
else:
print "Sorry, you can't play the game."
這行代碼
if
not (age < 8):
與這行代碼:
if
age >= 8:
兩者的含義是一樣的。在這兩種情況下,如果年齡是 8 歲或者超過 8 歲就會執行代碼塊,如果年齡小於 8 就不會執行。
第 4 章中,我們見過諸如 +、-、* 和 / 等數學運算子。在本章中,我們瞭解了比較操作符 <、>、== 等。and、or 和 not 關鍵字也是操作符。它們被稱為邏輯操作符(logical operator)。這些操作符用來修改比較,可以結合兩個或多個比較(and 和 or),或者取反(not)。
表 7-1 列出了目前為止我們討論過的所有操作符。
表 7-1 數學和比較操作符列表
|
操作符 |
名字 |
作用 |
|
數學運算子 |
||
|
= |
賦值 |
將一個值賦至一個名(變數) |
|
+ |
加 |
兩個數相加。這個操作符也可以用來連接字串 |
|
- |
減 |
兩個數相減 |
|
+= |
自增 |
將一個數增 1 |
|
-= |
自減 |
將一個數減 1 |
|
\* |
乘 |
兩個數相乘 |
|
/ |
除 |
兩個數相除。如果兩個數都是整數,結果只是整數商而沒有餘數 |
|
% |
取餘 |
得到兩個數整除的餘數 |
|
\*\* |
求冪 |
將一個數自乘得到冪。這個數以及冪可以是整數或浮點數 |
|
比較操作符 |
||
|
== |
相等 |
檢查兩個東西是否相等 |
|
小於 |
檢查第一個數是否小於第二個數 |
|
|
> |
大於 |
檢查第一個數是否大於第二個數 |
|
> |
小於或等於 |
檢查第一個數是否小於或等於第二個數 |
|
>= |
大於或等於 |
檢查第一個數是否大於或等於第二個數 |
|
!= |
不等於 |
檢查兩個東西是否不相等(這兩個操作符都可以使用) |
|
> |
||
你可能想在這一頁上夾個書簽,這樣下次就能很容易地查閱這個表了。
你學到了什麼
在這一章,你學到了以下內容。
·
比較測試和關係操作符。
·
縮進和代碼塊。
·
使用 and 和 or 結合測試。
·
使用 not 來進行反向測試。
測試題
1. 運行這個程式會得到什麼輸出:
my_number
= 7
if
my_number < 20:
print 'Under 20'
else:
print '20 or over'
2. 基於第一個問題中的程式,如果把 my_number 改為 25,輸出會是什麼?
3. 要檢查一個數是否大於 30 但小於或等於 40,要用哪種 if 語句?
4. 要檢查使用者輸入的字母“Q”是大寫還是小寫,要使用哪種 if 語句?
動手試一試
1. 一家商場在降價促銷。如果購買金額低於或等於 10 元,會給 10% 的折扣,如果購買金額大於 10 元,會給 20% 的折扣。編寫一個程式,詢問購買價格,再顯示折扣(10% 或 20%)和最終價格。
2. 一個足球隊在尋找年齡在 10 到 12 歲之間的小女孩加入。編寫一個程式,詢問使用者的年齡和性別(m 表示男性,f 表示女性)。顯示一條消息指出這個人是否可以加入球隊。
額外提示:要合理地建立程式,如果使用者不是女孩就不必詢問年齡。
3. 你在長途旅行,剛到一個加油站,距下一個加油站還有 200 km。編寫一個程式確定是不是需要在這裡加油,還是可以等到下一個加油站再加油。
這個程式應當問下面幾個問題。
·
你的油箱有多大(單位是升)?
·
油箱有多滿(按百分比,例如,半滿就是 50%)?
·
你的汽車每升油可以走多遠(km)?
輸出應該像這樣:
Size
of tank: 60
percent
full: 40
km per
liter: 10
You
can go another 240 km
The
next gas station is 200 km away
You
can wait for the next station.
或
Size
of tank: 60
percent
full: 30
km
per liter: 8
You
can go another 144 km
The
next gas station is 200 km away
Get
gas now!
額外提示:程式中包含一個 5 升的緩衝區,以防油表不准。
4. 建立一個程式,使用者必須輸入密碼才能使用這個程式。你當然知道密碼(因為它會寫在你的代碼中)。不過,你的朋友要得到這個密碼就必須問你或者直接猜,也可以學習足夠的 Python 知識查看代碼來找出密碼!
對程式沒什麼要求,可以是你已經編寫的程式,也可以是一個非常簡單的程式,只在使用者輸入正確的口令時顯示一條“You're in!”之類的消息。















0 留言:
發佈留言