您好,登錄后才能下訂單哦!
??在講條件語句之前,首先應該了解一下布爾類型。條件語句(if)需要為其指定布爾值或布爾類型的變量,才能根據條件判斷是否要指定代碼塊中的語句。布爾值只有兩個值:True和False,可以將這兩個值翻譯成“真”和“假”。
??現在我們已經了解了布爾值是用來做什么的,但Python語言會將哪些值看做布爾值呢?其實在Python語言中,每一種類型的值都可以被解釋成布爾類型的值。例如,下面的值都會被解釋成布爾值中的False。
None 0 "" () [] {}
??這些值所涉及到的數據類型有一些我們到現在為止并沒有講過(例如,[]表示長度為0的列表),不過讀者也不用擔心,在后面的章節會詳細講解這些數據類型。
??如果在條件語句中使用上面的這些值,那么條件語句中的條件都會被解釋成False,也就是說,條件代碼塊中的語句不會被執行。
??在Python語言底層,會將布爾值True 看做1,將布爾值False看做0,盡管從表面上看,True和1、False和0是完全不同的兩個值,但實際上,它們是相同的。我們可以在Python控制臺驗證這一點。
>>> True == 1
True
>>> False == 0
True
>>> True + False + 20
21
??很明顯,我們可以直接將True看成1,False看成0,也可以直接將True和False當成1和0用,所以True + False + 20的計算結果是21。
??另外,我們可以用bool函數將其他類型的值轉換為布爾類型的值。
>>> bool("")
False
>>> bool("Hello")
True
>>> bool([])
False
>>> bool([1,2,3])
True
>>> bool(20)
True
>>> bool('')
False
??我們可以看到,在前面給出的幾個會被系統認為是False的值,通過bool函數的轉換,會變成真正的布爾值。不過這些值是不能直接和布爾值比較的,例如,不能直接使用“[] == false”,正確的做法是先用bool函數將其轉換為布爾值,然后再比較
bool([]) == false
??在前面的代碼中使用了“==”運算符,這是邏輯運算符,是二元運算符,需要指定左右兩個操作數用于判斷兩個值是否相等,如果兩個操作數相等,運算結果為True,否則為False。這個運算符在后面的章節中會經常用到,當然,還有很多類似的運算符,在講解條件語句時會一起介紹。
??對于計算機程序來說,要學會的第一項技能就是“轉彎”,也就是根據不同的條件,執行不同的程序分支,這樣的程序才有意義。
??if語句的作用就是為程序賦予這項“轉彎”的技能。使用if語句就需要用到在3.3節介紹的代碼塊。Python語言要求當if語句的條件滿足時要執行的代碼塊必須縮進(一般是縮進4個空格)。if語句的語法格式如下:
if logic expression: # if代碼塊開始
statement1
statement2
… …
statementn
otherstatement # if代碼塊結束
??其中logic expression表示邏輯表達式,也就是返回布爾類型值(True或False)的表達式。由于Python語句的各種數據類型都可以作為用作布爾類型,所以logic expression可以看做是普通的表達式。根據代碼塊的規則,每一個代碼塊的開始行的結尾要使用冒號(:),如果if代碼塊結束,就會退到代碼塊開始行的縮進量即可。
??下面是if語句的基本用法。
n = 3
if n == 3:
print("n == 3")
print("if代碼塊結束")
??在上面這段代碼中,“n == 3”是邏輯表達式,本例中的值為True。而“print("n == 3")”是if代碼塊中的語句,由于“n == 3”的值為True,所以“print("n == 3")”會被執行。最后一條語句不屬于if代碼塊,所以無論if語句的條件是否為True,這行代碼都會被執行。
??對于條件語句來說,往往分支不只一個。例如,上面的代碼如果變量n的值是4,那么if語句的條件就為False,這時要執行條件為False的分支,就可以使用else子句。
n = 4
if n == 3:
print("n == 3")
else:
print("n等于其他值")
print("if代碼塊結束")
??在上面這段代碼中,n等于4,所以if語句的條件為False,因此else代碼塊中的語句會被執行。if與else都是代碼塊,所以if語句和else語句后面都要以冒號(:)結尾。
??在多分支條件語句,需要使用elif子句設置更多的條件。elif后面跟邏輯表達式,elif也是代碼塊,所以后面要用冒號(:)結尾。另外,在if語句中,if和else部分只能有一個,而elif部分可以有任意多個。
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代碼塊結束")
?? 本例通過raw_input函數從控制臺輸入一個名字,然后通過條件語句判斷名字以什么字母開頭。
from click._compat import raw_input
name = raw_input("請輸入您的名字:") # 從控制臺輸入名字
if name.startswith("B"): # if代碼塊
print("名字以B開頭")
elif name.startswith("F"): # elif代碼塊
print("名字以F開頭")
elif name.startswith("T"): # elif代碼塊
print("名字以T開頭")
else: # else代碼塊
print("名字以其他字母開頭")
??程序運行結果如下圖所示。
??條件語句可以進行嵌套,也就是說,在一個條件代碼塊中,可以有另外一個條件代碼塊。包含嵌套代碼塊B的代碼塊A可以稱為B的父代碼塊。嵌套代碼塊仍然需要在父代碼塊的基礎上增加縮進量來放置自己的代碼塊。下面的例子會演示如何使用嵌套代碼塊進行邏輯判斷。
??本例要求在Python控制臺輸入一個姓名,然后通過嵌套代碼塊中判斷輸入的姓名,根據判斷結果輸出結果。
name = input("你叫什么名字?") # 從Python控制臺輸入一個字符串(姓名)
if name.startswith("Bill"): # 以Bill開頭的姓名
if name.endswith("Gates"): # 以Gates結尾的姓名(嵌套代碼塊)
print("歡迎Bill Gates先生")
elif name.endswith("Clinton"): # 以Clinton結尾的姓名
print("歡迎克林頓先生")
else: # 其他姓名
print("未知姓名")
elif name.startswith("李"): # 以“李”開頭的姓名
if name.endswith("寧"): # 以“寧”結尾的姓名
print("歡迎李寧老師")
else: # 其他姓名
print("未知姓名")
else: # 其他姓名
print("未知姓名")
程序運行結果如下圖所示。
《Python從菜鳥到高手》開始轉載了,敬請關注
??盡管if語句本身的知識到現在為止已經全部講完了,不過我們的學習遠沒有介紹。前面給出的if語句的條件都非常簡單,但在實際應用中,if語句的條件可能非常復雜,這就需要使用到本節要介紹的比較運算符。
現在先來看看下表列出的Python語言中的比較運算符。
??上標描述的比較運算符中,涉及到了對象和容器的概念,目前我們還沒講這些技術,在本節讀者只需了解Python語言可以通過比較運算符操作對象和容器即可,在后面介紹對象和容器的章節,會詳細介紹如何利用相關比較運算符操作對象和容器。
??在比較運算符中,最常用的就是判斷兩個值是否相等,例如,a大于b,a等于b。這些運算符包括“==”、“<”、“>”、“>=”、“<=”和“x != y”。
??如果比較兩個值是否相等,需要使用“==”運算符,也就是兩個等號。
>>> "hello" == "hello"
True
>>> "Hello" == "hello"
False
>>> 30 == 10
False
??要注意,如果比較兩個字符串是否相等,會比較兩個字符串中對應的每一個字母,所以“Hello”和“hello”并不相等,也就是說比較運算符是對大小寫敏感的。
??在使用“==”運算符時一定要注意,不要寫成一個等號(=),否則就成賦值運算符了,對于賦值運算符來說,等號(=)左側必須是一個變量,否則會拋出異常。
>>> "hello" = "hello" # 使用賦值運算符,會拋出異常
File "<stdin>", line 1
SyntaxError: can't assign to literal
>>> s = "hello"
>>> s
'hello'
??對于字符串、數值等類型的值,也可以使用大于(>)、小于(<)等運算符比較他們的大小。
>>> "hello" > "Hello"
True
>>> 20 > 30
False
>>> s = 40
>>> s <= 30
False
>>> "hello" != "Hello"
True
??Python語言在比較字符串時,會按字母ASCII順序進行比較,例如,比較“hello”和“Hello”的大小。首先會比較'h'和'H'的大小,很明顯'h'的ASCII大于'H'的ASCII,所以后面的都不需要比較了,因此,"hello" > "Hello"的結果是True。
??如果一個字符串是另一個字符串的前綴,那么比較這兩個字符串,Python語言會認為長的字符串更大一些。
>>> "hello" < "hello world"
True
??除了比較大小的幾個運算符外,還有用來確定兩個對象是否相等的運算符,以及判斷某個值是否屬于一個容器的運算符,盡管現在還沒有講到對象和容器,但這里不妨做一個實驗,來看看這些運算符如何使用,以便以后學習對象和容器是,更容易掌握這些運算符。
??用于判斷兩個對象是否相等的運算符是is和is not,這兩個運算符看起來和等于運算符(==)差不多,不過用起來卻大有玄機。
>>> 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時結果完全一樣,不過在比較x和z時,就會體現出差異。x == z的結果是True,而x is z的結果卻是False。出現這樣的結果,原因是“==”運算符比較的是對象的值,x和z的值都是一個列表(也可以將列表看做是一個對象),并且列表中的元素個數和值完全一樣,所以x == z的結果是True。但“is”運算符用于判斷對象的同一性,也就是說,不僅對象的值要完全一樣,而且對象本身還要是同一個對象,很明顯,x和y是同一個對象,因為在賦值時,先將一個列表賦給y,然后再將y的值賦給x,所以x和y指向了同一個對象,而z另外賦值了一個列表,所以z和x、y盡管值相同,但并不是指向的同一個對象,因此,x is z的結果就是False。
??判斷某個值是否屬于一個容器,要使用“in”和“not in”運算符。下面的代碼首先定義一個列表變量x,然后判斷變量y和一些值是否屬于x。
>>> x = [1,2,3,4,5] # 定義一個列表變量
>>> y = 3
>>> 1 in x
True
>>> y in x
True
>>> 20 in x
False
>>> 20 not in x
True
??“in”和“not in”運算符也可以用于判斷一個字符串是否包含另外一個字符串,也就是說,可以將字符串看做字符或子字符串的容器。
>>> s = "hello world"
>>> 'e' in s
True
>>> "e" in s
True
>>> "x" in s
False
>>> "x" not in s
True
>>> "world" in s
True
??如果遇到需要將多個邏輯表達式組合在一起的情況,需要用到邏輯與(and)、邏輯或(or)和邏輯非(not)。邏輯與的運算規則是只有“x and y”中的x和y都為True時,運算結果才是True,否則為False。邏輯或的運算規則是只有“x or y”中的x和y都為False時,運算結果才是False,否則都為True。邏輯非的運算規則是“not x”中,x為True,運算結果為False,x為False,運算結果為True。
>>> 20 < 30 and 40 < 50
True
>>> 20 > 40 or 20 < 10
False
>>> not 20 > 40
True
??本例演示了比較運算符的基本用法。
print(20 == 30) # 判斷20和30是否相等,運行結果:False
x = 20
y = 40
print(x < y) # 判斷x是否小于y,運行結果: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("不滿足條件")
程序運行結果如下圖所示。
??斷言的使用方式類似于if語句,只是在不滿足條件時,會直接拋出異常。類似于下面的if語句(偽代碼)
if not dondition: # 如果不滿足條件,會直接拋出異常,程序會中斷
crash program
??那么究竟為什么需要這樣的代碼呢?主要是因為需要監測程序在某個地方是否滿足條件,如果不滿足條件,應該及時通知開發人員,而不是將這些bug隱藏起來,直到關鍵的時刻再崩潰。
??其實在TDD(Test-driven development,測試驅動開發 )中經常使用斷言,TDD會在程序發現異常時執行斷言,并拋出異常。
在Python語言中,斷言需要使用assert語句,在assert關鍵字的后面指定斷言的條件表達式。如果條件表達式的值是False,那么就會拋出異常。而且斷言后面的語句都不會被執行,相當于程序的一個斷點。
>>> value = 20
>>> assert value < 10 or value > 30 # 條件不滿足,會拋出異常
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AssertionError
>>> assert value < 30 # 條件滿足,會正常執行后面的語句
??我們可以看到,value變量的值是20,而assert后面的條件是“value < 10 or value > 30”,很明顯,條件不滿足,所以在斷言處會拋出異常。而后面的斷言,條件是“value < 30”,這個條件是滿足的,所以在斷言后面的語句都會正常執行。
??當斷言條件不滿足時拋出異常,在默認情況下,只顯示了拋出異常的位置,并沒有顯示因為什么拋出異常,所以為了異常信息更明確,可以為assert語句指定異常描述。
>>> 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" # 斷言條件表達式的值是True,繼續執行下面的語句
age = 20 # 定義變量age
# 斷言條件表達式的值是False,拋出異常,后面的代碼不會被執行
assert 0 < age < 10, "年齡必須小于10歲"
print("hello world") # 這行代碼不會被執行
程序運行結果如下圖所示。
《Python從菜鳥到高手》已經出版,開始連載了,購買送視頻課程
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。