1. 程式人生 > >python基礎——5 條件、迴圈

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表示式的結果將為’’。在很多情況下,你都寧願使用條件表示式,而不耍這樣的短路花樣。不過前面這樣的語句確實有其用武之地。