章節三:條件判斷與條件巢狀
章節三:條件判斷與條件巢狀
目錄對於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/