zoukankan      html  css  js  c++  java
  • py学习:namedtuple 具名元组

    元组的缺点

    元组当做记录有一个缺点,你不知道元组中的每一项具体代表什么意思,只有你自己知道,如果你是API的提供方,调用者使用你的API时,只有通过文档说明才知道你的元组中的元素各代表什么意思,如果那些需求变更,而文档没有及时更新,调用者很容易就出问题了。每次取值时,我们只能通过下标索引第0号,第1号,第2号

    namedtuple

    有一种更高级的元组叫 namedtuple ,《流畅的Python》上把它翻译为具名元组,顾名思义,就是带有名字的元组,这是什么意思呢?就是取值时不再需要通过下标索引的方式来获取了,可以直接叫名字(字段名)

    from collections import namedtuple
    # 定义namedtuple类
    User = namedtuple("User", 'name gender height weight')
    
    # 或者
    # User = namedtuple("User", ['name', 'gender', 'height', 'weight'])
    
    # 初始化namedtuple实例对象
    user = User(name="jack", gender="female", height=170, weight=120)
    
    user.name    #'jack'
    user.gender   #'female'
    

    定义 namedtuple 时,第一个参数就是元组的名字,这里很像我们自定义类中的类名,第二个参数是用空格隔开的字符串(也可以是字符串组成的列表),代表元组中的4个字段,相当于类中的4个属性。
    初始化方式和类的实例对象是一样的,如果用普通类来定义可表示为:

    class User:
    
        def __init__(self, name, gender, height, weight):
            self.name = name
            self.gender = gender
            self.height = height
            self.weight = weight
    
    user = User(name="jack", gender="female", height=170, weight=120)
    
    user.name  #'jack'
    

    对比起来,其实 namedtuple 就是一个轻量级的类,代码更简洁,当我们的类非常简单,只有属性又不需要定义其他方法时,完全可以用 namedtuple 来代替类,使用 namedtuple 效率比使用普通类更高效,同样因为内部不需要维护太多的东西。

    namedtuple 其实是继承 tuple 的一个子类,它保留了 tuple 的特性,比如通过索引获取元素,切片功能,同样地,字段不能重新赋值。

    >>> user[1:3]
    ('female', 170)
    
    >>> user[0]
    'jack'
    
    >>> user.name = 'bob'
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: can't set attribute
    

    namedtuple 比 tuple 的优势在于 namedtuple 具有可自我描述的特点,因为 tuple 中的值不看上下文你不知道具体代表什么,而 namedtuple 自己就可以说明各字段代表什么。

  • 相关阅读:
    Qt 错误汇集贴
    转:Qt编写串口通信程序全程图文讲解
    转:QT 的点点滴滴 错误总结
    转:Qt项目中遇到的一些小问题汇总
    转:AM335X 启动流程
    基于Xilinx Zynq的计算处理平台
    基于英伟达Jetson TX1的GPU处理平台
    基于6U VPX的 SRIO 接口, 和PCIe 接口的msata 固态存储卡
    国芯网 邀请国产芯片原厂入驻商城
    295-Xilinx Kintex-7 X7K325T的半高PCIe x4双路万兆光纤收发卡
  • 原文地址:https://www.cnblogs.com/wbyixx/p/14072816.html
Copyright © 2011-2022 走看看