命名元组nametuple

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

    原文作者:海贼之路飞
    原文地址: https://www.jianshu.com/p/c2743b05499a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞