在代碼開發(fā)的過(guò)程中,條件判斷、控制語(yǔ)句是必不可少的內(nèi)容。它支撐起了整個(gè)開發(fā)項(xiàng)目的許多細(xì)節(jié)。比如單單在登錄模塊中,我們就需要:
1、判斷賬號(hào)密碼的輸入是否符合規(guī)范;
2、判斷賬號(hào)密碼的值是否正確;
3、根據(jù)不同的賬號(hào)密碼輸入狀況去給與相應(yīng)的提示或者繼續(xù)不同的邏輯操作(如登錄、報(bào)錯(cuò)等);
4、登錄后我們需要跳轉(zhuǎn)的頁(yè)面、需要展示的內(nèi)容等等
那么,Python中的條件判斷是怎么樣的呢?
bool布爾變量
在說(shuō)條件判斷之前,我們需要先弄清Python中用什么來(lái)表示真、假、對(duì)、錯(cuò)、存在、不存在等等。
在Python中,我們使用bool來(lái)表示我們所需要的的結(jié)果是真還是假。這兒的真假,分別對(duì)應(yīng)了bool中的兩個(gè)值,True和False。True為真,F(xiàn)alse為假。(注意:在有的語(yǔ)言中,用YES表示真,NO表示假。Python中不能這么使用)
所以當(dāng)我們判斷條件的返回值時(shí),返回True的時(shí)候,表示當(dāng)前條件判斷成立;返回False的時(shí)候,表示當(dāng)前條件判斷不成立。
在bool中,還有一些情況來(lái)表示True或者False:
- Number不等于0,等于0的時(shí)候?yàn)镕alse,其余不管大于還是小于,一律是True
- String為空("")的情況下為False,但是String為空格的情況下" ",是True
- Set、List、Dictionary為空的時(shí)候?yàn)镕alse,不為空的時(shí)候?yàn)門rue。
邏輯運(yùn)算符
在條件判斷中,時(shí)常離不開邏輯運(yùn)算符。判斷大小、判斷相等、判斷成立條件、判斷是不是某個(gè)容器的一部分等等。
# 比較運(yùn)算符
a == b # a等于b(注意不能只用一個(gè)=,只用一個(gè)=是賦值運(yùn)算符)
a < b # a小于b
a > b # a大于b
a >= b # a大于等于b
b <= b # b小于等于a
a != b # a不等于b
# 同一性運(yùn)算符
a is b # a和b是同一個(gè)對(duì)象
a is not b # a和b不是同一個(gè)對(duì)象
# 成員運(yùn)算符
a in b # a是容器b里的成員
a not in b # a不是容器b里的成員
# 布爾運(yùn)算符(順序運(yùn)算符)
condition_a and condition_b
condition_a or condiction_b
注意,== 和 is 的區(qū)別:
- 實(shí)質(zhì)上來(lái)說(shuō),== 是比較運(yùn)算符,is 是同一性運(yùn)算符
- == 用來(lái)比較符號(hào)兩邊的對(duì)象的value是否相等
- is 用來(lái)比較兩邊對(duì)象的唯一身份標(biāo)識(shí)(內(nèi)存地址)是否一致,可用id()方法打印查看
注意,and 和 or 的區(qū)別
- 表達(dá)式從左至右運(yùn)算,若 or 左側(cè)邏輯值 為 True, 則不繼續(xù)校驗(yàn) or 右側(cè)的表達(dá)式。直接返回True
- 表達(dá)式從左至右運(yùn)算,若 and 左側(cè)邏輯值為True, 則繼續(xù)校驗(yàn) and 右側(cè)的表達(dá)式,反之則不繼續(xù)校驗(yàn)
- 如果判斷中的所有 and 都為真,則返回最后一個(gè)真值,如果存在假值,則返回第一個(gè)假值(不是返回False)
- 如果判斷中的 or 左側(cè)為真,則直接返回真值,如果都為假,則返回最后一個(gè)假值(不是返回False)
- and 的優(yōu)先級(jí)高于 or
斷言
斷言(Assert)的作用是,當(dāng)關(guān)鍵詞后邊的條件判定為假的時(shí)候,程序自動(dòng)崩潰且拋出AssertionError異常。
由上看來(lái),斷言為拋出異常導(dǎo)致程序崩潰,這對(duì)于程序的正常運(yùn)行是極為不友好的,那么我們?yōu)槭裁葱枰獢嘌阅兀?/p>
這是因?yàn)椋?dāng)我們才測(cè)試程序的時(shí)候,經(jīng)常為需要臨界值的判斷或者欲調(diào)用值的判斷。這個(gè)時(shí)候,如果傳入的值超過(guò)臨界值或者傳入的類型不對(duì)的時(shí)候,程序也有可能會(huì)崩潰且崩潰原因不易排查。這個(gè)時(shí)候,我們就可以用斷言輔以附加信息進(jìn)行先行排查,讓我們的程序在出發(fā)隱患點(diǎn)的時(shí)候先行拋出異常。
斷言一般用在確保程序中某一個(gè)條件一定為真或者符合規(guī)范才能讓程序正常工作的情況下。
也有可以校驗(yàn)錯(cuò)誤且不拋出異常的判斷語(yǔ)句,這邊則需要用到try/except
try/except:
try:
a = 10
b = 0
c = a/b
except Exception as error:
print(error)
上述語(yǔ)句是一個(gè)會(huì)導(dǎo)致程序崩潰的語(yǔ)句,因?yàn)樵跀?shù)學(xué)中的除法里,0不能當(dāng)除數(shù),所以運(yùn)行上述代碼的情況下,會(huì)因0而崩潰。
為了不使這邊的崩潰打斷程序的運(yùn)行,我們便使用try/except語(yǔ)句。使用該語(yǔ)句的情況下,即使出現(xiàn)會(huì)導(dǎo)致程序崩潰的情況也不會(huì)直接崩潰,而是會(huì)執(zhí)行我們except后的操作。
except 后的 Exception 值是可以替換的,Exception是一個(gè)包含了所有錯(cuò)誤異常的集合。當(dāng)我們不知道可能會(huì)發(fā)生什么錯(cuò)誤的情況下,我們便可以使用 Exception。
下面列舉了 Exception 中常用的一些錯(cuò)誤信息:
| 異常 | 描述 |
|---|---|
| NameError | 嘗試訪問(wèn)一個(gè)沒(méi)有申明的變量 |
| ZeroDivisionError | 除數(shù)為0 |
| SyntaxError | 語(yǔ)法錯(cuò)誤 |
| IndexError | 索引超出序列范圍 |
| KeyError | 請(qǐng)求一個(gè)不存在的字典關(guān)鍵字 |
| IOError | 輸入輸出錯(cuò)誤(比如你要讀的文件不存在) |
| AttributeError | 嘗試訪問(wèn)未知的對(duì)象屬性 |
| ValueError | 傳給函數(shù)的參數(shù)類型不正確,比如給int()函數(shù)傳入字符 |
控制語(yǔ)句
Python中的控制語(yǔ)句又叫流程控制語(yǔ)句,主要為if、elif、else語(yǔ)句、while...else語(yǔ)句和for語(yǔ)句
if、elif、else語(yǔ)句
Python中的if、elif、else語(yǔ)句很經(jīng)常搭配一起使用。主要用在條件判斷、多種條件判斷的場(chǎng)景下, 如:
login_person = input('請(qǐng)輸入您登陸的身份')
if login_person == 'teacher':
pass
elif login_person == 'student':
pass
else login_person == 'admin':
pass
因?yàn)镻ython中沒(méi)有switch的用法,所以當(dāng)我們用到多種條件判斷的時(shí)候,就需要用到if...elif...else的組合。這兒的elif就相當(dāng)于我們其他于語(yǔ)言里的else if,可能是Python的創(chuàng)造者為了偷懶,就寫成了elif的樣子。
注意:if、elif、else后的“:”一定要記得寫,且是寫英文的“:”。
當(dāng)我們需要多次執(zhí)行一行代碼或者一個(gè)代碼塊的代碼時(shí),可以使用循環(huán)語(yǔ)句。Python中提供的循環(huán)語(yǔ)句有while語(yǔ)句和for語(yǔ)句,另外再輔以break、continue、pass來(lái)完成整個(gè)循環(huán)。(注意:Python中沒(méi)有do...while語(yǔ)句)
while...else
count = 0
while count < 100:
print(count)
count += 1
else:
print('count end')
當(dāng)給定的判斷條件的值為真的時(shí)候,便會(huì)一直執(zhí)行while循環(huán)體中的代碼。直到判斷條件值為假的時(shí)候才會(huì)跳出循環(huán),然后執(zhí)行else中的語(yǔ)句(如果else語(yǔ)句存在)。
注意:
- else語(yǔ)句不一定非得添加,根據(jù)實(shí)際需求使用
- while語(yǔ)句千萬(wàn)不要用一直為真的判斷語(yǔ)句,如直接用True,除非搭配break使用
- 當(dāng)while循環(huán)被break中斷的時(shí)候,else中的語(yǔ)句不會(huì)執(zhí)行
for
names = ['Jim', 'Tim', 'Tom', 'John']
for name in names :
print(name)
for循環(huán)通常用于遍歷有序數(shù)據(jù)類型(如list、tuple、range、str)、集合和字典。for的用法如上所示,可以直接放入一個(gè)要遍歷的對(duì)象。同時(shí)for循環(huán)也可放入range用index迭代,如下:
names = ['Jim', 'Tim', 'Tom', 'John']
for index in range(len(names)) :
print(names[index])
for也可以與else搭配使用,具體用法與while...else一致。
break、continue、pass、exit()
- break:執(zhí)行break語(yǔ)句的時(shí)候,會(huì)直接終止整個(gè)循環(huán)且跳出整個(gè)循環(huán)體
- continue:執(zhí)行continue語(yǔ)句的時(shí)候,不會(huì)終止整個(gè)循環(huán),只會(huì)跳出當(dāng)前這一步的循環(huán)不執(zhí)行,進(jìn)而執(zhí)行下一步的循環(huán)
- pass:不會(huì)做任何操作,只起到占位的作用,讓系統(tǒng)不崩潰
- exit():會(huì)結(jié)束整個(gè)程序(慎用)