在接觸條件語句之前,我們看到的程式碼都是順序執行的,也就是先執行第1條語句,然後是第2條、第3條……一直到最後一條語句,這稱為順序結構。但是對於很多情況,順序結構的程式碼是遠遠不夠的,比如一個程式限制了只能成年人使用,兒童因為年齡不夠,沒有許可權使用。這時候程式就需要做出判斷,看使用者是否是成年人,並給出提示。在 Python 中,可以使用 if else 語句對條件進行判斷,然後根據不同的結果執行不同的程式碼,這稱為選擇結構或者分支結構。
一、條件語句
Python 中的 if else 語句可以細分為三種形式,分別是 if 語句、if else 語句和 if elif else 語句
(一) if 語句
if 語句的含義及功能:(1)if在Python中是作為關鍵字存在的;
(2)if在Python中的含義是“如果”;
(3)if語句在Python中起著判斷的功能。
if 語句的語法格式以及執行流程:(1)if語句的語法格式如下:
if 表示式: 程式碼塊
一個完整的if語句由“if 表示式”+“:”+“程式碼塊”組成。
要注意的是,表示式通常為你所要用if進行判斷的內容(可以是一個單一的值或者變數,也可以是由運算子組成的複雜語句,形式不限,只要它能得到一個值就行。不管“表示式”的結果是什麼型別,if else 都能判斷它是否成立[真或者假]。)。而在表示式書寫完後必須要有冒號“:”,否則系統會報錯。
而程式碼塊由由具有相同縮排量的若干條語句組成。
if語句的語法格式以及執行流程
祥例:應用使用前判斷一個人是否滿18歲,如果未滿不能使用該應用,如果已滿則能使用該應用age=int(input('請輸入您的年齡'))if age < 18: print('您未達到法定的應用使用年齡,您無法使用該應用。')if age > 18: print('您已達到法定使用本應用年齡,正在載入中......')
(二)if else 語句
if else 語句的使用規則與if 語句無異,只是在if語句的基礎上增加了else關鍵字的含義以及功能應用。
1.else的含義以及功能:
(1)else是關鍵字;
(2)else在if else 語句中是否則的意思;
(3)else在if else 語句中如果if判斷結果為False,則執行else的功能。如果if判斷結果為True,則執行if的功能,不必執行else的功能。
2.if else語句的格式以及執行流程:
if else語句的格式以及執行流程
同if語句一致,一個完整的if else 語句應同時包含“if 表示式:”+“程式碼塊1”+“else:”+“程式碼塊2”。
所有要注意的地方也基本和if語句一致,最重要的一點就是程式碼塊要想正確執行,在程式碼塊之前必須要有一個tab距離(也即四個空格的距離),如果是巢狀的判斷語句,則程式碼塊在所屬判斷語句下要與判斷語句開頭第一個字母有一個tab距離,例如:
age=int(input('請輸入您的年齡'))if age == 18: print('您已達到法定的應用使用年齡,可以使用該應用。正在載入中......') if age < 18: print('您未達到法定的應用使用年齡,您無法使用該應用。')else: print('您已達到使用年齡,可以使用該應用。正在載入中......')
(三)if elif else 語句:
在條件語句方面,本質上三種語句語法規則都一樣,但根據不同實際情況的不同應用,誕生有三種不同深度的條件判斷語句。第三種if elif else語句是最為複雜也是最為精確的條件判斷語句。
1.elif的含義及功能:
(1)elif也是一個關鍵字;
(2)elif在if elif else語句中的含義為“否則如果”;
(3)elif永遠存在於if elif else語句的中間,開頭為if語句,中間為elif語句,結尾為else語句。elif永遠不能單獨用於某物判斷的開頭或結尾,否則程式會報錯。
2.if elif else語句的格式以及執行流程:
例項1判斷一個人的身材是否合理:
height = float(input("輸入身高(米):"))weight = float(input("輸入體重(千克):"))bmi = weight / (height * height) #計算BMI指數if bmi<18.5: print("BMI指數為:"+str(bmi)) print("體重過輕")elif bmi>=18.5 and bmi<24.9: print("BMI指數為:"+str(bmi)) print("正常範圍,注意保持")elif bmi>=24.9 and bmi<29.9: print("BMI指數為:"+str(bmi)) print("體重過重")else: print("BMI指數為:"+str(bmi)) print("肥胖")
例項2應用程式身份資訊校驗:
import sysprint('歡迎使用XXX應用程式')print('下面是身份資訊認證環節,請準確無誤地輸入您的個人資訊。')age=int(input('請輸入您的年齡:'))if age == 18: print('您已達到法定的應用使用年齡,可以使用該應用。')elif age < 18: print('您未曾達到法定的應用使用年齡,不能使用該應用。請退出!') sys.exit() #sys 模組的 exit() 函式用於退出程式。else: print('您已達到使用年齡,可以使用該應用。正在載入中......')identity=str(input('請告知您的個人職業:'))id_1='軍人'id_2='警察'id_3='消防員'id_4='應急醫生'id_5=(id_1,id_2,id_3,id_4)if identity == id_5: print('身份正確,正在進入該應用...')elif identity == id_1: print('身份正確,正在進入該應用...')elif identity == id_2: print('身份正確,正在進入該應用...')elif identity == id_3: print('身份正確,正在進入該應用...')else: print('身份錯誤!')
if elif else語句的格式以及執行流程
在這種形式中,Python 會從上到下逐個判斷表示式是否成立,一旦遇到某個成立的表示式,就執行後面緊跟的語句塊;此時,剩下的程式碼就不再執行了,不管後面的表示式是否成立。如果所有的表示式都不成立,就執行 else 後面的程式碼塊。
(四)條件語句總結:
1.對語法格式的說明:
“表示式”可以是一個單一的值或者變數,也可以是由運算子組成的複雜語句,形式不限,只要它能得到一個值就行。不管“表示式”的結果是什麼型別,if else 都能判斷它是否成立(真或者假)。“程式碼塊”由具有相同縮排量的若干條語句組成。if、elif、else 語句的最後都有冒號:,不要忘記。2.條件語句執行方式:
一旦某個表示式成立,Python 就會執行它後面對應的程式碼塊;如果所有表示式都不成立,那就執行 else 後面的程式碼塊;如果沒有 else 部分,那就什麼也不執行。執行過程最簡單的就是第一種形式——只有一個 if 部分。如果表示式成立(真),就執行後面的程式碼塊;如果表示式不成立(假),就什麼也不執行。對於第二種形式,如果表示式成立,就執行 if 後面緊跟的程式碼塊1;如果表示式不成立,就執行 else 後面緊跟的程式碼塊2。對於第三種形式,Python 會從上到下逐個判斷表示式是否成立,一旦遇到某個成立的表示式,就執行後面緊跟的語句塊;此時,剩下的程式碼就不再執行了,不管後面的表示式是否成立。如果所有的表示式都不成立,就執行 else 後面的程式碼塊。總起來說,不管有多少個分支,都只能執行一個分支,或者一個也不執行,不能同時執行多個分支。
3.if else 如何判斷表示式是否成立:
上面說過,if 和 elif 後面的“表示式”的形式是很自由的,只要表示式有一個結果,不管這個結果是什麼型別,Python 都能判斷它是“真”還是“假”。布林型別(bool)只有兩個值,分別是 True 和 False,Python 會把 True 當做“真”,把 False 當做“假”。對於數字,Python 會把 0 和 0.0 當做“假”,把其它值當做“真”。對於其它型別,當物件為空或者為 None 時,Python 會把它們當做“假”,其它情況當做真。比如,下面的表示式都是不成立的:
"" #空字串[ ] #空列表( ) #空元組{ } #空字典None #空值
例項:
b = Falseif b: print('b是True')else: print('b是False')n = 0if n: print('n不是零值')else: print('n是零值')s = ""if s: print('s不是空字串')else: print('s是空字串')l = []if l: print('l不是空列表')else: print('l是空列表')d = {}if d: print('d不是空字典')else: print('d是空字典')def func(): print("函式被呼叫")if func(): print('func()返回值不是空')else: print('func()返回值為空')
執行結果為:
b是Falsen是零值s是空字串l是空列表d是空字典函式被呼叫func()返回值為空
(五)if else 對縮排的要求(重點):
上面簡單展示了選擇結構的三種基本形式,並給出了例項演示,但是大家在編寫程式碼過程中仍然要注意一些細節,尤其是程式碼塊的縮排,這對 if else 選擇結構極其重要。Python 是以縮排來標記程式碼塊的,程式碼塊一定要有縮排,沒有縮排的不是程式碼塊。另外,同一個程式碼塊的縮排量要相同,縮排量不同的不屬於同一個程式碼塊。
不要忘記縮排if、elif 和 else 後面的程式碼塊一定要縮排,而且縮排量要大於 if、elif 和 else 本身。例如,下面的程式碼就是一個反面教材:
age = int( input("請輸入你的年齡:") )if age < 18 :print("警告:你還未成年,不能使用該軟體!")else:print("你已經成年,可以使用該軟體。")
本例中的 print() 函式和 if、else 語句是對齊的,在同一條豎線上,都沒有縮排,所以 print() 就不是 if、else 的程式碼塊了,這會導致 Python 直譯器找不到 if、else 的程式碼塊,從而報出如下錯誤:
SyntaxError: expected an indented block翻譯過來就是:語法錯誤:需要一個縮排的程式碼塊
總之,if、else 後面的程式碼一定要縮排,否則就不能構成 if、else 的執行體。
縮排多少合適?Python 要求程式碼塊必須縮排,但是卻沒有要求縮排量,你可以縮排 n 個空格,也可以縮排 n 個 Tab 鍵的位置。但是從程式設計習慣的角度看,我建議縮排 1 個 Tab 鍵的位置,或者縮排 4 個空格;它們兩者其實是等價的,很多編輯器都可以將 Tab 鍵設定為 4 個空格,比如,IDLE 中預設 Tab鍵 就是 4 個空格。
所有語句都要縮排一個程式碼塊的所有語句都要縮排,而且縮排量必須相同。如果某個語句忘記縮進了,Python 直譯器並不一定會報錯,但是程式的執行邏輯往往會有問題。請看下面的程式碼:
age = int( input("請輸入你的年齡:") )if age < 18 : print("你還未成年,建議在家人陪同下使用該軟體!")print("未成年人如果得到了家長的同意,請忽略以上提示。") #忘記縮排
這段程式碼並沒有語法錯誤,但是它的執行邏輯是不對的,比如,輸入 16 的執行結果如下:
請輸入你的年齡:24↙未成年人如果得到了家長的同意,請忽略以上提示。
使用者的年齡分明大於18,但是卻出現了“未成年人”的提示,畫面非常尷尬,這是因為第二個 print() 語句沒有縮排,if 沒有把它和第一個 print() 語句當做同一個程式碼塊,所以它不是 if 執行體的一部分。解決這個錯誤也很容易,讓第二個 print() 縮排 4 個空格即可。
同一程式碼塊縮排量要相同Python 雖然不限制程式碼塊的縮排量,你可以隨意縮排 n 個空格,但是,同一個程式碼塊內的所有語句都必須擁有相同的縮排量,不能一會縮排 2 個空格,一會縮排 4 個空格。下面的程式碼是一個反面教材:
age = int( input("請輸入你的年齡:") )if age < 18 : print("你還未成年,建議在家人陪同下使用該軟體!") print("未成年人如果得到了家長的同意,請忽略以上提示。") #縮排量不對
執行這段程式碼,Python 直譯器會報出語法錯誤:
SyntaxError: unexpected indent翻譯過來就是:語法錯誤:意外的縮排
這段程式碼中,第一個 print() 語句縮進了 4 個空格,第二個 print() 語句縮進了 6 個空格,縮排量不同導致它們不是同一個程式碼塊。Python 會認為第一個 print() 語句是 if 的執行體,而第二個 print() 是一個意外的存在,不知道該把它當做誰的程式碼塊,所以解析失敗,報錯。總之,位於同一個程式碼塊中的所有語句必須擁有相同的縮排量,多一個空格或者少一個空格都不行。
不要隨便縮排另外需要注意的是,不需要使用程式碼塊的地方千萬不要縮排,一旦縮排就會產生一個程式碼塊。下面的程式碼是一個反面教材:
info = "Python教程的網址是:http://c.biancheng.net/python/" print(info)
這兩條簡單的語句沒有包含分支、迴圈、函式、類等結構,不應該使用縮排。
(二)條件語句的底層邏輯——條件測試:
Python條件測試表達式用法詳解
1、Python中的真假
1)、任何非0數字和非空物件都為真;
2)、數字0、空物件和特殊物件None均為假;
3)、比較和相等測試會遞迴地應用於資料結構中;
4)、返回值為True或False;
2、Python組合條件測試
X and Y: 與運算
X or Y: 或運算
not X: 非運算
3、Python條件測試內建變數及程式碼塊
break: 跳出最內層的迴圈;
continue: 跳到所處的最近層迴圈的開始處;
pass: 點位語句
else程式碼塊:迴圈正常終止才會執行;如果迴圈終止是由break跳出導致的,則else不會執行;
(三)關係運算符:
關係運算符同數學中的運算子作用一樣,只不過在Python中具體的符號有些不同而已。關係運算符主要可分為“==(等於)”、“!=(不等於)”、“>(大於)”、“<(小於)”、“>=(大於等於)”以及“<=(小於等於)”六類。
關係運算符在程式碼中運算後只會產生倆種結果,也即bool型結果“True”或“False”,而關於倆種結果能給程式碼造成什麼影響,在上文中有所提到,這裡便不再闡釋。
(四)邏輯運算子:
在高中數學中我們學過邏輯運算,例如 p 為真命題,q 為假命題,那麼“p且q”為假,“p或q”為真,“非q”為真。Python 也有類似的邏輯運算,請看下錶:
Python邏輯運算子及功能
邏輯運算子一般和關係運算符結合使用,例如:
14>6 and 45.6 > 90
14>6 結果為 True,成立,45.6>90 結果為 False,不成立,所以整個表示式的結果為 False,也即不成立。
再看一個比較實用的例子:
age = int(input("請輸入年齡:"))height = int(input("請輸入身高:"))if age>=18 and age<=30 and height >=170 and height <= 185 : print("恭喜,你符合報考飛行員的條件")else: print("抱歉,你不符合報考飛行員的條件")
1.邏輯運算子可以用來操作任何型別的表示式
Python 邏輯運算子可以用來操作任何型別的表示式,不管表示式是不是 bool 型別;同時,邏輯運算的結果也不一定是 bool 型別,它也可以是任意型別。請看下面的例子:
print(100 and 200)print(45 and 0)print("" or "https://fanyi.baidu.com/")print(18.5 or "https://fanyi.baidu.com/")
執行結果:
2000https://fanyi.baidu.com/18.5
本例中 and 和 or 運算子操作的都不是 bool 型別表示式,操作的結果也不是 bool 值。由此可見網路上某些Python教程關於邏輯運算子用於操作 bool 型別的表示式,執行結果也是 bool 型別的說法是完全錯誤的!
2.邏輯運算子的本質
在 Python 中,and 和 or 不一定會計算右邊表示式的值,有時候只計算左邊表示式的值就能得到最終結果。另外,and 和 or 運算子會將其中一個表示式的值作為最終結果,而不是將 True 或者 False 作為最終結果。以上兩點極其重要,瞭解這兩點不會讓你在使用邏輯運算的過程中產生疑惑。對於 and 運算子,兩邊的值都為真時最終結果才為真,但是隻要其中有一個值為假,那麼最終結果就是假,所以 Python 按照下面的規則執行 and 運算:
如果左邊表示式的值為假,那麼就不用計算右邊表示式的值了,因為不管右邊表示式的值是什麼,都不會影響最終結果,最終結果都是假,此時 and 會把左邊表示式的值作為最終結果。如果左邊表示式的值為真,那麼最終值是不能確定的,and 會繼續計算右邊表示式的值,並將右邊表示式的值作為最終結果。對於 or 運算子,情況是類似的,兩邊的值都為假時最終結果才為假,只要其中有一個值為真,那麼最終結果就是真,所以 Python 按照下面的規則執行 or 運算:
如果左邊表示式的值為真,那麼就不用計算右邊表示式的值了,因為不管右邊表示式的值是什麼,都不會影響最終結果,最終結果都是真,此時 or 會把左邊表示式的值作為最終結果。如果左邊表示式的值為假,那麼最終值是不能確定的,or 會繼續計算右邊表示式的值,並將右邊表示式的值作為最終結果。(五)while迴圈:
while迴圈的語法格式如下:
[init_statements]while test_expression : body_statements [iteration_statements]
while 迴圈在每次執行迴圈體之前,都要先對 test_expression 迴圈條件求值,如果迴圈條件為真,則執行迴圈體部分。從上面的語法格式來看,迭代語句 iteration_statements 總是位於迴圈體的最後,因此只有當迴圈體能成功執行完成時,while 迴圈才會執行迭代語句 iteration_statements。從這個意義上看,while 迴圈也可被當成分支語句使用,即如果 test_expression 條件一開始就為假,則迴圈體部分將永遠不會獲得執行的機會。
用一個簡單的例子:
number=1 #while迴圈的初始化條件=[init_statements]while number <= 10: #當number小於10的時候,開始執行迴圈體=test_expression print('number:',number) =body_statements number += 1 #迭代語句=[iteration_statements]print('迴圈結束!')
在使用 while 迴圈時,一定要保證迴圈條件有變成假的時候:否則這個迴圈將成為一個死迴圈,永遠無法結束這個迴圈。例如如下程式碼:
number=1while number <= 10: print('number:',number) number -= 1print('迴圈結束')
在上面程式碼中,number 的值越來越小,這將導致 number 的值永遠小於 10,number<10 迴圈條件一直為 True,從而導致這個迴圈永遠無法結束。
與前面介紹分支語句類似的是,while 迴圈的迴圈體中所有程式碼必須使用相同的縮排,否則 Python 也會引發錯誤。例如如下程式:
# 迴圈的初始化條件count_i = 0# 當count小於10時,執行迴圈體while count_i < 10: print('count_i的值', count_i)count_i += 1
執行上面程式,將會看到執行一個死迴圈。這是由於 count_i += 1 程式碼沒有縮排,這行程式碼就不屬於迴圈體。這樣程式中的 count_1 將一直是 0,從而導致 count_i < 10 一直都是 True,因此該迴圈就變成了一個死迴圈。
總結:關於while迴圈,主要屬於邏輯方面的內容,如果你邏輯思維足夠好,上面關於while迴圈的解釋已經能滿足你while迴圈基礎使用方法的需求。如果你邏輯思維夠嗆,上面的解釋還不能讓你完全理解while迴圈,那麼你需要結合其他人關於Python的while迴圈的解釋來加以理解,但總的來說,自我練習才是最重要的。
下面是while迴圈基礎應用的一個核心例項,利用while迴圈實現九九乘法表: