歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

Python元組拆包和具名元組詳解

發(fā)布時間:2018-04-06 22:41  回復(fù):0  查看:3395   最后回復(fù):2018-04-06 22:41  

Python中元組是一個相較于其他語言比較特別的一個內(nèi)置序列類型。有些python入門教程把元組成為不可變的列表,這種說法是不完備的,其并沒有完整的概括元組的特點(diǎn)。除了用作不可變的列表,它還可以用于沒有字段名的數(shù)據(jù)記錄。下面就圍繞元組作為數(shù)據(jù)記錄屬性展開,并介紹帶字段名的具名元組函數(shù)namedtuple,列表屬性不再本文中敘述。

  元組對于數(shù)據(jù)的記錄

  元組中的每個元素都存放了記錄中一個字段的數(shù)據(jù),外加這個字段的位置,正是這個位置信息給數(shù)據(jù)賦予了意義。

  下面的一段代碼就演示了元組被當(dāng)作記錄來使用。如果在任何的表達(dá)式里我們在元組內(nèi)對元素排序,這些元素多攜帶的信息就會丟失,因為這些信息是跟它們的位置強(qiáng)關(guān)聯(lián)的。

  #把元組作記錄

  >>> xiaoming, xiaohua = (16, 18)

  >>> xiaoming

  16

  >>> students_info = [('xiaoming', 16), ('xiaohua', 18), ('hanmeimei', 20)]

  >>> for student in students_info:

  print('%s is %d years old.'%student)

  xiaoming is 16 years old.

  xiaohua is 18 years old.

  hanmeimei is 20 years old.

  >>>

  在這個示例中,我們把元組(16,18)里的元素分別賦值給變量xiaoming,xiaohua。同樣在for循環(huán)中,一個%運(yùn)算符就把student元組里的元素對應(yīng)到了Print函數(shù)的格式字符串空檔中。這兩個都是元組拆包的應(yīng)用。

  元組拆包可以應(yīng)用到任何可迭代對象上,唯一的硬性要求是,被可迭代對象中的元素數(shù)量必須要跟接受這些元素的元組的空檔數(shù)一致。除非用*來表示忽略多余的元素。

  元組拆包

  最好辨認(rèn)的元組拆包形式就是平行賦值 ,也就是把一個可迭代對象里的元素,一并賦值到由對應(yīng)的變量組成的元組中。例如:

  >>> age_list = (16,18)

  >>> xiaoming, xiaohua = age_list #這里就是元組拆包

  另一個我們熟悉的平行賦值的例子就是交換兩個變量的值:

  >>> a, b = b, a #Python就是如此的優(yōu)雅

  還可以用*運(yùn)算符把一個可迭代對象拆開作為函數(shù)的參數(shù):

  >>> divmod(20,8)

  (2, 4)

  >>> t = (20, 8)

  >>> divmod(*t)

  (2, 4)

  >>> quotient, remainder = divmod(*t)

  >>> quotient, remainder

  (2, 4)

  *來處理剩下的元素

  在Python中,函數(shù)用*args來獲取不確定數(shù)量的參數(shù)算是一種經(jīng)典寫法了。在Python3中,這個概念被擴(kuò)展到了平行賦值中:

  >>> a, b, *rest = range(5)

  >>> a, b, rest

  (0, 1, [2, 3, 4])

  >>> a, b, *rest = range(3)

  >>> a, b, rest

  (0, 1, [2])

  >>> a, b, *rest = range(2)

  >>> a, b, rest

  (0, 1, [])

  在平行賦值中,*運(yùn)算符前綴智能用在一個變量名前面,但是這個變量可以出現(xiàn)在賦值表達(dá)式的任意位置:

  >>> a, *others, b, c = range(5)

  >>> a, others, b, c

  (0, [1, 2], 3, 4)

  >>> *others, a, b, c = range(5)

  >>> others, a, b, c

  ([0, 1], 2, 3, 4)

  具名元組

  在Python中,collections.namedtuple是一個工廠函數(shù),它可以用來構(gòu)建一個帶字段名的元組和一個有名字的類。

  用namedtuple構(gòu)建的類的實例所消耗的內(nèi)存跟元組是一樣的,因為字段名都被存在對應(yīng)的類里面。這個實例跟普通的對象實例比起來也要小一些,因為python不會用 dict 來存放這些實例的屬性。

  還是使用上面的小明和小華的例子來展示一下具名元組:

  >>> from collections import namedtuple

  >>> Student = namedtuple('Student', 'name age gender')

  >>> xiaoming = Student('xiaoming', 16, 'boy')

  >>> xiaoming

  Student(name='xiaoming', age=16, gender='boy')

  >>> xiaoming.age

  16

  >>> xiaoming[2]

  'boy'

  Student = namedtuple(‘Student’, ‘name age gender’),創(chuàng)建一個具名元組,需要兩個參數(shù),一個是類名,另一個是類的各個字段名。后者可以是有多個字符串組成的可迭代對象,或者是有空格分隔開的字段名組成的字符串(比如本示例)。具名元組可以通過字段名或者位置來獲取一個字段的信息。

  具名元組的特有屬性

 ?。?nbsp;類屬性_fields:包含這個類所有字段名的元組

  >>> xiaoming._fields

  ('name', 'age', 'gender')

  . 類方法_make(iterable):接受一個可迭代對象來生產(chǎn)這個類的實例,作用等價于Student

  (*xiaohua_info)

  >>> xiaohua_info = ('xiaohua', 18, 'girl')

  >>> xiaohua = Student._make(xiaohua_info)

  >>> xiaohua

  Student(name='xiaohua', age=18, gender='girl')

  . 實例方法_asdict():把具名元組以collections.OrdereDict的形式返回,可以利用它來把元組里的信息友好的展示出來

  >>> xiaohua._asdict()

  OrderedDict([('name', 'xiaohua'), ('age', 18), ('gender', 'girl')])

  >>> for keyvalue in xiaohua._asdict().items():

  print(key,':',value)

  name : xiaohua

  age : 18

  gender : girl

 

來源:極客頭條

您還未登錄,請先登錄

熱門帖子

最新帖子

?