關(guān)于tuple的一些知識(shí)點(diǎn)
tuple的一些特性
- 不可變性
- 可迭代(iterable)當(dāng)對(duì)象包含
__iter__
或者__getitem__
就是可迭代對(duì)象 - 拆包 (包含位置信息)
- 不可變不是絕對(duì)的(當(dāng)包含可變對(duì)象的時(shí)候,如列表)
tuple比list好的地方
tuple是不可變的,immutable的重要性
- 性能優(yōu)化:指元素全為immutable的tuple會(huì)作為常量在編譯的時(shí)候哪廓,因此產(chǎn)生了顯著地速度差異
- 線程安全
- 可以作為dict的key(immutable可哈希)
- 拆包特性
user_tuple = ("hongshaorou", 26, 172)
name, *other = user_tuple
user_tuple = [1,2,3]
a, b, c = user_tuple
關(guān)于nametuple的知識(shí)點(diǎn)
# 我們是使用namedtuple生成類,而不是對(duì)象
from collections import namedtuple
# 生成類
User = namedtuple("User", ["name", "age", "height"])
# 根據(jù)類創(chuàng)建命名實(shí)例
user = User(name="hongshaorou", age=24, height=165)
#我們可以使用點(diǎn)獲得屬性值
print(user.age, user.name, user.height)
相當(dāng)于 創(chuàng)建一個(gè)類
class User:
def __init__(self, name, age, heught):
pass
為什么我們不使用創(chuàng)建類的方式而是使用nametuple?
第一點(diǎn): 使用nametuple簡(jiǎn)潔
第二點(diǎn): 使用nametuple節(jié)省空間叉钥,省了很多創(chuàng)建類的時(shí)候的內(nèi)置變量
實(shí)例: user 表的數(shù)據(jù)全部取出然后加一個(gè)列
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"
}
對(duì)于 _make()方法傳入的只要是可迭代對(duì)象都可以,但是傳入的數(shù)值個(gè)數(shù)必須和屬性值一致 當(dāng)傳入字典的時(shí)候校读,不會(huì)有值
user = User._make(user_type)
user = User._make(user_list)
# user = User._make(user_dict)
因?yàn)閚ametuple繼承tuple 因此同意具有拆包的功能
name, age, *other = user
對(duì)于 _asdict 方法會(huì)將nametuple轉(zhuǎn)化為OrderDict
user_info_dict = user._asdict()
如果疑問(wèn)錯(cuò)誤請(qǐng)私信沼侣,運(yùn)行結(jié)果暫時(shí)未給出,下篇將會(huì)在ipython環(huán)境下歉秫,運(yùn)行結(jié)果一并顯示蛾洛。