關于tuple的一些知識點
tuple的一些特性
- 不可變性
- 可迭代(iterable)當對象包含
__iter__
或者__getitem__
就是可迭代對象 - 拆包 (包含位置信息)
- 不可變不是絕對的(當包含可變對象的時候,如列表)
tuple比list好的地方
tuple是不可變的,immutable的重要性
- 性能優化:指元素全為immutable的tuple會作為常量在編譯的時候,因此產生了顯著地速度差異
- 線程安全
- 可以作為dict的key(immutable可哈希)
- 拆包特性
user_tuple = ("hongshaorou", 26, 172)
name, *other = user_tuple
user_tuple = [1,2,3]
a, b, c = user_tuple
關于nametuple的知識點
# 我們是使用namedtuple生成類,而不是對象
from collections import namedtuple
# 生成類
User = namedtuple("User", ["name", "age", "height"])
# 根據類創建命名實例
user = User(name="hongshaorou", age=24, height=165)
#我們可以使用點獲得屬性值
print(user.age, user.name, user.height)
相當于 創建一個類
class User:
def __init__(self, name, age, heught):
pass
為什么我們不使用創建類的方式而是使用nametuple?
第一點: 使用nametuple簡潔
第二點: 使用nametuple節省空間,省了很多創建類的時候的內置變量
實例: user 表的數據全部取出然后加一個列
User = namedtuple("User", ["name", "age", "height", "edu"])
user_type = ("hongshaorou", 24, 165)
user = User(*user_type, "master")
user_dict = {
"name": "hongshaorou",
"age": 24,
"height": 165
}
user = User(**user_dict, edu="master")
方法的使用
user_type = ("hongshaorou", 24, 165, "master")
user_list = ["hongshaorou", 24, 165, "master"]
user_dict = {
"name": "hongshaorou",
"age": 24,
"height": 165,
"edu": "master"
}
對于 _make()方法傳入的只要是可迭代對象都可以,但是傳入的數值個數必須和屬性值一致 當傳入字典的時候,不會有值
user = User._make(user_type)
user = User._make(user_list)
# user = User._make(user_dict)
因為nametuple繼承tuple 因此同意具有拆包的功能
name, age, *other = user
對于 _asdict 方法會將nametuple轉化為OrderDict
user_info_dict = user._asdict()
如果疑問錯誤請私信,運行結果暫時未給出,下篇將會在ipython環境下,運行結果一并顯示。