1. 程式人生 > 其它 >章節三:條件判斷與條件巢狀

章節三:條件判斷與條件巢狀

章節三:條件判斷與條件巢狀

目錄

對於Python來講,光正確使用【映象世界的資料】還不夠,還需要正確的【溝通邏輯】才能讓Python準確地執行你的命令。

比方說,我想讓天貓精靈在感知到我開門的一瞬間,開啟客廳的燈。如果我只說:天貓精靈,開啟燈。那麼,由於缺少開門的前提條件,無論你開不開門,燈都會開啟著。

所以,我們下的命令應該是這樣:天貓精靈,如果我開門,你就開啟客廳的燈。

而這個下命令的如果…就…邏輯,就是與計算機溝通的邏輯——條件判斷,其作用就是明確地讓計算機知道:在什麼條件下,該去做什麼。

對於Python也是同樣。Python之所以能完成自動化任務,比如自動抓取網頁關鍵詞,自動下載小電影等,就是因為它可以執行條件判斷。

1. 條件判斷

1.1 單向判斷:if

在Python裡,條件判斷語句總共有三種表現形式,我們先從最簡單的單向判斷:if開始說起:

單向判斷:if代表什麼呢?相傳上面的六顆寶石是宇宙中最強大的東西。如果一個人同時擁有六顆寶石,ta就可以實現包括毀滅宇宙在內的所有事情。

有一個如果……就。那麼,如果我們要用程式碼來“翻譯”這段話,就可以用條件判斷語句中的單項判斷:if來表述。

比如像這樣:

詳解:
首先,第一行程式碼,用賦值運算子=對當前情況進行賦值:將你擁有的寶石個數6賦值給變數——寶石數stonenumber。

第二步,確定if條件:如果變數stonenumber的值>=個數6時,就執行冒號後,下一行的命令。

第三步,用print()命令打印出結果:你擁有了毀滅宇宙的力量。

所以,if語句的單向判斷邏輯,我們可以這樣歸納:

在這裡,你可能注意到了一個細節:在條件判斷程式碼中的冒號:後、下一行內容的前面,會空幾個格,但這是為什麼呢?

首先,在計算機的溝通語言中,空格的學名叫縮排,比如我們寫文章都要空兩個格,這就叫首行縮排。

對於Python而言,冒號和縮排是一種語法。它會幫助Python區分程式碼之間的層次,理解條件執行的邏輯及先後順序。【注:縮排是四個空格或一個Tab鍵】

並且,在if條件語言中,縮排不需要我們手動按空格鍵。當你用英文輸入法打:後按回車,我們的開發工具(用來編寫Python程式碼的程式)為了方便大家程式設計,會自動實現下一行程式碼,向右縮排的功能。

此時,被縮排的內容(print()函式)和if條件語句組成了一個程式碼塊(一個整體),成為了if條件下的內部命令。

這意味著:如果賦值滿足if條件,計算機就會準確執行if條件內部的命令(即縮排的程式碼塊)。


當我們去掉縮排時,if條件和print命令成為了兩個不同的程式碼組,屬於平行關係。你看:if條件下面,缺少了可以執行的動作,是不是會出現IndentationError: expected an indented block(縮排錯誤:期望一個縮排塊)的報錯?

下面,我們來小結一下單向判斷:if的程式碼邏輯及語法格式:

現在來看下這個

詳解:
首先,第一行的賦值語句【stonenumber=2】是後面if條件判斷語句的前提情況,然而並不滿足『stonenumber>=6』這個條件,所以不會執行條件下的『print』操作。

計算機是一行行往下執行程式碼的。所以,當第一行賦值情況的前提不滿足if的條件時,Python的邏輯就會判斷:條件不滿足,無法執行if條件下的命令,從而自動跳過,執行下一行命令。

但是,在上方程式碼中,除了if之外,我們並沒有設定其他的命令去讓Python執行。因此,Python自然就無法輸出結果。

也就是說,由於寶石數量只有2,沒有滿足6顆寶石的if條件,if條件下的列印命令就無法生效

1.2 雙向判斷:if…else…

在Python宇宙,我們可以利用if的雙向判斷形式:if…else…去實現這個行動

下面,請你直接執行下面的程式碼,看程式是如何識別的:

很多時候,我們不能把雞蛋放在一個籃子裡,要做好兩手準備:如果不滿足條件時,我們要怎麼辦。

Python則很貼心地,讓我們借用if…else…語句,讓碼農們有了另一種選擇——【如果…不滿足,就…】

在if...else條件語句中,if和else各自抱團,形成兩個不同的程式碼塊。表示的是條件和其他條件的互斥關係——如果不滿足if條件,就執行else其他條件。

關於if...else...的相關知識點到這裡就講完了,我們來總結一下if…else…語句的知識點。

1.3 多向判斷:if…elif…else…

在判斷3個或3個以上的條件時,我們就需要藉助Python中的多向判斷命令:if…elif…else…。

這三者共同構成了多向判斷的命令邏輯關係:如果if的條件不滿足,就按順序看是否滿足elif的條件,如果不滿足elif的條件,就執行else的命令。

並且,當判斷的條件超過3個時,中間的多個條件都可以使用elif。

比如像這樣:

首先,第一行的賦值,會按照從上到下的順序挨個試一遍,看自己滿足哪個條件,滿足了就不往下走,不滿足就繼續試,試到出結果為止。

其次,elif的執行本質上和else一樣,已經帶有其他條件的意思,所以elif後可以不接else。

比如上面的程式碼,stonenumber=5會對下面的if elif else條件逐個掃描,看看自己滿足哪一個,就執行哪個條件底下的命令。

很顯然,第二個條件elif 0<stonenumber<=5剛好能與stonenumber=5的前提相匹配,於是,執行elif底下的命令:print('緋紅女巫需要親手毀掉幻視額頭上的心靈寶石')**。

還可以這樣

下面,我們來總結一下elif的知識點:

2. if巢狀

舉例

考試成績評價規則:

1. 如果成績大於等於60分,就是及格,在此前提下:
(1)如果成績大於等於80分,屬於優秀範圍;
(2)否則(即大於等於60分而小於80分),屬於一般範圍。

2. 如果成績小於60分,就是不及格,在此前提下:
(1)如果成績小於30分,平時太不認真,屬於學渣了;
(2)如果成績(小於60分而大於等於30分),那麼,至少還能搶救一下。

像這種如果底下還有如果(即條件裡還套條件)的情況,我們如何用Python把上面的規則寫出來,並得出評價呢?

答案就是——巢狀條件。

if巢狀的應用場景,簡單來講就是:在基礎條件滿足的情況下,再在基礎條件底下增加額外的條件判斷。

用if巢狀可以像下方程式碼這樣:

2.1 if巢狀的執行順序

首先,我們先從整體總覽一下,這段彼得·帕克成績評價規則的程式碼,總共分為四部分【賦值、if、else、print()】,兩個大程式碼組。

並且,在程式碼組1的if條件和程式碼組2的else的條件下,又包含了條件判斷命令if...else...。

那麼,這種巢狀命令我們要如何理解呢?

縮排相同的命令處於同一個等級,第一步,計算機就要按順序一條一條地執行命令。


那麼,計算機執行的順序就是:
(1)先給historyscore賦值;

(2)因為if和else是隻能留一個的互斥關係,if和else下的程式碼塊只會執行一個,所以計算機要判斷賦值的內容滿足【historyscore>=60】還是【historyscore<60】的條件——如果滿足if的條件,就執行if縮排下的內容,如果不滿足就執行else縮排下的內容;

(3)執行print('程式結束')。

下面,我們再通過一張導圖理一下if巢狀的邏輯:

2.2 如何寫巢狀程式碼

if巢狀由於涉及多個條件判斷,並且是條件套條件的判斷,所以為了理清邏輯,我們可採用扒洋蔥大法寫if巢狀

舉例:

詳解:
以此舉例,第一步就要搞定最外層那張皮,將最基礎的命令和條件寫出來。

那麼,我們的思考邏輯應該是這樣(1)把歷史成績賦給變數historyscore;(2)用if…else寫最基礎判斷條件如果historyscore>=60時,列印你已經及格,否則,列印不及格;(3)用print()輸出程式結束。

第二步,在“第一層皮”裡裝東西。也就是在條件【historyscore>=60】下,增加額外條件。

3. 本章小結

4. 習題練習

4.1 習題一

1.練習介紹:
在滅霸打了一個響指,宇宙一半生物都灰飛煙滅。
剩下的復仇者聯盟成員們依舊沒有放棄反擊滅霸的機會,他們決定利用最後一次行動機會,去把滅霸手裡的寶石偷回來。
如果偷回的寶石數是4顆及以上,便獲得了打敗滅霸的力量;如果偷回的寶石數是1-3顆,他們可以全員出動,殊死一搏;如果偷回的寶石數是0顆,只能嘗試呼叫驚奇隊長。
最終,他們因為實力相差太大,1顆寶石都沒有偷回來。

2.題目要求:
請你寫出一段程式碼,在一顆寶石都沒偷回來的賦值下,進行條件判斷,併產生對應的結果:
1.如果偷回的寶石數是4顆及以上,輸出結果獲得了打敗滅霸的力量,反殺穩了
2.如果偷回的寶石數是1-3顆,輸出結果可以全員出動,殊死一搏
3.如果偷回的寶石數是0顆,輸出結果沒辦法了,只能嘗試呼叫驚奇隊長

4.2 習題二

1.練習介紹:
復仇者聯盟的成員也是有工資的,然而,由於美國隊長一直被冰封在北極,錯過了多次調薪機會,所以美國隊長的工資一直是每月80美元。光榮挺進史塔克窮人榜前三名,並獲封“美元隊長”稱號。

2.題目要求:
請你寫出一段程式碼,判斷美國隊長的工資水平,程式碼需要滿足如下條件:
1.如果月工資小於等於500美元,顯示“歡迎進入史塔克窮人幫前三名”
1.1如果月工資在100-500美元之間,顯示“請找弗瑞隊長加薪”
1.2如果月工資小於等於100美元,顯示“恭喜您榮獲“美元隊長”稱號!”
2.如果月工資在500-1000美元之間(含1000美元),列印“祝賀您至少可以溫飽了。”
3.其他情況下,如果工資大於1000美元,列印“經濟危機都難不倒您!”
3.1如果工資在1000-20000美元(含20000美元)之間,列印“您快比鋼鐵俠有錢了!”
3.2如果月工資大於20000美元,列印“您是不是來自於瓦坎達國?”
4.不管賦值改變後輸出結果如何,都需固定列印結果“程式結束”

節選自風變程式設計學習筆記:https://www.pypypy.cn/