新聞中心
if 分支使用布爾表達(dá)式或布爾值作為分支條件來進(jìn)行分支控制。Python 的 if 分支既可作為語(yǔ)句使用,也可作為表達(dá)式使用。下面先介紹 if 分支作為語(yǔ)句使用的情形。

江山網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,江山網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為江山上1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的江山做網(wǎng)站的公司定做!
if 語(yǔ)句可使用任意表達(dá)式作為分支條件來進(jìn)行分支控制。Python 的 if 語(yǔ)句有如下三種形式:
第一種形式:
if expression: statements...
第二種形式:
if expression statements... else: statements...
第三種形式:
if expression: statements... elif expression: statements... ...//可以有零條或多條elif語(yǔ)句 else: statement...
在上面 if 語(yǔ)句的三種形式中,第二種形式和第三種形式是相通的,如果第三種形式中的 elif 塊不出現(xiàn),則變成了第二種形式。
對(duì)于上面的 if 分支語(yǔ)句,執(zhí)行過程是非常簡(jiǎn)單的,即如果 if 條件為“真”,程序就會(huì)執(zhí)行 if 條件后面的多條語(yǔ)句;否則就會(huì)依次判斷 elif 條件,如果 elif 條件為“真”,程序就會(huì)執(zhí)行 elif 條件后面的多條語(yǔ)句……如果前面所有條件都為“假”,程序就會(huì)執(zhí)行 else 后的代碼塊(如果有)。
在上面的條件語(yǔ)句中,if expression:、elif expression:及 else:后縮進(jìn)的多行代碼被稱為代碼塊,一個(gè)代碼塊通常被當(dāng)成一個(gè)整體來執(zhí)行(除非在運(yùn)行過程中遇到return、break、continue等關(guān)鍵字),因此這個(gè)代碼塊也被稱為條件執(zhí)行體。
Python是一門很“獨(dú)特”的語(yǔ)言,它的代碼塊是通過縮進(jìn)來標(biāo)記的(大部分語(yǔ)言都使用花括號(hào)或 end 作為代碼塊的標(biāo)記),具有相同縮進(jìn)的多行代碼屬于同一個(gè)代碼塊。如果代碼莫名其妙地亂縮進(jìn),Python 解釋器會(huì)報(bào)錯(cuò)(前文說過,Python 不是格式自由的語(yǔ)言)。
例如如下程序:
s_age = input("請(qǐng)輸入您的年齡:")
age = int(s_age)
if age > 20 :
# 只有當(dāng)age > 20時(shí),下面用整體縮進(jìn)的代碼塊才會(huì)執(zhí)行
# 整體縮進(jìn)的語(yǔ)句是一個(gè)整體,要么一起執(zhí)行,要么一起不執(zhí)行
print("年齡已經(jīng)大于20歲了")
print("20歲以上的人應(yīng)該學(xué)會(huì)承擔(dān)責(zé)任...")運(yùn)行上面代碼,如果輸入年齡小于 20,將會(huì)看到如下運(yùn)行結(jié)果:
請(qǐng)輸入您的年齡:18
從上面代碼可以看出,如果輸入的年齡小于 20,則程序沒有任何輸出,整體縮進(jìn)的語(yǔ)句作為整體都不會(huì)執(zhí)行。
運(yùn)行上面代碼,如果輸入年齡大于 20,將會(huì)看到如下運(yùn)行結(jié)果:
請(qǐng)輸入您的年齡:24 年齡已經(jīng)大于20歲了 20歲以上的人應(yīng)該學(xué)會(huì)承擔(dān)責(zé)任...
從上面代碼可以看出,如果輸入的年齡大于 20 ,則程序會(huì)執(zhí)行整體縮進(jìn)的代碼塊。
代碼塊一定要縮進(jìn),否則就不是代碼塊。例如如下程序:
s_age = input("請(qǐng)輸入您的年齡:")
age = int(s_age)
if age > 20 :
print("年齡已經(jīng)大于20歲了")上面程序的 if 條件與下面的 print 語(yǔ)句位于同一條豎線上,這樣在 if 條件下就沒有受控制的代碼塊了。因此,上面程序執(zhí)行時(shí)會(huì)報(bào)出如下錯(cuò)誤:
IndentationError: expected an indented block
if 條件后的條件執(zhí)行體一定要縮進(jìn)。只有縮進(jìn)后的代碼才能算條件執(zhí)行體。
接下來讀者會(huì)產(chǎn)生一個(gè)疑問:代碼塊(條件執(zhí)行體)到底要縮進(jìn)多少呢?這個(gè)隨意。你可以縮進(jìn) 1 個(gè)空格、2 個(gè)空格、3 個(gè)空格…… 或 1 個(gè) Tab 位,這都是符合語(yǔ)法要求的。但從編程習(xí)慣來看,Python 通常建議縮進(jìn) 4 個(gè)空格。
有些時(shí)候,Python 解釋器不會(huì)報(bào)錯(cuò),但并不代表程序沒有錯(cuò)誤。例如如下代碼:
s_age = input("請(qǐng)輸入您的年齡:")
age = int(s_age)
if age > 20 :
print("年齡已經(jīng)大于20歲了")
print("20歲以上的人應(yīng)該學(xué)會(huì)承擔(dān)責(zé)任...")解釋執(zhí)行上面程序,程序不會(huì)報(bào)任何錯(cuò)誤。但如果輸入一個(gè)小于 20 的年齡,則可看到如下運(yùn)行過程:
請(qǐng)輸入您的年齡:12 20歲以上的人應(yīng)該學(xué)會(huì)承擔(dān)責(zé)任...
從運(yùn)行過程可以看出,我們輸入的年齡明明小于20,但運(yùn)行結(jié)果還是會(huì)打印“20歲以上…”。這是為什么呢?就是因?yàn)檫@條 print 語(yǔ)句沒有縮進(jìn)。如果這行代碼不縮進(jìn),那么 Python 就不會(huì)把這行代碼當(dāng)成條件執(zhí)行體,它就不受 if 條件的控制,因此無(wú)論用戶輸入什么年齡,print 語(yǔ)句總會(huì)執(zhí)行。
如果忘記正確地縮進(jìn),很可能導(dǎo)致程序的運(yùn)行結(jié)果超出我們的預(yù)期。例如如下程序:
#定義變量b,并為其賦值
b = 5
if b > 4 :
#如果b>4,則執(zhí)行下面的條件執(zhí)行體,只有一行代碼作為代碼塊
print("b大于4")
else:
#否則,執(zhí)行下面的條件執(zhí)行體,只有一行代碼作為代碼塊
b -= 1
#對(duì)于下面代碼而言,它己經(jīng)不再是條件執(zhí)行體的一部分,因此總會(huì)執(zhí)行
print("b不大于4")上面代碼中,最后一行代碼總會(huì)執(zhí)行,因?yàn)檫@行代碼沒有縮進(jìn),因此它就不屬于 else 后的條件執(zhí)行體,else 后的條件執(zhí)行體只有 b -= 1 這一行代碼。
如果要讓 print("b不大于4") 語(yǔ)句也處于 else 控制之下,則需要讓這行代碼也縮進(jìn) 4 個(gè)空格。
if、else、elif 后的條件執(zhí)行體必須使用相同縮進(jìn)的代碼塊,將這個(gè)代碼塊整體作為條件執(zhí)行體。當(dāng)if后有多條語(yǔ)句作為條件執(zhí)行體時(shí),如果忘記了縮進(jìn)某一行代碼,則會(huì)引起語(yǔ)法錯(cuò)誤??聪旅娲a:
# 定義變量c,并為其賦值
c = 5
if c > 4:
# 如果c>4,則執(zhí)行下面的執(zhí)行體,將只有c--一行代碼為執(zhí)行體
c -= 1
# 下面是一行普通代碼,不屬于執(zhí)行體
print("c大于4")
# 此處的else將沒有if語(yǔ)句,因此編譯出錯(cuò)
else
# 否則,執(zhí)行下面的執(zhí)行體,只有一行代碼作為代碼塊
print("c不大于4")在上面代碼中,因?yàn)?if 后的條件執(zhí)行體的最后一條語(yǔ)句沒有縮進(jìn),所以系統(tǒng)只把 c-= 1 一行代碼作為條件執(zhí)行體,當(dāng) c-=1 語(yǔ)句執(zhí)行結(jié)束后,if 語(yǔ)句也就執(zhí)行結(jié)束了。后面的 print("c大于4") 己經(jīng)是一行普通代碼,不再屬于條件執(zhí)行體,從而導(dǎo)致 else 語(yǔ)句沒有if語(yǔ)句,引發(fā)編譯錯(cuò)誤。
運(yùn)行上面代碼,將看到如下錯(cuò)誤:
SyntaxError : invalid syntax
不要隨意縮進(jìn)
需要說明的是,雖然 Python 語(yǔ)法允許代碼塊隨意縮進(jìn) N 個(gè)空格,但同一個(gè)代碼塊內(nèi)的代碼必須保持相同的縮進(jìn),不能一會(huì)縮進(jìn) 2 個(gè)空格,一會(huì)縮進(jìn) 4 個(gè)空格。
例如如下代碼:
s_age = input("請(qǐng)輸入您的年齡:")
age = int(s_age)
if age > 20 :
print("年齡已經(jīng)大于20歲了")
print("20歲以上的人應(yīng)該學(xué)會(huì)承擔(dān)責(zé)任...")上面程序中第 2 個(gè) print 語(yǔ)句縮進(jìn)了 5 個(gè)空格,在這樣的情況下,Python 解釋器認(rèn)為這條語(yǔ)句與前一條語(yǔ)句(縮進(jìn)了 4 個(gè)空格)不是同一個(gè)代碼塊(這就是游標(biāo)卡尺笑話的由來),因此 Python 解釋器會(huì)報(bào)錯(cuò)。運(yùn)行上面代碼,將會(huì)報(bào)出如下錯(cuò)誤:
IndentationError : unexpected indent
把代碼改為如下形式:
s_age = input("請(qǐng)輸入您的年齡:")
age = int(s_age)
if age > 20 :
print("年齡已經(jīng)大于20歲了")
print("20歲以上的人應(yīng)該學(xué)會(huì)承擔(dān)責(zé)任...")上面程序中第二條 print 語(yǔ)句只縮進(jìn)了 3 個(gè)空格,它與前一條 print 語(yǔ)句(縮進(jìn)了 4 個(gè)空格)同樣不屬于同一個(gè)代碼塊,因此 Python 解釋器還是會(huì)報(bào)錯(cuò)。運(yùn)行上面代碼,則會(huì)報(bào)出如下錯(cuò)誤:
IndentationError: unindent does not match any outer indentation level
通過上面介紹可以看出,Python 代碼塊中的所有語(yǔ)句必須保持相同的縮進(jìn),既不能多,也不能少。
不要遺忘冒號(hào)
從 Python 語(yǔ)法解釋器的角度來看,Python 冒號(hào)精確表示代碼塊的開始點(diǎn)這個(gè)功能不僅在條件執(zhí)行體中如此,后面的循環(huán)體、方法體、類體全部遵守該規(guī)則。
如果程序遺忘了冒號(hào),那么 Python 解釋器就無(wú)法識(shí)別代碼塊的開始點(diǎn)。例如如下程序:
age = 24
if age > 20
print("年齡已經(jīng)大于20歲了")
print("20歲以上的人應(yīng)該學(xué)會(huì)承擔(dān)責(zé)任...")上面 if 條件后忘了寫冒號(hào),因此 Python 就不知道條件執(zhí)行體的開始點(diǎn)。運(yùn)行上面程序,將會(huì)報(bào)出如下錯(cuò)誤:
SyntaxError : invalid syntax
if 條件的類型
從前面的示例可以看到,Python 執(zhí)行 if 語(yǔ)句時(shí),會(huì)判斷 if 條件是 True 還是 False 。那么 if 條件是不是只能使用 bool 類型的表達(dá)式呢?
不是。if 條件可以是任意類型,當(dāng)下面的值作為 bool 表達(dá)式時(shí),會(huì)被解釋器當(dāng)作 False 處理:
False、None、0、""、()、[]、{}從上面介紹可以看出,除了 False 本身,各種代表“空”的 None、空字符串、空元組、空列表、空字典都會(huì)被當(dāng)成 False 處理。
例如如下代碼:
s = ""
if s :
print('s不是空字符串')
else:
print('s是空字符串')
# 定義空列表
my_list = []
if my_list:
print('my_list不是空列表')
else:
print('my_list是空列表')
# 定義空字典
my_dict = {}
if my_dict:
print('my_dict不是空字典')
else:
print('my_dict是空字典')從上面的粗體字代碼可以看出,這些 if 條件分別使用了 str 類型、list 類型、dict 類型,由于這些 str、list、dict 都是空值,因此 Python 會(huì)把它們當(dāng)成 False 處理。
文章題目:創(chuàng)新互聯(lián)Python教程:Pythonifelse條件語(yǔ)句詳解
地址分享:http://www.dlmjj.cn/article/cdgdjoo.html


咨詢
建站咨詢
