博客專欄

EEPW首頁 > 博客 > 扣丁學(xué)堂Python培訓(xùn)之基礎(chǔ)教程的解包用法

扣丁學(xué)堂Python培訓(xùn)之基礎(chǔ)教程的解包用法

發(fā)布人:扣丁客1 時間:2020-12-24 來源:工程師 發(fā)布文章

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




關(guān)鍵詞:

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉