1. 程式人生 > 實用技巧 >Python - collections(集合類):nametuple

Python - collections(集合類):nametuple

0. 學習資料

https://www.imooc.com/video/16361

1. collections

擁有的資料結構:

__all__ = ['deque', 'defaultdict', 'namedtuple', 'UserDict', 'UserList',
            'UserString', 'Counter', 'OrderedDict', 'ChainMap']

1.1 tuple

  • 不可變的(效能優化、執行緒安全、可以作為dict的key(需要物件可雜湊)、拆包),可迭代物件

  • 拆包:自動將位置對應值與變數進行對映

    # 拆包:自動將位置對應值與變數進行對映
    one, two, three = tuple_demo
    print(one, two, three)  # 1 3 5
    
    # 拆包: 只需要取前面第一個值的情況
    on, *other = tuple_demo
    print(on)   # 1
    

1.2 nametuple

#!/usr/bin/env/python3
# -*- coding:utf-8 -*-
"""
@project: collections_mkw
@author: zy7y
@file: nametuple_test.py
@ide: PyCharm
@time: 2020/8/28
"""
from collections import namedtuple

# 生成一個類, 第一個引數為一個型別名稱,第二個引數列表是生成類的一個屬性列表
User = namedtuple("user", ["name", "age", "height"])

user = User(name="zy7y", age=18, height=157)
print(user.name, user.age, user.height)

# 可變引數、元祖解包,函式傳參方式之一
user_tuple = ("zy7y", 18)
# *user_tuple 表示解包操作,按順序解包獲得 zy7y 18 傳遞進去,
user_zy7y = User(*user_tuple, 157)
print(user_zy7y.name, user_zy7y.age, user_zy7y.height)      # zy7y 18 157

# 字典解包, 函式傳參方式之一
user_dict = {
    "name": "kelan",
    "age": 17,
    "height": 158
}
user_dict_zy7y = User(**user_dict)
print(user_dict_zy7y.name, user_dict_zy7y.age, user_dict_zy7y.height)  # kelan 17 158

# _make方法傳參, 傳入一個可迭代物件
user = User._make('str')
print(user.name, user.height, user.age)    # s r t

# _asdict() 將類屬性(nametuple)轉換成orderdict
user_dict = user._asdict()
print(user_dict)  # OrderedDict([('name', 's'), ('age', 't'), ('height', 'r')])

# nametuple拆包
name, age, height = user
print(name, age, height)    # s t r