[DA series - Learn Python with Steem #03] 邏輯判斷

in da-learnpythonwithsteem •  last year  (edited)

[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鍵一次跳一大步跳出來的,儘管肉眼看起來好像一樣,在程式編譯(執行前準備)也是會被擋下來的。

多重判斷

如果只有ifelse的話,我們要撰寫一個判斷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_weightmy_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

我們下篇文章再見囉~下課!

class-377117_1280.jpg
image - pixabay

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

py-3.png

好奇怪,为什么你的max变量的颜色与其他的变量颜色不一样?

你的寫法是沒問題的,只是因為max剛好是python一個常用function的名字,所以你的編輯器會自動幫忙變色。不過現在你宣告這個max 等於一個變數了,所以他其實已經被你覆蓋掉了~沒問題的。

  ·  last year (edited)

image.png
因为这个max不是变量

(o゜▽゜)o☆[BINGO!]

丫...下次注意取名XD

  ·  last year (edited)

image.png
交作业,我还担心负数会有什么问题呐,结果好像没有,但是这个任务的要求貌似我没用到elif,希望下次用吧,哈哈哈~

my hw:
hw3.png

有個問題,為什麼我在line6, 如果不打東西會顯示IndentationError,可是這樣加上print(''),好像有點多餘,求解答!

应该是不写东西不符合Python的语法。
在 if True: 的后面要写做出选择后要做的事情,什么都不做写个pass,像这样:

if True:
    pass

如果加了pass为什么再加其他的语句还是会被运行?pass的作用是?

图片.png

你是说这样的情况吗?pass不是跳过某段程序的意思
pass 是用来占位子的,为了让写的程序符合语法,就像上面那样

我知道的pass有两个作用:
一是像上面那样,什么都不做;
另一个是,还没想好程序的某个功能怎么写,写个pass占位子,以后有思路了再完善程序。

哦,理解了,我以为是整个if内的都pass,看来是我理解错了!多谢!

你可以吧这个print换成pass

这样符合语法,但是你这个if里就不要写其他的了,因为我不知道pass是什么作用,只是加了后语法正常能够过编译,如果你加了其他东西,那所加的内容还是会正常运行的。

對,聽高手@yjcps的!

高手都不露面的
你是幕后高手:)

  ·  last year (edited)

謝謝各高手,學了pass,
還想問問,沒看清題目,這樣用上elif好還是只用if..else好?

语句是死的用法是活得,一般没用到的我都保持知道有这个知识点,需要的时候再用,平时都是怎么好用怎么来!PS我也没用elif,你想都用的话写两段也可以呀,嘻嘻!可以多读读互相的代码!

Posted using Partiko Android

謝謝

看看回复,我又发现了这个用法~
image.png

发现新大陆啊,哈哈

多谢你的提点和提问!

  ·  last year (edited)

收益了。谢谢!

顺便提个小小的建议:博文尾部加一条回索到上一课的博文链接就更好。

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