在代碼開發(fā)的過程中狼荞,條件判斷辽装、控制語(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布爾變量
在說條件判斷之前加袋,我們需要先弄清Python中用什么來表示真、假抱既、對(duì)职烧、錯(cuò)、存在蝙砌、不存在等等阳堕。
在Python中,我們使用bool來表示我們所需要的的結(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中,還有一些情況來表示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ì)上來說,== 是比較運(yùn)算符扛或,is 是同一性運(yùn)算符
- == 用來比較符號(hào)兩邊的對(duì)象的value是否相等
- is 用來比較兩邊對(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異常赵誓。
由上看來,斷言為拋出異常導(dǎo)致程序崩潰柿赊,這對(duì)于程序的正常運(yùn)行是極為不友好的俩功,那么我們?yōu)槭裁葱枰獢嘌阅兀?/p>
這是因?yàn)椋?dāng)我們才測(cè)試程序的時(shí)候闹瞧,經(jīng)常為需要臨界值的判斷或者欲調(diào)用值的判斷绑雄。這個(gè)時(shí)候,如果傳入的值超過臨界值或者傳入的類型不對(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 | 嘗試訪問一個(gè)沒有申明的變量 |
ZeroDivisionError | 除數(shù)為0 |
SyntaxError | 語(yǔ)法錯(cuò)誤 |
IndexError | 索引超出序列范圍 |
KeyError | 請(qǐng)求一個(gè)不存在的字典關(guān)鍵字 |
IOError | 輸入輸出錯(cuò)誤(比如你要讀的文件不存在) |
AttributeError | 嘗試訪問未知的對(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中沒有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來完成整個(gè)循環(huán)搅裙。(注意:Python中沒有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ǔ)句千萬不要用一直為真的判斷語(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è)程序(慎用)