溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python從菜鳥(niǎo)到高手(9):條件和條件語(yǔ)句

發(fā)布時(shí)間:2020-06-30 09:02:21 來(lái)源:網(wǎng)絡(luò) 閱讀:1956 作者:androidguy 欄目:編程語(yǔ)言

1.布爾(Boolean)值和布爾變量

??在講條件語(yǔ)句之前,首先應(yīng)該了解一下布爾類(lèi)型。條件語(yǔ)句(if)需要為其指定布爾值或布爾類(lèi)型的變量,才能根據(jù)條件判斷是否要指定代碼塊中的語(yǔ)句。布爾值只有兩個(gè)值:True和False,可以將這兩個(gè)值翻譯成“真”和“假”。

??現(xiàn)在我們已經(jīng)了解了布爾值是用來(lái)做什么的,但Python語(yǔ)言會(huì)將哪些值看做布爾值呢?其實(shí)在Python語(yǔ)言中,每一種類(lèi)型的值都可以被解釋成布爾類(lèi)型的值。例如,下面的值都會(huì)被解釋成布爾值中的False。

None  0  ""  ()  []  {}

??這些值所涉及到的數(shù)據(jù)類(lèi)型有一些我們到現(xiàn)在為止并沒(méi)有講過(guò)(例如,[]表示長(zhǎng)度為0的列表),不過(guò)讀者也不用擔(dān)心,在后面的章節(jié)會(huì)詳細(xì)講解這些數(shù)據(jù)類(lèi)型。

??如果在條件語(yǔ)句中使用上面的這些值,那么條件語(yǔ)句中的條件都會(huì)被解釋成False,也就是說(shuō),條件代碼塊中的語(yǔ)句不會(huì)被執(zhí)行。

??在Python語(yǔ)言底層,會(huì)將布爾值True 看做1,將布爾值False看做0,盡管從表面上看,True和1、False和0是完全不同的兩個(gè)值,但實(shí)際上,它們是相同的。我們可以在Python控制臺(tái)驗(yàn)證這一點(diǎn)。

>>> True == 1
True
>>> False == 0
True
>>> True + False + 20
21

??很明顯,我們可以直接將True看成1,F(xiàn)alse看成0,也可以直接將True和False當(dāng)成1和0用,所以True + False + 20的計(jì)算結(jié)果是21。

??另外,我們可以用bool函數(shù)將其他類(lèi)型的值轉(zhuǎn)換為布爾類(lèi)型的值。

>>> bool("")
False
>>> bool("Hello")
True
>>> bool([])
False
>>> bool([1,2,3])
True
>>> bool(20)
True
>>> bool('')
False

??我們可以看到,在前面給出的幾個(gè)會(huì)被系統(tǒng)認(rèn)為是False的值,通過(guò)bool函數(shù)的轉(zhuǎn)換,會(huì)變成真正的布爾值。不過(guò)這些值是不能直接和布爾值比較的,例如,不能直接使用“[] == false”,正確的做法是先用bool函數(shù)將其轉(zhuǎn)換為布爾值,然后再比較
bool([]) == false

??在前面的代碼中使用了“==”運(yùn)算符,這是邏輯運(yùn)算符,是二元運(yùn)算符,需要指定左右兩個(gè)操作數(shù)用于判斷兩個(gè)值是否相等,如果兩個(gè)操作數(shù)相等,運(yùn)算結(jié)果為T(mén)rue,否則為False。這個(gè)運(yùn)算符在后面的章節(jié)中會(huì)經(jīng)常用到,當(dāng)然,還有很多類(lèi)似的運(yùn)算符,在講解條件語(yǔ)句時(shí)會(huì)一起介紹。

2. 條件語(yǔ)句(if、else和elif)

??對(duì)于計(jì)算機(jī)程序來(lái)說(shuō),要學(xué)會(huì)的第一項(xiàng)技能就是“轉(zhuǎn)彎”,也就是根據(jù)不同的條件,執(zhí)行不同的程序分支,這樣的程序才有意義。

??if語(yǔ)句的作用就是為程序賦予這項(xiàng)“轉(zhuǎn)彎”的技能。使用if語(yǔ)句就需要用到在3.3節(jié)介紹的代碼塊。Python語(yǔ)言要求當(dāng)if語(yǔ)句的條件滿足時(shí)要執(zhí)行的代碼塊必須縮進(jìn)(一般是縮進(jìn)4個(gè)空格)。if語(yǔ)句的語(yǔ)法格式如下:

if logic expression:        #  if代碼塊開(kāi)始
    statement1
    statement2
    … …
    statementn
otherstatement              #  if代碼塊結(jié)束

??其中l(wèi)ogic expression表示邏輯表達(dá)式,也就是返回布爾類(lèi)型值(True或False)的表達(dá)式。由于Python語(yǔ)句的各種數(shù)據(jù)類(lèi)型都可以作為用作布爾類(lèi)型,所以logic expression可以看做是普通的表達(dá)式。根據(jù)代碼塊的規(guī)則,每一個(gè)代碼塊的開(kāi)始行的結(jié)尾要使用冒號(hào)(:),如果if代碼塊結(jié)束,就會(huì)退到代碼塊開(kāi)始行的縮進(jìn)量即可。

??下面是if語(yǔ)句的基本用法。

n = 3
if n == 3:
    print("n == 3")
print("if代碼塊結(jié)束")

??在上面這段代碼中,“n == 3”是邏輯表達(dá)式,本例中的值為T(mén)rue。而“print("n == 3")”是if代碼塊中的語(yǔ)句,由于“n == 3”的值為T(mén)rue,所以“print("n == 3")”會(huì)被執(zhí)行。最后一條語(yǔ)句不屬于if代碼塊,所以無(wú)論if語(yǔ)句的條件是否為T(mén)rue,這行代碼都會(huì)被執(zhí)行。

??對(duì)于條件語(yǔ)句來(lái)說(shuō),往往分支不只一個(gè)。例如,上面的代碼如果變量n的值是4,那么if語(yǔ)句的條件就為False,這時(shí)要執(zhí)行條件為False的分支,就可以使用else子句。

n = 4
if n == 3:
    print("n == 3")
else:
    print("n等于其他值")    
print("if代碼塊結(jié)束")

??在上面這段代碼中,n等于4,所以if語(yǔ)句的條件為False,因此else代碼塊中的語(yǔ)句會(huì)被執(zhí)行。if與else都是代碼塊,所以if語(yǔ)句和else語(yǔ)句后面都要以冒號(hào)(:)結(jié)尾。

??在多分支條件語(yǔ)句,需要使用elif子句設(shè)置更多的條件。elif后面跟邏輯表達(dá)式,elif也是代碼塊,所以后面要用冒號(hào)(:)結(jié)尾。另外,在if語(yǔ)句中,if和else部分只能有一個(gè),而elif部分可以有任意多個(gè)。

n = 4
if n == 3:
    print("n == 3")
elif n == 4:
    print("n == 4")
elif n == 5:
    print("n == 5")
else:
    print("n等于其他值")    
print("if代碼塊結(jié)束")

?? 本例通過(guò)raw_input函數(shù)從控制臺(tái)輸入一個(gè)名字,然后通過(guò)條件語(yǔ)句判斷名字以什么字母開(kāi)頭。


from click._compat import raw_input
name = raw_input("請(qǐng)輸入您的名字:")        #  從控制臺(tái)輸入名字
if name.startswith("B"):                #  if代碼塊
    print("名字以B開(kāi)頭")
elif name.startswith("F"):              #  elif代碼塊
    print("名字以F開(kāi)頭")
elif name.startswith("T"):              #  elif代碼塊
    print("名字以T開(kāi)頭")
else:                                   #  else代碼塊
    print("名字以其他字母開(kāi)頭")

??程序運(yùn)行結(jié)果如下圖所示。

Python從菜鳥(niǎo)到高手(9):條件和條件語(yǔ)句

3.嵌套代碼塊

??條件語(yǔ)句可以進(jìn)行嵌套,也就是說(shuō),在一個(gè)條件代碼塊中,可以有另外一個(gè)條件代碼塊。包含嵌套代碼塊B的代碼塊A可以稱為B的父代碼塊。嵌套代碼塊仍然需要在父代碼塊的基礎(chǔ)上增加縮進(jìn)量來(lái)放置自己的代碼塊。下面的例子會(huì)演示如何使用嵌套代碼塊進(jìn)行邏輯判斷。

??本例要求在Python控制臺(tái)輸入一個(gè)姓名,然后通過(guò)嵌套代碼塊中判斷輸入的姓名,根據(jù)判斷結(jié)果輸出結(jié)果。

name = input("你叫什么名字?")         #  從Python控制臺(tái)輸入一個(gè)字符串(姓名)
if  name.startswith("Bill"):            #  以Bill開(kāi)頭的姓名
    if name.endswith("Gates"):          #  以Gates結(jié)尾的姓名(嵌套代碼塊)
        print("歡迎Bill Gates先生")
    elif name.endswith("Clinton"):      #  以Clinton結(jié)尾的姓名
        print("歡迎克林頓先生")
    else:                               #  其他姓名
        print("未知姓名")
elif name.startswith("李"):              #  以“李”開(kāi)頭的姓名
    if name.endswith("寧"):              #  以“寧”結(jié)尾的姓名
        print("歡迎李寧老師")
    else:                               #  其他姓名
        print("未知姓名")
else:                                   #  其他姓名
    print("未知姓名")

程序運(yùn)行結(jié)果如下圖所示。

Python從菜鳥(niǎo)到高手(9):條件和條件語(yǔ)句

《Python從菜鳥(niǎo)到高手》開(kāi)始轉(zhuǎn)載了,敬請(qǐng)關(guān)注

Python從菜鳥(niǎo)到高手(9):條件和條件語(yǔ)句

4. 比較運(yùn)算符

??盡管if語(yǔ)句本身的知識(shí)到現(xiàn)在為止已經(jīng)全部講完了,不過(guò)我們的學(xué)習(xí)遠(yuǎn)沒(méi)有介紹。前面給出的if語(yǔ)句的條件都非常簡(jiǎn)單,但在實(shí)際應(yīng)用中,if語(yǔ)句的條件可能非常復(fù)雜,這就需要使用到本節(jié)要介紹的比較運(yùn)算符。
現(xiàn)在先來(lái)看看下表列出的Python語(yǔ)言中的比較運(yùn)算符。

Python從菜鳥(niǎo)到高手(9):條件和條件語(yǔ)句

??上標(biāo)描述的比較運(yùn)算符中,涉及到了對(duì)象和容器的概念,目前我們還沒(méi)講這些技術(shù),在本節(jié)讀者只需了解Python語(yǔ)言可以通過(guò)比較運(yùn)算符操作對(duì)象和容器即可,在后面介紹對(duì)象和容器的章節(jié),會(huì)詳細(xì)介紹如何利用相關(guān)比較運(yùn)算符操作對(duì)象和容器。

??在比較運(yùn)算符中,最常用的就是判斷兩個(gè)值是否相等,例如,a大于b,a等于b。這些運(yùn)算符包括“==”、“<”、“>”、“>=”、“<=”和“x != y”。
??如果比較兩個(gè)值是否相等,需要使用“==”運(yùn)算符,也就是兩個(gè)等號(hào)。

>>> "hello" == "hello"
True
>>> "Hello" == "hello"
False
>>> 30 == 10
False

??要注意,如果比較兩個(gè)字符串是否相等,會(huì)比較兩個(gè)字符串中對(duì)應(yīng)的每一個(gè)字母,所以“Hello”和“hello”并不相等,也就是說(shuō)比較運(yùn)算符是對(duì)大小寫(xiě)敏感的。

??在使用“==”運(yùn)算符時(shí)一定要注意,不要寫(xiě)成一個(gè)等號(hào)(=),否則就成賦值運(yùn)算符了,對(duì)于賦值運(yùn)算符來(lái)說(shuō),等號(hào)(=)左側(cè)必須是一個(gè)變量,否則會(huì)拋出異常。


>>> "hello" = "hello"               # 使用賦值運(yùn)算符,會(huì)拋出異常
  File "<stdin>", line 1
SyntaxError: can't assign to literal
>>> s = "hello"
>>> s
'hello'

??對(duì)于字符串、數(shù)值等類(lèi)型的值,也可以使用大于(>)、小于(<)等運(yùn)算符比較他們的大小。

>>> "hello" > "Hello"  
True
>>> 20 > 30
False
>>> s = 40
>>> s <= 30
False
>>> "hello" != "Hello"
True

??Python語(yǔ)言在比較字符串時(shí),會(huì)按字母ASCII順序進(jìn)行比較,例如,比較“hello”和“Hello”的大小。首先會(huì)比較'h'和'H'的大小,很明顯'h'的ASCII大于'H'的ASCII,所以后面的都不需要比較了,因此,"hello" > "Hello"的結(jié)果是True。

??如果一個(gè)字符串是另一個(gè)字符串的前綴,那么比較這兩個(gè)字符串,Python語(yǔ)言會(huì)認(rèn)為長(zhǎng)的字符串更大一些。

>>> "hello" < "hello world"
True

??除了比較大小的幾個(gè)運(yùn)算符外,還有用來(lái)確定兩個(gè)對(duì)象是否相等的運(yùn)算符,以及判斷某個(gè)值是否屬于一個(gè)容器的運(yùn)算符,盡管現(xiàn)在還沒(méi)有講到對(duì)象和容器,但這里不妨做一個(gè)實(shí)驗(yàn),來(lái)看看這些運(yùn)算符如何使用,以便以后學(xué)習(xí)對(duì)象和容器是,更容易掌握這些運(yùn)算符。

??用于判斷兩個(gè)對(duì)象是否相等的運(yùn)算符是is和is not,這兩個(gè)運(yùn)算符看起來(lái)和等于運(yùn)算符(==)差不多,不過(guò)用起來(lái)卻大有玄機(jī)。

>>> x = y = [1,2,3]
>>> z = [1,2,3]
>>> x == y
True
>>> x == z
True
>>> x is y
True
>>> x is z
False
>>> x is not z
True

??在上面的代碼中,使用“==”和“is”比較x和y時(shí)結(jié)果完全一樣,不過(guò)在比較x和z時(shí),就會(huì)體現(xiàn)出差異。x == z的結(jié)果是True,而x is z的結(jié)果卻是False。出現(xiàn)這樣的結(jié)果,原因是“==”運(yùn)算符比較的是對(duì)象的值,x和z的值都是一個(gè)列表(也可以將列表看做是一個(gè)對(duì)象),并且列表中的元素個(gè)數(shù)和值完全一樣,所以x == z的結(jié)果是True。但“is”運(yùn)算符用于判斷對(duì)象的同一性,也就是說(shuō),不僅對(duì)象的值要完全一樣,而且對(duì)象本身還要是同一個(gè)對(duì)象,很明顯,x和y是同一個(gè)對(duì)象,因?yàn)樵谫x值時(shí),先將一個(gè)列表賦給y,然后再將y的值賦給x,所以x和y指向了同一個(gè)對(duì)象,而z另外賦值了一個(gè)列表,所以z和x、y盡管值相同,但并不是指向的同一個(gè)對(duì)象,因此,x is z的結(jié)果就是False。

??判斷某個(gè)值是否屬于一個(gè)容器,要使用“in”和“not in”運(yùn)算符。下面的代碼首先定義一個(gè)列表變量x,然后判斷變量y和一些值是否屬于x。

>>> x = [1,2,3,4,5]     # 定義一個(gè)列表變量
>>> y = 3
>>> 1 in x
True
>>> y in x
True
>>> 20 in x
False
>>> 20 not in x
True

??“in”和“not in”運(yùn)算符也可以用于判斷一個(gè)字符串是否包含另外一個(gè)字符串,也就是說(shuō),可以將字符串看做字符或子字符串的容器。

>>> s = "hello world"
>>> 'e' in s
True
>>> "e" in s
True
>>> "x" in s
False
>>> "x" not in s
True
>>> "world"  in s
True

??如果遇到需要將多個(gè)邏輯表達(dá)式組合在一起的情況,需要用到邏輯與(and)、邏輯或(or)和邏輯非(not)。邏輯與的運(yùn)算規(guī)則是只有“x and y”中的x和y都為T(mén)rue時(shí),運(yùn)算結(jié)果才是True,否則為False。邏輯或的運(yùn)算規(guī)則是只有“x or y”中的x和y都為False時(shí),運(yùn)算結(jié)果才是False,否則都為T(mén)rue。邏輯非的運(yùn)算規(guī)則是“not x”中,x為T(mén)rue,運(yùn)算結(jié)果為False,x為False,運(yùn)算結(jié)果為T(mén)rue。

>>> 20 < 30 and 40 < 50
True
>>> 20 > 40 or 20 < 10
False
>>> not 20 > 40
True

??本例演示了比較運(yùn)算符的基本用法。

print(20 == 30)         #  判斷20和30是否相等,運(yùn)行結(jié)果:False   
x = 20
y = 40
print(x < y)                #  判斷x是否小于y,運(yùn)行結(jié)果:True
if x > y:                   #  條件不滿足
    print("x > y")
else:                       #  條件滿足
    print("x <= y")
s1 = "hello"
s2 = "Hello"
if s1 >= s2 and x > y:      # 條件不滿足
    print("滿足條件")
elif not s1 < s2:           # 條件滿足
    print("基本滿足條件")
else:                       # 條件不滿足
    print("不滿足條件")

程序運(yùn)行結(jié)果如下圖所示。

Python從菜鳥(niǎo)到高手(9):條件和條件語(yǔ)句

5. 斷言(Assertions)

??斷言的使用方式類(lèi)似于if語(yǔ)句,只是在不滿足條件時(shí),會(huì)直接拋出異常。類(lèi)似于下面的if語(yǔ)句(偽代碼)

if not dondition:       # 如果不滿足條件,會(huì)直接拋出異常,程序會(huì)中斷
    crash program

??那么究竟為什么需要這樣的代碼呢?主要是因?yàn)樾枰O(jiān)測(cè)程序在某個(gè)地方是否滿足條件,如果不滿足條件,應(yīng)該及時(shí)通知開(kāi)發(fā)人員,而不是將這些bug隱藏起來(lái),直到關(guān)鍵的時(shí)刻再崩潰。

??其實(shí)在TDD(Test-driven development,測(cè)試驅(qū)動(dòng)開(kāi)發(fā) )中經(jīng)常使用斷言,TDD會(huì)在程序發(fā)現(xiàn)異常時(shí)執(zhí)行斷言,并拋出異常。
在Python語(yǔ)言中,斷言需要使用assert語(yǔ)句,在assert關(guān)鍵字的后面指定斷言的條件表達(dá)式。如果條件表達(dá)式的值是False,那么就會(huì)拋出異常。而且斷言后面的語(yǔ)句都不會(huì)被執(zhí)行,相當(dāng)于程序的一個(gè)斷點(diǎn)。

>>> value = 20
>>> assert value < 10 or value > 30     # 條件不滿足,會(huì)拋出異常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError
>>> assert value < 30                   #  條件滿足,會(huì)正常執(zhí)行后面的語(yǔ)句

??我們可以看到,value變量的值是20,而assert后面的條件是“value < 10 or value > 30”,很明顯,條件不滿足,所以在斷言處會(huì)拋出異常。而后面的斷言,條件是“value < 30”,這個(gè)條件是滿足的,所以在斷言后面的語(yǔ)句都會(huì)正常執(zhí)行。

??當(dāng)斷言條件不滿足時(shí)拋出異常,在默認(rèn)情況下,只顯示了拋出異常的位置,并沒(méi)有顯示因?yàn)槭裁磼伋霎惓?,所以為了異常信息更明確,可以為assert語(yǔ)句指定異常描述。

>>> value = 20
>>> assert value < 10 or value > 30, 'value值必須在10和20之間' # 為斷言指定異常描述信息
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AssertionError: value值必須在10和20之間            # 顯示了異常描述信息

本例演示了斷言的用法。

name = "Bill"                           #  定義變量name
assert name == "Bill"                   #  斷言條件表達(dá)式的值是True,繼續(xù)執(zhí)行下面的語(yǔ)句

age = 20                                #  定義變量age
#  斷言條件表達(dá)式的值是False,拋出異常,后面的代碼不會(huì)被執(zhí)行
assert 0 < age < 10, "年齡必須小于10歲"    

print("hello world")        # 這行代碼不會(huì)被執(zhí)行

程序運(yùn)行結(jié)果如下圖所示。

Python從菜鳥(niǎo)到高手(9):條件和條件語(yǔ)句

《Python從菜鳥(niǎo)到高手》已經(jīng)出版,開(kāi)始連載了,購(gòu)買(mǎi)送視頻課程

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI