扣丁學(xué)堂Python培訓(xùn)之基礎(chǔ)教程的解包用法
python中的解包可以這樣理解:一個list是一個整體,想把list中每個元素當(dāng)成一個個個體剝離出來,這個過程就是解包,我們來看下面這些例子(分為10個部分)。
1、將list中每個元素賦值給一個變量
[python]viewplaincopy >>>name,age,date=['Bob',20,'2018-1-1'] >>>name 'Bob' >>>age 20 >>>date '2018-1-1'
2、可迭代對象都可以這樣做
[python]viewplaincopy #列表 >>>a,b,c=['a','b','c'] >>>a 'a' >>>a,b,c=enumerate(['a','b','c']) >>>a (0,'a') #元組 >>>a,b,c=('a','b','c') >>>a 'a' #字典 >>>a,b,c={'a':1,'b':2,'c':3} >>>a 'a' >>>a,b,c={'a':1,'b':2,'c':3}.items() >>>a ('a',1) #字符串 >>>a,b,c='abc' >>>a 'a' #生成器 >>>a,b,c=[x+1forxinrange(3)] >>>a 1
如果可迭代對象包含的元素和前面待賦值變量數(shù)量不一致,則會報錯。但是可以通過*來表示多個元素
3.星號的使用
比如我們要計(jì)算平均分,去除最高分和最低分,除了用切片,還可以用解包的方式獲得中間的數(shù)值
[python]viewplaincopy >>>first,*new,last=[94,85,73,46] >>>new [85,73]
用*來表示多個數(shù)值
4.壓包過程
壓包是解包的逆過程,用zip函數(shù)實(shí)現(xiàn),下面例子可以對壓包有一個直觀的感受
5.壓包與解包混合的例子
[python]viewplaincopy
>>>a=['a','b','c']
>>>b=[1,2,3]
>>>foriinzip(a,b):
...print(i)
...
('a',1)
('b',2)
('c',3)
下面例子實(shí)現(xiàn):兩個列表對應(yīng)數(shù)值相加
[python]viewplaincopy
>>>a=[0,1,2]
>>>b=[1,2,3]
>>>fori,jinzip(a,b):
...print(i+j)
...
1
3
5
細(xì)細(xì)拆解上面過程,可以看出步驟是這樣的
先是zip函數(shù)將ab壓包成為一個可迭代對象
對可迭代對象的每一個元素(('a',1))進(jìn)行解包(i,j=('a',1))
此時就可以分別調(diào)用ij變量進(jìn)行計(jì)算下面我們加入星號
[python]viewplaincopy
>>>l=[('Bob','1990-1-1',60),
...('Mary','1996-1-4',50),
...('Nancy','1993-3-1',55),]
>>>forname,*argsinl:
...print(name,args)
...
Bob['1990-1-1',60]
Mary['1996-1-4',50]
Nancy['1993-3-1',55]
6._的用法
當(dāng)一些元素不用時,用_表示是更好的寫法,可以讓讀代碼的人知道這個元素是不要的
[python]viewplaincopy
>>>person=('Bob',20,50,(11,20,2000))
>>>name,*_,(*_,year)=person
>>>name
'Bob'
>>>year
2000
7.多變量同時賦值
之前賦值符號右側(cè)都是可迭代對象,其實(shí)右側(cè)也可以是多個變量
[python]viewplaincopy
>>>a,b=1,2
>>>a
1
>>>b
2
>>>a=1,2
>>>a
(1,2)
下面用法都會報錯
[python]viewplaincopy
*a=1,2
a,b,c=1,2
可以這樣
[python]viewplaincopy
*a,=1,2
8.*之可變參數(shù)
函數(shù)定義時,我們使用*的可變參數(shù),其實(shí)也是壓包解包過程
[python]viewplaincopy
>>>defmyfun(*num):
...print(num)
...
>>>myfun(1,2,5,6)
(1,2,5,6)
參數(shù)用*num表示,num變量就可以當(dāng)成元組調(diào)用了。
其實(shí)這個過程相當(dāng)于*num,=1,2,5,6
9.*之關(guān)鍵字參數(shù)
[python]viewplaincopy
>>>defmyfun(**kw):
...print(kw)
...
>>>myfun(name="Bob",age=20,weight=50)
{'weight':50,'name':'Bob','age':20}
鍵值對傳入**kw,kw就可以表示相應(yīng)字典。
**的用法只在函數(shù)定義中使用,不能這樣使用
[python]viewplaincopy
a,**b={'weight':50,'name':'Bob','age':20}
10.可變參數(shù)與關(guān)鍵字參數(shù)的細(xì)節(jié)問題
(1)函數(shù)傳入實(shí)參時,可變參數(shù)(*)之前的參數(shù)不能指定參數(shù)名
[python]viewplaincopy
>>>defmyfun(a,*b):
...print(a)
...print(b)
...
>>>myfun(a=1,2,3,4)
File"<stdin>",line1
SyntaxError:positionalargumentfollowskeywordargument
>>>myfun(1,2,3,4)
1
(2,3,4)
(2)函數(shù)傳入實(shí)參時,可變參數(shù)(*)之后的參數(shù)必須指定參數(shù)名,否則就會被歸到可變參數(shù)之中
[python]viewplaincopy
>>>defmyfun(a,*b,c=None):
...print(a)
...print(b)
...print(c)
...
>>>myfun(1,2,3,4)
1
(2,3,4)
None
>>>myfun(1,2,3,c=4)
1
(2,3)
4
如果一個函數(shù)想要使用時必須明確指定參數(shù)名,可以將所有參數(shù)都放在可變參數(shù)之后,而可變參數(shù)不用管它就可以,也不用命名,如下
[python]viewplaincopy
>>>defmyfun(*,a,b):
...print(a)
...print(b)
...
>>>myfun(a=1,b=2)
1
2
可變參數(shù)的這兩條特性,可以用于將只需要按照位置賦值的參數(shù)和需要明確指定參數(shù)名的參數(shù)區(qū)分開來
(3)關(guān)鍵字參數(shù)都只能作為最后一個參數(shù),前面的參數(shù)按照位置賦值還是名稱賦值都可以
下面展示一個既用可變參數(shù)有用關(guān)鍵字參數(shù)的例子
[python]viewplaincopy
>>>defmyfun(a,*b,c,**d):
...print(a)
...print(b)
...print(c)
...print(d)
...
>>>myfun(1,2,3,c=4,m=5,n=6)
1
(2,3)
4
{'n':6,'m':5}
(4)可變參數(shù)與關(guān)鍵詞參數(shù)共同使用以表示任意參數(shù)
下面是這一點(diǎn)在裝飾器當(dāng)中的使用
[python]viewplaincopy
>>>defmydecorator(func):
...defwrapper(*args,**kw):
...print('Iamusingadecorator.')
...returnfunc(*args,**kw)
...returnwrapper
...
>>>@mydecorator
...defmyfun(a,b):
...print(a)
...print(b)
...
>>>myfun(1,b=2)
Iamusingadecorator.
1
2
(如果有的讀者不熟悉裝飾器,只需要知道,使用@定義myfun相當(dāng)于myfun=mydecorator(myfun),定義出來的myfun其實(shí)是返回結(jié)果wrapper函數(shù))
wrapper函數(shù)使用args,*kw作為參數(shù),則被修飾的myfun函數(shù)需要的參數(shù)無論是什么樣的,傳入wrapper都不會報錯,這保證了裝飾器可以修飾各種各樣函數(shù)的靈活性。畢竟我們一般在函數(shù)中傳入?yún)?shù)時,要么所有參數(shù)名都寫,要么前面幾個不寫,后面的會寫,這樣使用args,*kw完全沒有問題。
11.解包作為參數(shù)傳入函數(shù)中
首先定義一個函數(shù)
[python]viewplaincopy
defmyfun(a,b):
print(a+b)
列表元組的解包
[python]viewplaincopy
>>>n=[1,2]
>>>myfun(*n)
3
>>>m=(1,2)
>>>myfun(*m)
3
字典的解包
[python]viewplaincopy
>>>mydict={'a':1,'b':2}
>>>myfun(**mydict)
3
>>>myfun(*mydict)
ba
一個應(yīng)用
[python]viewplaincopy
>>>bob={'name':'Bob','age':30}
>>>"{name}'sageis{age}".format(**bob)
"Bob'sageis30"
12.多返回值函數(shù)
下面過程也涉及到了解包
[python]viewplaincopy
defmyfun(a,b):
returna+1,b+2
>>>m,n=myfun(1,2)
>>>m
2
>>>n
4
其實(shí)本身是一個元組
[python]viewplaincopy
>>>p=myfun(1,2)
>>>p
(2,4)
以上就是扣丁學(xué)堂Python培訓(xùn)之基礎(chǔ)教程的解包用法詳細(xì)介紹,希望能幫到小伙伴們,想要了解更多內(nèi)容的小伙伴可以登錄扣丁學(xué)堂官網(wǎng)查詢??鄱W(xué)堂是專業(yè)的Python在線學(xué)習(xí)基地,有大量的Python視頻教程供小伙伴觀看學(xué)習(xí)哦??鄱W(xué)堂python學(xué)習(xí)交流群:816572891。微信號:codingbb
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。
DIY機(jī)械鍵盤相關(guān)社區(qū):機(jī)械鍵盤DIY