关于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环境下,运行结果一并显示。