您好,登錄后才能下訂單哦!
前言
在Python中元組是一個相較于其他語言比較特別的一個內置序列類型。有些python入門教程把元組成為“不可變的列表”,這種說法是不完備的,其并沒有完整的概括元組的特點。除了用作不可變的列表,它還可以用于沒有字段名的數據記錄。下面的內容就圍繞元組作為數據記錄屬性展開,并介紹帶字段名的具名元組函數namedtuple,列表屬性不再本文中敘述。
元組對于數據的記錄
元組中的每個元素都存放了記錄中一個字段的數據,外加這個字段的位置,正是這個位置信息給數據賦予了意義。
下面的一段代碼就演示了元組被當作記錄來使用。如果在任何的表達式里我們在元組內對元素排序,這些元素多攜帶的信息就會丟失,因為這些信息是跟它們的位置強關聯的。
#把元組作記錄 >>> 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循環中,一個%運算符就把student元組里的元素對應到了Print函數的格式字符串空檔中。這兩個都是元組拆包的應用。
元組拆包可以應用到任何可迭代對象上,唯一的硬性要求是,被可迭代對象中的元素數量必須要跟接受這些元素的元組的空檔數一致。除非用*來表示忽略多余的元素。
元組拆包
最好辨認的元組拆包形式就是平行賦值 ,也就是把一個可迭代對象里的元素,一并賦值到由對應的變量組成的元組中。例如:
>>> age_list = (16,18) >>> xiaoming, xiaohua = age_list #這里就是元組拆包
另一個我們熟悉的平行賦值的例子就是交換兩個變量的值:
>>> a, b = b, a #Python就是如此的優雅
還可以用*運算符把一個可迭代對象拆開作為函數的參數:
>>> divmod(20,8) (2, 4) >>> t = (20, 8) >>> divmod(*t) (2, 4) >>> quotient, remainder = divmod(*t) >>> quotient, remainder (2, 4)
用*來處理剩下的元素
在Python中,函數用*args來獲取不確定數量的參數算是一種經典寫法了。在Python3中,這個概念被擴展到了平行賦值中:
>>> 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, [])
在平行賦值中,*運算符前綴智能用在一個變量名前面,但是這個變量可以出現在賦值表達式的任意位置:
>>> 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是一個工廠函數,它可以用來構建一個帶字段名的元組和一個有名字的類。
用namedtuple構建的類的實例所消耗的內存跟元組是一樣的,因為字段名都被存在對應的類里面。這個實例跟普通的對象實例比起來也要小一些,因為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'),
創建一個具名元組,需要兩個參數,一個是類名,另一個是類的各個字段名。后者可以是有多個字符串組成的可迭代對象,或者是有空格分隔開的字段名組成的字符串(比如本示例)。具名元組可以通過字段名或者位置來獲取一個字段的信息。
具名元組的特有屬性
類屬性_fields:包含這個類所有字段名的元組
>>> xiaoming._fields ('name', 'age', 'gender')
類方法_make(iterable):
接受一個可迭代對象來生產這個類的實例,作用等價于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 key, value in xiaohua._asdict().items(): print(key,':',value) name : xiaohua age : 18 gender : girl
總結
以上所述是小編給大家介紹的Python元組拆包和具名元組解析實例詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。