if 分支使用布爾表達(dá)式或布爾值作為分支條件來(lái)進(jìn)行分支控制。Python 的 if 分支既可作為語(yǔ)句使用场航,也可作為表達(dá)式使用。下面先介紹 if 分支作為語(yǔ)句使用的情形。
if 語(yǔ)句可使用任意表達(dá)式作為分支條件來(lái)進(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í)行過(guò)程是非常簡(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)的多行代碼被稱(chēng)為代碼塊题篷,一個(gè)代碼塊通常被當(dāng)成一個(gè)整體來(lái)執(zhí)行(除非在運(yùn)行過(guò)程中遇到return皂甘、break、continue等關(guān)鍵字)悼凑,因此這個(gè)代碼塊也被稱(chēng)為條件執(zhí)行體偿枕。
Python是一門(mén)很“獨(dú)特”的語(yǔ)言,它的代碼塊是通過(guò)縮進(jìn)來(lái)標(biāo)記的(大部分語(yǔ)言都使用花括號(hào)或 end 作為代碼塊的標(biāo)記)户辫,具有相同縮進(jìn)的多行代碼屬于同一個(gè)代碼塊渐夸。如果代碼莫名其妙地亂縮進(jìn),Python 解釋器會(huì)報(bào)錯(cuò)(前文說(shuō)過(guò)渔欢,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,則程序沒(méi)有任何輸出九榔,整體縮進(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 條件下就沒(méi)有受控制的代碼塊了缰冤。因此槽袄,上面程序執(zhí)行時(shí)會(huì)報(bào)出如下錯(cuò)誤:
IndentationError:?expected?an?indented?block
if 條件后的條件執(zhí)行體一定要縮進(jìn)。只有縮進(jìn)后的代碼才能算條件執(zhí)行體锋谐。
接下來(lái)讀者會(huì)產(chǎn)生一個(gè)疑問(wèn):代碼塊(條件執(zhí)行體)到底要縮進(jìn)多少呢?這個(gè)隨意截酷。你可以縮進(jìn) 1 個(gè)空格涮拗、2 個(gè)空格、3 個(gè)空格…… 或 1 個(gè) Tab 位迂苛,這都是符合語(yǔ)法要求的三热。但從編程習(xí)慣來(lái)看,Python 通常建議縮進(jìn) 4 個(gè)空格三幻。
有些時(shí)候就漾,Python 解釋器不會(huì)報(bào)錯(cuò),但并不代表程序沒(méi)有錯(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)行過(guò)程:
請(qǐng)輸入您的年齡:12
20歲以上的人應(yīng)該學(xué)會(huì)承擔(dān)責(zé)任...
從運(yùn)行過(guò)程可以看出首妖,我們輸入的年齡明明小于20,但運(yùn)行結(jié)果還是會(huì)打印“20歲以上…”爷恳。這是為什么呢有缆?就是因?yàn)檫@條 print 語(yǔ)句沒(méi)有縮進(jìn)。如果這行代碼不縮進(jìn)温亲,那么 Python 就不會(huì)把這行代碼當(dāng)成條件執(zhí)行體棚壁,它就不受 if? 條件的控制,因此無(wú)論用戶(hù)輸入什么年齡栈虚,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)檫@行代碼沒(méi)有縮進(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ò)誤』氪耍看下面代碼:
#?定義變量c累颂,并為其賦值
c?=?5
if?c?>?4:
#?如果c>4,則執(zhí)行下面的執(zhí)行體凛俱,將只有c--一行代碼為執(zhí)行體
c?-=?1
#?下面是一行普通代碼紊馏,不屬于執(zhí)行體
print("c大于4")
#?此處的else將沒(méi)有if語(yǔ)句,因此編譯出錯(cuò)
else
#?否則蒲犬,執(zhí)行下面的執(zhí)行體瘦棋,只有一行代碼作為代碼塊
print("c不大于4")
在上面代碼中,因?yàn)?if 后的條件執(zhí)行體的最后一條語(yǔ)句沒(méi)有縮進(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ǔ)句沒(méi)有if語(yǔ)句达布,引發(fā)編譯錯(cuò)誤团甲。
運(yùn)行上面代碼,將看到如下錯(cuò)誤:
SyntaxError?:?invalid?syntax
不要隨意縮進(jìn)
需要說(shuō)明的是黍聂,雖然 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)卡尺笑話的由來(lái))愈诚,因此 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
通過(guò)上面介紹可以看出陵刹,Python 代碼塊中的所有語(yǔ)句必須保持相同的縮進(jìn),既不能多欢嘿,也不能少衰琐。
不要遺忘冒號(hào)
從 Python 語(yǔ)法解釋器的角度來(lái)看,Python 冒號(hào)精確表示代碼塊的開(kāi)始點(diǎn)這個(gè)功能不僅在條件執(zhí)行體中如此际插,后面的循環(huán)體、方法體显设、類(lèi)體全部遵守該規(guī)則框弛。
如果程序遺忘了冒號(hào),那么 Python 解釋器就無(wú)法識(shí)別代碼塊的開(kāi)始點(diǎn)捕捂。例如如下程序:
age?=?24
if?age?>?20
print("年齡已經(jīng)大于20歲了")
print("20歲以上的人應(yīng)該學(xué)會(huì)承擔(dān)責(zé)任...")
上面 if 條件后忘了寫(xiě)冒號(hào)瑟枫,因此 Python 就不知道條件執(zhí)行體的開(kāi)始點(diǎn)。運(yùn)行上面程序指攒,將會(huì)報(bào)出如下錯(cuò)誤:
SyntaxError?:?invalid?syntax
if 條件的類(lèi)型
從前面的示例可以看到慷妙,Python 執(zhí)行 if 語(yǔ)句時(shí),會(huì)判斷 if 條件是 True 還是 False 允悦。那么 if 條件是不是只能使用 bool 類(lèi)型的表達(dá)式呢膝擂?
不是。if 條件可以是任意類(lèi)型隙弛,當(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 類(lèi)型佳鳖、list 類(lèi)型霍殴、dict 類(lèi)型,由于這些 str系吩、list来庭、dict 都是空值,因此 Python 會(huì)把它們當(dāng)成 False 處理穿挨。