[DA series - Learn Python with Steem #03] 邏輯判斷
[DA series - Learn Python with Steem] 是DA(@deanliu & @antonsteemit)關於「從Python程式語言實做Steem區塊鏈的入門」的系列,歡迎趕緊入列學習!
前情提要:[DA series - Learn Python with Steem #02] 變數與資料型態
新的一週開始了!讓我們繼續學習吧!
第#03堂課,今天我們來看一個相對簡單但非常重要的主題:邏輯判斷 吧!
Python的 If Else 邏輯判斷
邏輯判斷可以說是程式語言最古老的基本成份,也是程式中非常常出現的語法。看懂了if else之後,加上我們之前對於變數的理解,看一個陌生的簡易程式碼已經可以理解五六成了。
其實我相信很多人看到If else這些英文字,就已經可以猜到大概的意義了。沒錯,正如他們的中文翻譯,if
就是「如果」的意思:如果符合這個情況(邏輯判斷)就執行下列程式;而else
則是跟隨在if
後面的,代表不符合if
的其他情況下,就執行這些程式。所以整個if else,可以翻譯成中文的「如果...否則...」
我現在舉一個非常簡單的例子,懂了之後再來看看一些比較細項的規定:
執行程式:python tutorial_3.py
Output: You are not overweight!
注:本篇教學的程式碼可至GitHub/tutorial_3.py中參考或下載。
在Python語言中,所有的判斷式都是用冒號(:
)並且加上換行縮排來表示邏輯的上下關係。由上面的程式碼中可以看出,縮排的(按tab,相當於在段落前增加一個大空格)的 print('You are not overweighted!')
是屬於 if
的範圍,因此在 if
成立時會被執行。
而else
會跟if
在同樣的水平位置,在else:
的下一行也是一排經過縮排的內容,表示else成立的話,要執行的範圍。
關於判斷式
放在 if
後面的 BMI>24
是一個 Expression,也就是一個會回傳「True or False」的式子。這裡的「大於小於」判斷很好理解,如果正確就回傳True
、錯誤就回傳False
。比較要注意的事,如果要判斷相等的話要使用==
兩個等號,因為一個等號在程式中是賦值
的意思,兩個等號才是一個會回傳True or False的Expression。
你可能會想說,上次學到的布林值不是也是True
or False
嗎?沒錯!所以可以在if
之類的地方放上以前學過的布林值。例如:
is_married = True
if is_married:
print('You are married')
else:
print('blah blah blah')
關於縮排
這些縮排的規定是非常重要的,因為python中沒有使用任何括號來把if 的範圍刮起來,python完全是透過換行以及縮排來判斷要怎麼執行程式。如果你的換行與縮排有錯誤的話,會讓程式不知道何者屬於if
的範圍,或何者屬於else
的範圍。例如下面就是一個錯誤例子:
錯誤代碼如下:
File "tutorial_3.py", line 7
else:
^
SyntaxError: invalid syntax
我們可以來練習怎麼讀這些錯誤。他告訴我們是在第七行的else
出了問題,而他會跳出錯誤正是因為所有else
出現前,都應該先有個同縮排等級的if。不然沒有「如果」哪來的「否則」阿?
如果你在執行程式的時候發現IndentationError
的錯誤,很可能是因為每次縮排的方式不同。在python中,縮排不只水平距離看起來要一樣,若是用空白鍵按很多次按出來的,跟使用tab
鍵一次跳一大步跳出來的,儘管肉眼看起來好像一樣,在程式編譯(執行前準備)也是會被擋下來的。
多重判斷
如果只有if
跟else
的話,我們要撰寫一個判斷BMI是否正常的程式需要「兩層的if-else」。因為在確定沒有過胖的情況下,還要在透過一次if - else 確定也沒有過瘦,才算正常。因此我們的完整邏輯判斷會變成:
執行結果:You are just fit!
不過這種多重判斷是很常遇到的,我們通常會有很多的這種非類的情況,例如:假設我們要區分一個數字是位於0~10, 11~20, 21~30, 31~40 哪一個區間,如果只用單純的if - else
的話,就需要四層判斷。當然我們的python不會讓我們這麼累啦!所以就發明了 elif
的語法,意思就是 Else if,中文可以翻譯為「若不是,那如果...」
例如上面的BMI例子,就可以透過elif
改寫如下:
所以這個程式會先判斷我的BMI是否大於24,若是,則輸出「You are overweight!」。
若不是,那如果 BMI < 18,就輸出「You are underweight」。而最後剩餘的情況,也就是 BMI介於18~24之間,就是屬於正常。這樣寫是不是很簡單阿!
讓程式變有趣的小撇步
今天最後來教大家一個很好用的功能:讀取使用者輸入的函式:input()
。
我們剛剛那些變數:my_weight
、my_height
都是在程式碼內自行輸入指定的,每次要測試不同的身高體重就要重新更改程式碼,要是可以在執行的時候手動輸入想要查詢的值就好了!因此有了input()
這樣一個方便好用的函式。使用方式如下:
input()
裡面放的字串是我們想要顯示在command line上的提示字元,在這裡就是詢問使用者,你的身高及體重為何。輸入完成後,這兩個值分別被存到my_height
以及my_weight
裡面。
但要注意的是,input()
所讀進來的變數型態為字串,還記得我們前面說過,字串的加減乘除跟數字是不一樣的,其中乘法就會出錯。因此我們在使用這兩個變數計算BMI前,要把他們的資料型態由「字串」轉為「數字」。Python中我們可以直接用float(x)
把一個x轉成 「有小數點的數字」,或是用int(x)
把x轉成「正整數」。我們這裡兩個都是可以輸入小數點的,因此選擇用float()
把讀到的字串轉成 float(這種有小數點的數字稱為浮點數)
執行結果如下:
是不是程式都變好玩了呀!
如你所見,input()
可以幫助我們設計很多跟使用者互動的界面,大家也可以試著自己做做看一些簡單的「輸入並判斷」程式囉!
Homework time:練習題!
從這章節開始,我們都在文末來指派個小小練習題好啦!讓大家自己建立一點成就感。今天小小的練習題:
利用If-Else Statement,設計一個程式 要求使用者輸入三個數字,最後印出最大值:
範例輸入與輸出
參考解答:GitHub/@antoncoding
我們下篇文章再見囉~下課!
image - pixabay
好奇怪,为什么你的max变量的颜色与其他的变量颜色不一样?
你的寫法是沒問題的,只是因為max剛好是python一個常用function的名字,所以你的編輯器會自動幫忙變色。不過現在你宣告這個max 等於一個變數了,所以他其實已經被你覆蓋掉了~沒問題的。
因为这个max不是变量
(o゜▽゜)o☆[BINGO!]
丫...下次注意取名XD
交作业,我还担心负数会有什么问题呐,结果好像没有,但是这个任务的要求貌似我没用到elif,希望下次用吧,哈哈哈~
my hw:
有個問題,為什麼我在line6, 如果不打東西會顯示IndentationError,可是這樣加上print(''),好像有點多餘,求解答!
应该是不写东西不符合Python的语法。
在 if True: 的后面要写做出选择后要做的事情,什么都不做写个pass,像这样:
如果加了pass为什么再加其他的语句还是会被运行?pass的作用是?
你是说这样的情况吗?pass不是跳过某段程序的意思
pass 是用来占位子的,为了让写的程序符合语法,就像上面那样
我知道的pass有两个作用:
一是像上面那样,什么都不做;
另一个是,还没想好程序的某个功能怎么写,写个pass占位子,以后有思路了再完善程序。
哦,理解了,我以为是整个if内的都pass,看来是我理解错了!多谢!
你可以吧这个print换成pass
这样符合语法,但是你这个if里就不要写其他的了,因为我不知道pass是什么作用,只是加了后语法正常能够过编译,如果你加了其他东西,那所加的内容还是会正常运行的。
對,聽高手@yjcps的!
高手都不露面的
你是幕后高手:)
謝謝各高手,學了pass,
還想問問,沒看清題目,這樣用上elif好還是只用if..else好?
语句是死的用法是活得,一般没用到的我都保持知道有这个知识点,需要的时候再用,平时都是怎么好用怎么来!PS我也没用elif,你想都用的话写两段也可以呀,嘻嘻!可以多读读互相的代码!
Posted using Partiko Android
謝謝
看看回复,我又发现了这个用法~
发现新大陆啊,哈哈
多谢你的提点和提问!
收益了。谢谢!
顺便提个小小的建议:博文尾部加一条回索到上一课的博文链接就更好。
good idea! thanks!
更谢谢你的礼包!
太好了,最近正好也在自学着Python!感谢你的分享!
不用客氣。
了解一下!
碼神你別裝了啦!XD
python我确实不懂啊!
我要赶紧跟上你们的步伐,先去下载Python lol
走很慢的~~ ^_^
你很快能赶上的!
Posted using Partiko Android
FYI, the code
Doesn't sync with
Output: You are not overweighted!>
python 有沒有 case 的