Python筆記004-元組的拆包和命名元組
以下是我學(xué)習(xí)《流暢的Python》后的個(gè)人筆記,現(xiàn)在拿出來(lái)和大家共享,希望能幫到各位Python學(xué)習(xí)者。
首次發(fā)表于: 微信公眾號(hào):科技老丁哥,ID: TechDing,敬請(qǐng)關(guān)注。
本篇主要知識(shí)點(diǎn):
-
元組的拆包就是將元組內(nèi)部的每個(gè)元素按照位置一一對(duì)應(yīng)的賦值給不同變量,可以應(yīng)用到變量賦值,函數(shù)參數(shù)賦值,獲取元組中特定位置的元素值等場(chǎng)合。
-
namedtuple: 用于存儲(chǔ)對(duì)象序列,不能改變?cè)刂担梢韵馾ict一樣通過(guò)名字進(jìn)行訪(fǎng)問(wèn),可以通過(guò)_asdict()轉(zhuǎn)換為dict,其作用相當(dāng)于只有屬性沒(méi)有方法的類(lèi)。
1. 元組的拆包
Python中的元組tuple和列表list類(lèi)似,不同之處在于元組的元素不能修改,所以被經(jīng)常稱(chēng)為不可變列表,在形式上,元組用小括號(hào)()表示,而列表用中括號(hào)[]表示。
元組的拆包就是將元組內(nèi)部的每個(gè)元素按照位置一一對(duì)應(yīng)的賦值給不同變量,比如:
tupleA
=
(
10
,
20.5
)
first
,
second
=
tupleA
# 對(duì)二元素元組拆包
print
(
first
)
# 10
print
(
second
)
# 20.5
a
,
b
,
c
,
d
=
(
'A'
,
20.15
,
2019
,
'10:15:14'
)
# 多元素元組的拆包
print
(
a
)
# A
print
(
b
)
# 20.15
print
(
c
)
# 2019
print
(
d
)
# 10:15:14
如果拆包應(yīng)用于上面的簡(jiǎn)單賦值,那倒是沒(méi)什么新奇之處。拆包其實(shí)被經(jīng)常用于給函數(shù)的參數(shù)賦值,比如:
def
func1
(
a
,
b
)
:
print
(
'a: '
,
a
,
'b: '
,
b
)
tupleA
=
(
10
,
20.5
)
func1
(
*
tupleA
)
# 拆包后作為函數(shù)的參數(shù),a: 10 b: 20.5
另外一種拆包的應(yīng)用場(chǎng)景是,某些函數(shù)返回一個(gè)tuple,而我們需要對(duì)其進(jìn)行拆包,比如:
def
func2
(
x
)
:
return
(
x
,
x
*
2
,
x
*
x
)
data1
,
data2
,
data3
=
func2
(
3
)
print
(
data1
)
# 3
print
(
data2
)
# 6
print
(
data3
)
# 9
在拆包時(shí),有的元素不是我們所需要的,那就用占位符來(lái)代替,即用_代表一個(gè)占位符,而*代表多個(gè)占位符
data1
,
_
,
data3
=
func2
(
3
)
# 用_代表一個(gè)變量
print
(
data1
)
# 3
data1
,
*
rest
=
func2
(
3
)
print
(
data1
)
# 3
print
(
rest
)
# [6,9]
嵌套元組,顧名思義是元組中包含有元組,對(duì)其進(jìn)行拆包和普通元組的拆包類(lèi)似。
areas
=
[
(
'hubei'
,
'wuhan'
,
1200
,
(
150
,
260
)
)
,
(
'hunan'
,
'changsha'
,
3600
,
(
100
,
200
)
)
,
(
'shandong'
,
'jinan'
,
800
,
(
260
,
180
)
)
]
for
province
,
city
,
data1
,
(
data2
,
data3
)
in
areas
:
print
(
'P:{}, C:{}, data2:{},data3:{}'
.
format
(
province
,
city
,
data2
,
data3
)
)
2. 命名元組
命名元組(namedtuple)類(lèi)似于tuple,都可以用于存儲(chǔ)對(duì)象序列,但是它比tuple更加強(qiáng)大,除了延續(xù)tuple不能改變?cè)刂颠@一特性之外,還有其本身的特點(diǎn),比如可以像dict一樣通過(guò)名字訪(fǎng)問(wèn)元素值,還可以通過(guò)_asdict()轉(zhuǎn)換為dict類(lèi)型。
命名元組可以構(gòu)建一個(gè)帶有字段名的元組和一個(gè)有名字的類(lèi),其消耗的內(nèi)存和元組是一樣的。
在面向?qū)ο蟮乃枷胂拢绻覀冃枰獦?gòu)建一個(gè)簡(jiǎn)單的類(lèi),只是用于存儲(chǔ)幾個(gè)簡(jiǎn)單的屬性,而沒(méi)有具體的方法,我們可以寫(xiě)成:
class
PersonCls
:
# 定義一個(gè)類(lèi),只有屬性,沒(méi)有具體的方法,用于存儲(chǔ)某些屬性值
def
__init__
(
self
,
name
,
age
,
score
)
:
self
.
name
=
name
self
.
age
=
age
self
.
score
=
score
def
__repr__
(
self
)
:
return
'PersonCls(name={},age={},score={})'
.
format
(
self
.
name
,
self
.
age
,
self
.
score
)
PC1
=
PersonCls
(
'Jack'
,
20
,
85
)
PC2
=
PersonCls
(
'Rose'
,
18
,
92
)
print
(
PC1
)
# PersonCls(name=Jack,age=20,score=85)
print
(
PC2
)
# PersonCls(name=Rose,age=18,score=92)
print
(
PC1
.
age
)
# 20
print
(
PC2
.
score
)
# 92
這樣的寫(xiě)法是可行的,但不是Python風(fēng)格,對(duì)這種情況,完全可以交給namedtuple來(lái)做,比如,在python里面的寫(xiě)法為:
from
collections
import
namedtuple
Person
=
namedtuple
(
'Person'
,
[
'name'
,
'age'
,
'score'
]
)
# 構(gòu)造一個(gè)namedtuple類(lèi)
P1
=
Person
(
'Jack'
,
20
,
85
)
# 構(gòu)建具體的實(shí)例,其賦值順序要一一對(duì)應(yīng)
P2
=
Person
(
age
=
18
,
name
=
'Rose'
,
score
=
92
)
# 如果指定變量名,順序不用一一對(duì)應(yīng)
print
(
P1
)
# Person(name='Jack', age=20, score=85)
print
(
P2
)
# Person(name='Rose', age=18, score=92)
print
(
P1
.
age
)
# 可以像dict一樣通過(guò)屬性名進(jìn)行訪(fǎng)問(wèn)
print
(
P2
.
score
)
# 92
上面的
Person=namedtuple('Person',['name', 'age', 'score'])
就相當(dāng)于構(gòu)建一個(gè)只有屬性沒(méi)有方法的Person類(lèi),其屬性為:‘name’, ‘a(chǎn)ge’, ‘score’,代碼更加簡(jiǎn)單,且更有Python味兒。在內(nèi)存上來(lái)說(shuō),會(huì)比定義一個(gè)類(lèi)要小一些,因?yàn)榇藭r(shí)不需要用
__dict__
來(lái)存放實(shí)例的屬性。
命名元組除了從tuple繼承來(lái)的屬性之外,還有其專(zhuān)有屬性,最常用的是
_fields, _make(), _asdict()
。如下:
# namedtuple專(zhuān)有屬性:
from
collections
import
namedtuple
Person
=
namedtuple
(
'Person'
,
[
'name'
,
'age'
,
'score'
]
)
print
(
Person
.
_fields
)
# ('name', 'age', 'score')
# _fields屬性是一個(gè)包含這個(gè)類(lèi)所有屬性名稱(chēng)的tuple
person1
=
(
'zhangsan'
,
25
,
59
)
p1
=
Person
.
_make
(
person1
)
# _make()接受一個(gè)可迭代對(duì)象生成一個(gè)實(shí)例
print
(
p1
)
# Person(name='zhangsan', age=25, score=59)
print
(
p1
.
_asdict
(
)
)
# OrderedDict([('name', 'zhangsan'), ('age', 25), ('score', 59)])
# _asdict()將實(shí)例的屬性和值以O(shè)rderedDict的方式展示出來(lái)。
首次發(fā)表于: 微信公眾號(hào):科技老丁哥,ID: TechDing,敬請(qǐng)關(guān)注。
本文所有代碼都已經(jīng)上傳到我的github,歡迎下載
參考資料:
- 《流暢的Python》,Luciano Ramalho (作者) 安道 , 吳珂 (譯者)。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
