問題
現(xiàn)在有一個包含 N 個元素的元組或者是序列,怎樣將它里面的值解壓后同時(shí)賦值給 N 個變量渣聚?
解決方案
任何序列(可迭代對象),通過一個簡單的賦值語句,可以解壓并賦值給多個變量租悄;
唯一的前提就是變量的數(shù)量必須與序列元素的數(shù)量相同。
代碼示例:
>>> x = [1, 'python', (2018, 12, 11)]
>>> a
1
>>> b
'python'
>>> c
2018
>>> d
12
>>> e
11
如果變量個數(shù)和序列元素的個數(shù)不匹配恩袱,會產(chǎn)生一個異常泣棋。
代碼示例:
>>> y = [4, 5]
>>> n, m, p = y
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: not enough values to unpack (expected 3, got 2)
討論
實(shí)際上,這種解壓賦值可以用在任何可迭代對象上畔塔,而不僅僅是列表或者元組潭辈。 包括字符串,文件對象澈吨,迭代器和生成器把敢。
代碼示例:
>>> s = 'mac'
>>> x, y, z = s
>>> x
'm'
>>> y
'a'
>>> z
'c'
如果只想解壓一部分,丟棄其他的值谅辣。對于這種情況 Python 并沒有提供特殊的語法修赞。 但是你可以使用任意變量名去占位,到時(shí)候丟掉這些變量就行了桑阶,但是必須保證選用的那些占位變量名柏副,在其他地方?jīng)]被使用到勾邦。
代碼示例:
>>> x = [1, 'python', (2018, 12, 11)]
>>> a, b, _ = x
>>> a
1
>>> _
(2018, 12, 11)
解壓不確定個數(shù)或任意個數(shù)元素的可迭代對象時(shí),可以使用星號表達(dá)式割择。通常眷篇,這些可迭代對象的元素結(jié)構(gòu)有確定的規(guī)則(比如只需要獲取首尾2個元素)。
代碼示例:
# case-1
>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> *b, c = a
>>> b
[1, 2, 3, 4, 5, 6]
>>> c
7
# case-2
>>> record = ['python', 12, 9.11, (10, 11, 2018)]
>>> name, *b, c = record
>>> name
'python'
>>> c
(10, 11, 2018)
>>> b
[12, 9.11]