python基礎——5 條件、迴圈
賦值魔法
5.2.1 序列解包
>>> x, y, z = 1, 2, 3
>>> x, y, z = z, x, y
# 交換多個變數的值, 稱為序列解包:將一個序列(或任何可迭代物件)解包,並將得到的值儲存到一系列變數中
>>> values = 1, 2, 3
>>> values
(1, 2, 3)
>>> x, y, z = values
>>> x
1
# 在使用返回元組(或其他序列或可迭代物件的函式或方法時很有用
>>> scoundrel = {'name': 'Robin', 'girlfriend': 'Marion'}
>>> key, value = scoundrel.popitem()
>>> key
'girlfriend'
>>> value
'Marion'
# 可使用星號運算子(*)來收集多餘的值,這樣無需確保值和變數的個數相同
>>> a, b, *rest = [1, 2, 3, 4]
>>> rest
[3, 4]
# 還可將帶星號的變數放在其他位置。
>>> name = "Albus Percival Wulfric Brian Dumbledore"
>>> first, *middle, last = name.split()
>>> middle
['Percival', 'Wulfric', 'Brian']
# 賦值語句的右邊可以是任何型別的序列,但帶星號的變數最終包含的總是一個列表。在變數和值的個數相同時亦如此。
>>> a, *b, c = "abc"
>>> a, b, c
('a', ['b'], 'c')
# 這種收集方式也可用於函式引數列表中(參見第6章)。
5.2.2 鏈式賦值
x = y = somefunction( )
5.2.3 增強賦值
*= += 等,增強賦值也可用於其他資料型別
5.3 程式碼塊:縮排
縮排的標準做法是隻使用空格,且每級縮排4個空格
在很多語言中,都使用一個特殊的單詞或字元(如begin或{)來標識程式碼塊的起始位置,並使用另一個特殊的單詞或字元(如end或})來標識結束位置。在Python中,使用冒號(:)指出接下來是一個程式碼塊,並將該程式碼塊中的每行程式碼都縮排相同的程度。發現縮排量與之前相同時,你就知道當前程式碼塊到此結束了。
5.4 條件和條件語句
5.4.1 條件
- 下面的值都將被直譯器視為假:
False None 0 “” () [] {}
換而言之,標準值False和None、各種型別(包括浮點數、複數等)的數值0、空序列(如空字串、空元組和空列表)以及空對映(如空字典)都被視為假,而其他各種值都被視為真 ① ,包括特殊值True ② 。
① 至少對內建型別值來說如此。你在第9章將看到,對於自己建立的物件,解釋為真還是假由你決定。
② 正如Python老手Laura Creighton指出的,這種差別類似於“有些東西”和“沒有東西”的差別,而不是真和假的差別。 - 布林值True和False屬於型別bool,而bool與list、str和tuple一樣,可用來轉換其他的值。
注意 雖然[]和"“都為假(即bool([]) == bool(”") == False),但它們並不相等(即[] != “”)。對其他各種為假的物件來說,情況亦如此(一個更顯而易見的例子是() != False)。
5.4.2 語句
str.endswith()
name = input('What is your name?')
if name.endswith('Gumby'):
print('Hello, Mr. Gumby')
else:
print('Hello, stranger')
條件表示式——C語言中三目運算子的Python版本。
下面的表示式使用if和else確定其值:
status = "friend" if name.endswith("Gumby") else "stranger"
5.4.6 更復雜的條件
表5-1 Python比較運算子
表 達 式 | 描 述 |
---|---|
x == y | x 等於y |
x < y | x小於y |
x > y | x大於y |
x >= y | x大於或等於y |
x <= y | x小於或等於y |
x != y | x不等於y |
x is y | x和y是同一個物件 |
x is not y | x和y是不同的物件 |
x in y | x是容器(如序列)y的成員 |
x not in y | x不是容器(如序列)y的成員 |
與賦值一樣,Python也支援鏈式比較:可同時使用多個比較運算子,如0 < age < 100。
- 相等(==)而不是(=)
- 相同運算子:is
- in:成員資格運算子
- 字串和序列的比較
字串是依據字元的字母排列順序進行比較的,字母都是Unicode字元,是按碼點排列的,要獲悉字母的順序值,可以使用函式ord()。這個函式的作用與函式chr()相反。
>>> ord("★")
9733
>>> chr(9733)
'★'
短路邏輯和條件表示式
布林運算子有個有趣的特徵:只做必要的計算。例如,僅當x和y都為真時,表示式x and y才為真。因此如果x為假,這個表示式將立即返回假,而不關心y。實際上,如果x為假,這個表示式將返回x,否則返回y。(這將提供預期的結果,你明白了其中的原理嗎?)這種行為稱為短路邏輯(或者延遲求值):布林運算子常被稱為邏輯運算子,如你所見,在有些情況下將“繞過”第二個值。對於運算子or,情況亦如此。在表示式x or y中,如果x為真,就返回x,否則返回y。(你明白這樣做合理的原因嗎?)請注意,這意味著位於布林運算子後面的程式碼(如函式呼叫)可能根本不會執行。像下面這樣的程式碼就利用了這種行為:
name = input(‘Please enter your name: ‘) or ‘’
如果沒有輸入名字,上述or表示式的結果將為’’。在很多情況下,你都寧願使用條件表示式,而不耍這樣的短路花樣。不過前面這樣的語句確實有其用武之地。