2. 判斷

    到目前爲止,在你編寫的程序中,語句都是逐條執行的。現在更進一步,讓程序選擇是否執行特定的語句塊。

1. 布爾值的用武之地

    真值也稱布爾值,是以在真值方面做出了巨大貢獻的George Boole命名的。

    用作布爾表達式(如用作 if 語句中的條件)時,下面的值都將被解釋器視爲假:
False None 0 "" () [] {}

    換而言之,標準值 False 和 None 、各種類型(包括浮點數、複數等)的數值0、空序列(如空字符串、空元組和空列表)
以及空映射(如空字典)都被視爲假,而其他各種值都被視爲真① ,包括特殊值 True。

    這意味着任何Python值都可解釋爲真值。乍一看這有點令人迷惑,但也很有用。雖然可供選擇的真值非常多,但標準真值爲
True 和 False 。
	
	在有些語言(如C語言和2.3之前的Python版本)中,標準真值爲0(表示假)和1(表示真)。實際上, True 和 False 不過
是0和1的別名,雖然看起來不同,但作用是相同的。
>>> True
True
>>> False
False
>>> True == 1
True
>>> False == 0
True
>>> True + False + 42
43
    因此,如果你看到一個返回1或0的表達式(可能是使用較舊的Python版本編寫的),就知道這實際上意味着 True 或 False 。
布爾值 True 和 False 屬於類型 bool ,而 bool 與 list 、 str 和 tuple 一樣,可用來轉換其他的值。
>>> bool('I think, therefore I am')
True
>>> bool(42)
True
>>> bool('')
False
>>> bool(0)
False
'''
鑑於任何值都可用作布爾值,因此你幾乎不需要顯式地進行轉換(Python會自動轉換)。
注意: 雖然 [] 和 "" 都爲假(即 bool([]) == bool("") == False ),但它們並不相等(即 [] != "" )。
對其他各種爲假的對象來說,情況亦如此(一個更顯而易見的例子是 () != False )。
'''

2. 有條件的執行和if語句

	真值可合併,至於如何合併稍後再講,先來看看真值可用來做什麼。請嘗試運行下面的腳本:
name = input('What is your name? ')
if name.endswith('Gumby'):
    print('Hello, Mr. Gumby')
	這就是 if 語句,讓你能夠有條件地執行代碼。這意味着如果條件( if 和冒號之間的表達式)爲前面定義的真,就執行後續代碼塊
(這裏是一條 print 語句);如果條件爲假,就不執行(你應該猜到了)。

3. else 子句

	在前一節的示例中,如果你輸入以Gumby結尾的名字,方法 name.endswith 將返回 True ,導致後續代碼塊執行——打印問候語。
如果你願意,可使用 else 子句增加一種選擇(之所以叫子句是因爲 else 不是獨立的語句,而是 if 語句的一部分)。
name = input('What is your name? ')
if name.endswith('Gumby'):
    print('Hello, Mr. Gumby')
else:
    print('Hello, Stranger')
	在這裏,如果沒有執行第一個代碼塊(因爲條件爲假),將進入第二個代碼塊。這個示例表明,Python代碼很容易理解,不是嗎?
如果從 if 開始將代碼大聲朗讀出來,聽起來將像普通句子一樣(也可能不那麼普通)。

	還有一個與 if 語句很像的“親戚”,它就是條件表達式——C語言中三目運算符的Python版本。下面的表達式使用 if 和 else 確定其值:
status = "friend" if name.endswith("Gumby") else "stranger"
print(status)
	如果條件(緊跟在 if 後面)爲真,表達式的結果爲提供的第一個值(這裏爲 "friend" ),否則爲第二個值(這裏爲 "stranger" )。

4. elif 子句

	要檢查多個條件,可使用 elif 。 elif 是 else if 的縮寫,由一個 if 子句和一個 else 子句組合而成,也就是包含條件的 else 
子句。
num = int(input('Enter a number: '))
if num > 0:
    print('The number is positive')
elif num < 0:
    print('The number is negative')
else:
    print('The number is zero')

5. 代碼嵌套

	下面穿插點額外的內容。你可將 if 語句放在其他 if 語句塊中,如下所示:
name = input('What is your name? ')
if name.endswith('Gumby'):
    if name.startswith('Mr.'):
        print('Hello, Mr. Gumby')
    elif name.startswith('Mrs.'):
        print('Hello, Mrs. Gumby')
    else:
        print('Hello, Gumby')
else:
    print('Hello, stranger')
	在這裏,如果名字以Gumby結尾,就同時檢查名字開頭,這是在第一個代碼塊中使用一條獨立的 if 語句完成的。請注意,這裏還
使用了 elif 。最後一個分支( else 子句)沒有指定條件——如果沒有選擇其他分支,就選擇最後一個分支。如果需要,這裏的兩個
else 子句都可省略。如果省略裏面的 else 子句,將忽略並非以Mr.或Mrs.打頭的名字(假設名字爲Gumby)。如果省略外面的 else
子句,將忽略陌生人。

6. 更復雜的條件

	這就是你需要知道的有關 if 語句的全部知識。下面來說說條件本身,因爲它們是有條件執行中最有趣的部分。

6.1 比較運算符

在這裏插入圖片描述

	從理論上說,可使用 < 和 <= 等運算符比較任意兩個對象 x 和 y 的相對大小,並獲得一個真值,但這種比較僅在 x 和 y 的類型
相同或相近時(如兩個整數或一個整數和一個浮點數)纔有意義。將整數與字符串相加毫無意義,檢查一個整數是否小於一個字符串也是
一樣。奇怪的是,在Python 3之前,竟然可以這樣做。不過即便你使用的是較舊的Python版本,也應對這類比較敬而遠之,因爲結果是
不確定的,每次執行程序時都可能不同。在Python 3中,已經不允許這樣比較不兼容的類型了。

	與賦值一樣,Python也支持鏈式比較:可同時使用多個比較運算符,如 0 < age < 100 。有些比較運算符需要特別注意,如下:
1. 相等運算符:             要確定兩個對象是否相等,可使用比較運算符,用兩個等號( == )表示。
>>> "foo" == "foo"
True
>>> "foo" == "bar"
False
#兩個等號?爲何不像數學中那樣使用一個等號呢?相信你很聰明,自己就能夠明白其中的原因,但這裏還是試試一個等號吧。
>>> "foo" = "foo"
SyntaxError: can't assign to literal
#一個等號是賦值運算符,用於修改值,而進行比較時你可不想這樣做。
2. is - 相同運算符:
#這個運算符很有趣,其作用看似與 == 一樣,但實際上並非如此。
>>> x = y = [1, 2, 3]
>>> z = [1, 2, 3]
>>> x == y
True
>>> x == z
True
>>> x is y
True
>>> x is z
False
'''
在前幾個示例中,看不出什麼問題,但最後一個示例的結果很奇怪: x 和 z 相等,但 x is z 的
結果卻爲 False 。爲何會這樣呢?因爲 is 檢查兩個對象是否相同(而不是相等)。變量 x 和 y 指向同
一個列表,而 z 指向另一個列表(其中包含的值以及這些值的排列順序都與前一個列表相同)。這
兩個列表雖然相等,但並非同一個對象。
'''
#這好像不可理喻?請看下面的示例:
>>> x = [1, 2, 3]
>>> y = [2, 4]
>>> x is not y
True
>>> del x[2]
>>> y[1] = 1
>>> y.reverse()
'''
在這個示例中,我首先創建了兩個不同的列表 x 和 y 。如你所見, x is not y (與 x is y 相反)
的結果爲 True ,這一點你早已知道。接下來,我稍微修改了這兩個列表,現在它們雖然相等,但
依然是兩個不同的列表。
'''
>>> x == y
True
>>> x is y
False
'''
顯然,這兩個列表相等但不相同。
總之, == 用來檢查兩個對象是否相等,而 is 用來檢查兩個對象是否相同(是同一個對象)。
不要將 is 用於數和字符串等不可變的基本值。鑑於Python在內部處理這些對象的方式,這樣做的結果是不可預測的。
'''
3. in - 成員資格運算符:
#與其他比較運算符一樣,它也可用於條件表達式中。
name = input('What is your name?')
if 's' in name:
    print('Your name contains the letter "s".')
else:
    print('Your name does not contain the letter "s".')
4. 字符串和序列的比較:
#字符串是根據字符的字母排列順序進行比較的。
>>> "alpha" < "beta"
True
#雖然基於的是字母排列順序,但字母都是Unicode字符,它們是按碼點排列的。
#其他序列的比較方式與此相同,但這些序列包含的元素可能不是字符,而是其他類型的值。
>>> [1, 2] < [2, 1]
True
#如果序列的元素爲其他序列,將根據同樣的規則對這些元素進行比較。
>>> [2, [1, 4]] < [2, [1, 5]]
True

6.2 布爾運算符

	至此,你已見過很多返回真值的表達式(實際上,考慮到所有值都可解釋爲真值,因此所有的表達式都返回真值),但你可能需要
檢查多個條件。例如,假設你要編寫一個程序,讓它讀取一個數,並檢查這個數是否位於1~10(含)。爲此,可像下面這樣做:
number = int(input('Enter a number between 1 and 10: '))
if number <= 10:
    if number >= 1:
        print('Great!')
    else:
        print('Wrong!')
else:
    print('Wrong!')
#這可行,但有點笨拙,因爲你輸入了 print('Wrong!') 兩次。重複勞動可不是好事,那麼該如何辦呢?很簡單。
number = int(input('Enter a number between 1 and 10: '))
if number <= 10 and number >= 1:
    print('Great!')
else:
    print('Wrong!')
'''
運算符 and 是一個布爾運算符。它接受兩個真值,並在這兩個值都爲真時返回真,否則返回
假。還有另外兩個布爾運算符: or 和 not 。通過使用這三個運算符,能以任何方式組合真值。
'''
if ((cash > price) or customer_has_good_credit) and not out_of_stock:
	give_goods()

在這裏插入圖片描述

7. 斷言

#if 語句有一個很有用的“親戚”,其工作原理類似於下面的僞代碼:
if not condition:
	crash program
'''
問題是,爲何要編寫類似於這樣的代碼呢?因爲讓程序在錯誤條件出現時立即崩潰勝過以後
再崩潰。基本上,你可要求某些條件得到滿足(如覈實函數參數滿足要求或爲初始測試和調試提
供幫助),爲此可在語句中使用關鍵字 assert 。
'''
>>> age = 10
>>> assert 0 < age < 100
>>> age = -1
>>> assert 0 < age < 100
Traceback (most recent call last):
	File "<stdin>", line 1, in ?
AssertionError
'''
如果知道必須滿足特定條件,程序才能正確地運行,可在程序中添加 assert 語句充當檢查點,
這很有幫助。
還可在條件後面添加一個字符串,對斷言做出說明。
'''
>>> age = -1
>>> assert 0 < age < 100, 'The age must be realistic'
Traceback (most recent call last):
	File "<stdin>", line 1, in ?
AssertionError: The age must be realistic
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章