免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Python筆記004-元組的拆包和命名元組

以下是我學(xué)習(xí)《流暢的Python》后的個(gè)人筆記,現(xiàn)在拿出來和大家共享,希望能幫到各位Python學(xué)習(xí)者。

首次發(fā)表于: 微信公眾號(hào):科技老丁哥,ID: TechDing,敬請(qǐng)關(guān)注。

本篇主要知識(shí)點(diǎn):

  1. 元組的拆包就是將元組內(nèi)部的每個(gè)元素按照位置一一對(duì)應(yīng)的賦值給不同變量,可以應(yīng)用到變量賦值,函數(shù)參數(shù)賦值,獲取元組中特定位置的元素值等場(chǎng)合。

  2. namedtuple: 用于存儲(chǔ)對(duì)象序列,不能改變?cè)刂?,可以像dict一樣通過名字進(jìn)行訪問,可以通過_asdict()轉(zhuǎn)換為dict,其作用相當(dāng)于只有屬性沒有方法的類。

1. 元組的拆包

Python中的元組tuple和列表list類似,不同之處在于元組的元素不能修改,所以被經(jīng)常稱為不可變列表,在形式上,元組用小括號(hào)()表示,而列表用中括號(hào)[]表示。

元組的拆包就是將元組內(nèi)部的每個(gè)元素按照位置一一對(duì)應(yīng)的賦值給不同變量,比如:

tupleA=(10,20.5)first,second=tupleA # 對(duì)二元素元組拆包print(first) # 10print(second) # 20.5a,b,c,d=('A',20.15,2019,'10:15:14') # 多元素元組的拆包print(a) # Aprint(b) # 20.15print(c) # 2019print(d) # 10:15:14

如果拆包應(yīng)用于上面的簡(jiǎn)單賦值,那倒是沒什么新奇之處。拆包其實(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) # 3print(data2) # 6print(data3) # 9

在拆包時(shí),有的元素不是我們所需要的,那就用占位符來代替,即用_代表一個(gè)占位符,而*代表多個(gè)占位符

data1,_,data3=func2(3) # 用_代表一個(gè)變量print(data1) # 3data1,*rest=func2(3)print(data1) # 3print(rest) # [6,9]

嵌套元組,顧名思義是元組中包含有元組,對(duì)其進(jìn)行拆包和普通元組的拆包類似。

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)類似于tuple,都可以用于存儲(chǔ)對(duì)象序列,但是它比tuple更加強(qiáng)大,除了延續(xù)tuple不能改變?cè)刂颠@一特性之外,還有其本身的特點(diǎn),比如可以像dict一樣通過名字訪問元素值,還可以通過_asdict()轉(zhuǎn)換為dict類型。

命名元組可以構(gòu)建一個(gè)帶有字段名的元組和一個(gè)有名字的類,其消耗的內(nèi)存和元組是一樣的。

在面向?qū)ο蟮乃枷胂?,如果我們需要?gòu)建一個(gè)簡(jiǎn)單的類,只是用于存儲(chǔ)幾個(gè)簡(jiǎn)單的屬性,而沒有具體的方法,我們可以寫成:

class PersonCls:# 定義一個(gè)類,只有屬性,沒有具體的方法,用于存儲(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) # 20print(PC2.score) # 92

這樣的寫法是可行的,但不是Python風(fēng)格,對(duì)這種情況,完全可以交給namedtuple來做,比如,在python里面的寫法為:

from collections import namedtuplePerson=namedtuple('Person',['name', 'age', 'score']) # 構(gòu)造一個(gè)namedtuple類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一樣通過屬性名進(jìn)行訪問print(P2.score) # 92

上面的Person=namedtuple('Person',['name', 'age', 'score'])就相當(dāng)于構(gòu)建一個(gè)只有屬性沒有方法的Person類,其屬性為:'name', 'age', 'score',代碼更加簡(jiǎn)單,且更有Python味兒。在內(nèi)存上來說,會(huì)比定義一個(gè)類要小一些,因?yàn)榇藭r(shí)不需要用__dict__來存放實(shí)例的屬性。

命名元組除了從tuple繼承來的屬性之外,還有其專有屬性,最常用的是_fields, _make(), _asdict()。如下:

# namedtuple專有屬性:from collections import namedtuplePerson=namedtuple('Person',['name', 'age', 'score'])print(Person._fields) # ('name', 'age', 'score')# _fields屬性是一個(gè)包含這個(gè)類所有屬性名稱的tupleperson1=('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的方式展示出來。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Python的namedtuple使用詳解
每個(gè)程序員都應(yīng)該知道的 5 個(gè)基本 Python 技巧
Python裝飾器的實(shí)現(xiàn)原理
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服