2020年10月28日星期三

007 與小卡特一起學 Python 第 7 章 判斷再判斷

 申明本站飛宇網 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 等於 910 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"))

 

記住要保存這個檔(這一次由你來選擇檔案名),再運行這個程式。用不同的輸入多試幾次,看看會得到什麼結果。


 7.6 測試多個條件

如果想要測試好幾件事情該怎麼辦?假設你要為 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 章中,我們見過諸如 +-* / 等數學運算子。在本章中,我們瞭解了比較操作符 <>== 等。andor  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 留言:

發佈留言