不懂python拆包?看完保證讓你明白

?No.1

解壓序列賦值給多個(gè)變量

問題

一個(gè)包含 N 個(gè)元素的元組或者是列表,怎么才能容易的把里面的元素一次性賦值給幾個(gè)變量

解決方案

任何的序列(或者是可迭代對象)可以用的賦值語句自動(dòng)賦值給多個(gè)變量。但是要保證元素個(gè)數(shù)和變量個(gè)數(shù)相同。

代碼示例

>>> a = (4,5)>>> a1, a2 = a>>> a14>>> a25>>>>>> b = ['Ac',1,2, (3,4,5) ]>>> b1, b2, b3, b4 = b>>> b1'Ac'>>> b4(3,4,5)>>> b1, b2, b3, (b4_1, b4_2, b4_3) = b>>> b1'Ac'>>> b21>>> b4_13>>> b4_24>>>

元素個(gè)數(shù)和變量個(gè)數(shù)不一致的話,會(huì)拋出異常

代碼示例

'''

>>> a = (4,5)>>> a1, a2, a3 = aTraceback (most recent call last):File"<stdin>", line1,inValueError:need more than2values to unpack>>>

'''

事實(shí)上,這種解壓列表、元組的方式還適用于字符串、迭代器、生成器等。

代碼示例

>>> a ='Hello'>>> a1, a2, a3, a4, a5 = a>>> a1'H'>>> a2'e'

有些時(shí)候,我們并不關(guān)心所有的數(shù)據(jù),僅僅需要其中一部分?jǐn)?shù)據(jù),我們可以用_作為變量名,接受我們并不需要的數(shù)據(jù)。

代碼示例:

>>> b = ['Ac',1,2, (3,4,5) ]>>>_, b1, b2,_= b>>> b11>>> b22

No.2

解壓可迭代對象賦值給多個(gè)變量

問題

當(dāng)元素個(gè)數(shù)與變量個(gè)數(shù)不一致的時(shí)候,會(huì)拋出一個(gè) ValueError 。這個(gè)時(shí)候該怎么解決呢?

解決方案

現(xiàn)在我們開始接觸python高階用法里面的一個(gè)最基礎(chǔ)的知識----拆包裝包語法

>>>a, *b = [1,2,3]>>>a1>>>b[2, 3]

這里原本是兩個(gè)元素賦值給一個(gè)元素,是非法操作,但是通過一個(gè)*號,把他們進(jìn)行裝包,放入b列表。

同樣,有時(shí)候,你想解壓一些不需要的元素,你不能簡單就使用 * , 但是你可以使用一個(gè)普通的廢棄名稱,比如 _ 或者 ign (ignore)。

代碼示例:

>>> a = ('ac',1,2, (3,4,5))>>> a1, *_, (*_, a2) = a>>> a1'ac'>>> a25>>>

要注意的是,許多python庫代碼的形參都會(huì)使用 *args接受變量,這個(gè)用途實(shí)際上類似于java的構(gòu)造函數(shù),能接受任意多個(gè)變量,這也是python的強(qiáng)大之處。

defrun(a,*args):#第一個(gè)參數(shù)傳給了a? ? print(a)# args是一個(gè)元組,里面是2和3兩個(gè)參數(shù)? ? print(args)# *args是將這個(gè)元組中的元素依次取出來print("對args拆包")print(*args)# *args 相當(dāng)于 a,b = argsprint("將未拆包的數(shù)據(jù)傳給run1")? ? run1(args)print("將拆包后的數(shù)據(jù)傳給run1")? ? run1(*args) defrun1(*args):print("輸出元組")? ? print(args)print("對元組進(jìn)行拆包")? ? print(*args) run(1,2,3)#后面的2和3

上述代碼的結(jié)果為:

1(2,3)對args拆包23將未拆包的數(shù)據(jù)傳給run1輸出元組((2,3),)對元組進(jìn)行拆包(2,3)將拆包后的數(shù)據(jù)傳給run1輸出元組(2,3)對元組進(jìn)行拆包2 3

這段代碼很容易被繞暈,抓住這幾點(diǎn):

1.形參中的*args其實(shí)真正接收數(shù)據(jù)的args,它是一個(gè)元組,把傳進(jìn)來的數(shù)據(jù)放在了args這個(gè)元組中。

2. 函數(shù)體里的args依然是那個(gè)元組,但是*args的含義就是把元組中的數(shù)據(jù)進(jìn)行拆包,也就是把元組中的數(shù)據(jù)拆成單個(gè)數(shù)據(jù)。

3. 對于args這個(gè)元組,如果不對其進(jìn)行解包,就將其作為實(shí)參傳給其它以*args作為形參的函數(shù)時(shí),args這個(gè)元組會(huì)看看作一個(gè)整體,作為一個(gè)類型為元組的數(shù)據(jù)傳入。


公主號:? 暮秋梵星

回復(fù)“深度學(xué)習(xí)”: 獲取AI相關(guān)資料

回復(fù)“數(shù)據(jù)分析”: 獲取python數(shù)據(jù)分析資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容