在前面的學習後,你現在已經會使用 Python 基本語句,調用 Python 的內置函數 print();同時理解了數據類型的概念,包括字符串、整數、浮點數這三種類型。
我們再來通回顧一下:
接下來我們將開始學習程序邏輯——條件判斷。學會了條件判斷後,我們的程序將不再單一,變得智能起來!
前幾天買了小米的智能音箱,當我呼喚「小愛同學」後,智能音箱便能執行給它下達的指令。
上面列出了部分小愛同學支持的指令,指令有指令的規則。比如想開熱水器,我要說「打開熱水器」。而如果我說 「熱水器,開!」、「熱水器 open 一下」,智能音箱是會懵圈的。
提示:小愛同學支持的指令類似 Python 的內置函數,你只能讓小愛同學或者 Python 執行一些已經定義過的指令,也就是它們支持的指令。如果你讓它們執行未定義的指令,它們會不明白你的意圖。因為小愛同學也是用計算機實現的,所以這點和 Python 一樣。
需要用熱水器的時候我只要說「小愛同學,打開熱水器」,隨後熱水器打開。這個看起來似乎已經完美了吧?
No!還不夠。我更希望它能在需要用熱水器時,熱水器自動打開。
根據生活情景,這件事情可以簡化為:如果我家裡有人,就自動打開熱水器。這樣就不需要我每次都要記住開熱水器這件事了,就像有了私人助理一樣。
在我進門的那一刻,小愛同學可以通過攝像頭檢測並進行判斷,如果我進門了,它自動打開熱水器。小愛同學的指令判斷和執行,徹底將我從這件繁瑣重複的小事中解放出來了!
而這個 如果...就...的邏輯就是程序裡的條件判斷。生活中的條件判斷比比皆是,你可以用 如果...就... 列一大堆出來。
而編程世界也是一樣,條件判斷非常重要。Python 默認會逐行順序執行每條語句,當碰到條件判斷的時候,它會先判斷是否符合條件,如果符合,那就執行對應的代碼。
提示:編程的實質是抽象與表達。將現實世界的問題抽象成容易處理的可計算對象,然後使用計算語言來實現它。編程世界是我們現實世界的抽象,學習編程也有助於你從另一個角度認識和理解現實世界。
接下來我們一起進入《阿甘正傳》的故事,通過阿甘的成長曆程來學習今天的知識點。
編程練習
阿甘,全名福瑞斯特·甘,從小只有 75 的智商,他的背部骨骼長歪了,必須依靠支架才可以勉強走路,阿甘和媽媽相依為命。
老師用 Python 實現了一個智商分類程序,運行代碼,輸入不同的智商值,程序會輸出對應的智商等級。
你不需要弄懂代碼的細節,直接運行你的第一個條件分支的代碼吧!
拓展:一般來說,人口中的一半人屬於正常和平均智力水平(得分在 90-109 之間),得分在 110 以上就屬於高智商者,即很聰明。 據說,愛因斯坦的智商是 160。
條件結構
阿甘在學校裡經常受到別的孩子欺侮,他跑著躲避別人的捉弄。進入高中後,有一天阿甘被人欺負,拼命逃跑,無意間衝入了橄欖球場,他跑步的速度被球隊經理看上,依靠這項技能阿甘竟然成功升入大學。
而當初如果阿甘沒有「跑」的技能,他就無法升入大學,現在我們來通過條件結構來實現這個邏輯。
上面這段代碼的含義是:如果(if)技能(skill)為(==)跑,那麼列印出升入大學,成為橄欖球隊主力!。否則(else)列印出無法升入大學,過著不為人知的生活
怎麼樣?是不是讀起來很輕鬆呢?Python 對編程初學者非常友好,只要你懂一點英語,就能輕鬆讀懂基礎的 Python 代碼。值得注意的是,在上面代碼中出現了一個新的操作符,即判斷相等符號(==),顧名思義,就是判斷操作符左邊和右邊的值是不是相等的。
注意:很多人總是分不清 = 和 == 的區別,你一定要記住了: = 是賦值,== 是判斷相等。
條件結構也叫分支結構,我們通過流程圖的形式來理解上面的代碼:
可以看到,在技能(skill)是否為跑的時候產生了分支,條件成立時走左邊的分支,條件不成立時走右邊的分支。
有了條件結構,我們的程序就「有了思維」,可以進行判斷,不再單一地從上往下執行代碼,而是可以根據不同情況執行相對應的代碼了。
編程練習
現在你已經可以讀懂 if 語句的結構了,接下來你需要將 skill 變量的值改為別的任意值(比如「無」),猜猜運行結果,然後點擊運行,驗證結果是否符合你的預期。
if...else... 語句
雖然剛剛的代碼你已經可以讀懂大概意思,但是語法細則可能尚未清楚。接下來,我們來學習 if...else... 語句的語法規則:
其中判斷條件成立時,則執行冒號後面的 代碼塊 1;反之,如果判斷條件不成立則執行 else:後面的 代碼塊 2。
這裡的判斷條件一般使用比較運算符進行比較,常見的比較運算符有 ==(等於)、!=(不等於)、>(大於)、<(小於)、>=(大於等於)、<=(小於等於)。
在開車的過程中,如果開了導航的話,當超速行駛時,導航會提示我們超速了,其實這裡就用到了條件結構。假如某條公路限速 60,我們可以寫一個判斷是否超速的程序:
注意:判斷條件和 else 後面的冒號,一定不能丟掉,很多初學者會忽視這裡冒號的存在。而且在第一關學過字符串的引號必須是英文的,這裡的冒號也不例外,必須要用英文的哦~細心的你有沒有發現執行代碼塊 1 和 2 前面都有兩個空格?
那這兩個空格是必須要有的嗎,還是說可有可無呢?接下來我們通過編程練習來檢驗下。
編程練習
把下面的代碼裡兩個代碼塊中的空格都移除了,運行代碼看看是否可以成功運行?
提示:如果不能成功運行,你需要加上空格,讓它成功運行。
丟失空格會導致代碼無法運行。通過剛剛的嘗試,你應該體會到這兩個空格的重要地位了吧?
其實這個代碼行首的留白在編程裡有個專業的叫法——縮進。Python 的代碼塊是通過縮進來定義代碼塊範圍的。
縮進
代碼行的縮進決定了代碼的縮進層級,相同縮進層級的代碼具有相同的縮進,比如下面的兩行代碼是一個層級,第二行錯誤地使用了縮進將導致運行報錯:
縮進一般使用兩個空格或者四個空格,但是一定要記住要保持一致,不能一會用兩個空格,一會用四個空格。
提示:我們的課程裡面統一使用的是兩個空格。
我們再來看一下之前判斷是否超速的代碼:
第 3 行和第 5 行都縮進了,因此它們分別從屬於 if speed > 60:和 else:,相當於跟在大哥後面的小弟。當條件成立時,if speed > 60: 後面的小弟便出來幹活了。當條件不成立時,則 else: 後面的小弟出來幹活。
else和 if 都是大哥,屬於同級。雖然 else 在 if 語句後面,但 else 是不用縮進的。
下面老師列出了初學者常犯的縮進錯誤:
上面代碼中 if 語句塊裡兩行代碼的縮進空格數不統一,導致程序報錯。
上面代碼中 if 語句塊裡有兩行代碼,第三行和第四行是相同的層級,但是第四行卻忘記縮進了。
上面代碼中第二行和第一行具有相同的層級,所以第二行應該和第一行保持一致。
要求嚴格的代碼縮進是 Python 語法的一大特色。代碼本身的縮進,使得 Python 不需要標明額外的符號來標識代碼塊開始和結束。對比其他程式語言,比如 Java 語言,代碼沒有要求嚴格的縮進,所以需要額外的花括號來表示代碼塊的開始和結束。
拓展:Python 使用回車來分割語句,冒號和縮進來分割代碼塊;C++ 和 Java 等語言使用分號來分割語句,花括號來分割代碼塊。
編程練習
阿甘的球隊表現出色,得到了甘迺迪總統接見。不久之後,甘迺迪被刺殺,阿甘大學畢業,此時命運之神再次向他招手,一位軍人將徵兵廣告遞到了阿甘手上。
現在請使用條件結構,補全下面的代碼,在屏幕上列印出阿甘的選擇。
提示:阿甘最終選擇應徵入伍。
現在你已經可以自己動手實現條件分支了,作為新手的你已經很厲害了!
接下來,將教你一個很多程式語言都會用到的知識——注釋。
注釋
當我們寫得代碼越來越多,越來越複雜的時候,我們回過頭看之前寫的代碼時,很難立刻就能看明白當初為什麼要這麼寫。而有了注釋,相當於給代碼做了標註筆記,下次再看的時候便能快速回憶起來。
Python 中的注釋很簡單,只需要在注釋內容前加上 # 即可。比如:
注釋是給人看的,Python 會自動忽略注釋的內容,不去執行。適當的注釋可以提高代碼可讀性,但不要加一些沒有必要的注釋,不要為了加注釋而加注釋,比如:
上面的注釋是沒有必要的,因為會 Python 的人一眼就能看出 name = '阿甘' 的含義。注釋是輔助人們來閱讀代碼的,如果代碼本來可讀性就極高,就沒有為它添加注釋的必要了。所以大家日後如果要添加注釋,可以先反問一下自己,「這裡有必要加注釋嗎?」。我們來體會一下注釋的正確打開方式:
拓展:TBD 是 to be done 的簡稱。想了解更多關於代碼注釋的有趣知識,可以去知乎搜索「你見過哪些奇趣的代碼注釋」。
這段代碼的背景是:我們公司的運營有個緊急需求,希望某促銷活動的結束日期,在 7 月 30 號當天臨時改為 2019-07-30,我們的後端徐工就臨時加了行代碼,把 end_date 寫死到這天,但為了防止之後忘記把代碼改回去,所以加了行注釋。
徐工的這行注釋一方面防止明天自己忘了改,另一方面是萬一明天徐工寫了大 bug 跑路了,後面的工程師看到這行注釋也會知道這是臨時代碼,會及時改正並感激徐工不殺之恩。
Python 會自動忽略注釋的內容。因此我們可以將暫時用不到但又不想刪掉的代碼放到注釋中,這樣 Python 就不會執行它們。將它們放到注釋中也便於日後需要用到時快速復原。舉個例子,雙十一了要做優惠活動,寫了一份優惠的代碼,節後要恢復原價。我們可以將原價注釋,節後再將注釋取消,恢復原價。
當然,這個例子很簡單,體現不了注釋的作用。但如果優惠活動複雜,我們需要注釋一大段代碼,此時,注釋便非常有用。
編程練習
阿甘所在的隊伍在農田巡邏時遭到敵方襲擊,中尉叫他快跑,阿甘一溜煙跑出叢林,這時他想起最好的朋友巴布沒有出來。在救出好幾個戰友後,也救出了垂死的巴布。但不幸的是,巴布最終還是死在了越南的一條河邊。
下面是阿甘關於巴布的講述,請你根據故事情節中注釋掉錯誤的巴布結局,運行程序。
現在,你理解了變量的使用,會使用 Python 中的第一個控制結構——條件,也了解了代碼中常見的縮進和注釋。同時,通過代碼完善阿甘的成長曆程。
我們來總結一下這關的知識點:
回望這一關,是不是覺得收穫滿滿呢?
人生本質上就是由一堆堆的選擇組成,你無時無刻不在做著選擇。而正因為不同的人會有不同的選擇,才有了多彩多姿的人生。
阿甘,基於自己的誠實、守信、認真、勇敢、重視感情而做出的一系列選擇,造就了令無數人敬佩的他!