python映射关系用什么数据结构?dict tuple dataclass nametuple

数据类dataclass和nametuple

很多时候我们需要定义一个数据结构需要储存映射关系,例如我们现在遇到一个场景要存储rgb三色的数值数据

  • dict
Color = {'r': 255, 'g': 255, 'b': 255}


def print_color(color_info):
    print(f"颜色r值为{color_info.get('r')}")
    print(f"颜色g值为{color_info.get('g')}")
    print(f"颜色b值为{color_info.get('b')}")

当我们要用到的时候可以通过get方法获取到里面的rgb对应的值,但是你会发现这种方法有一个很大的缺陷,当你项目大的时候,你不知道color_info里面有什么key,你不知道要给print_color传入怎么样的字典数据。

  • turple
Color = (255, 255, 255)

def print_color(color_info):
    print(f"颜色r值为{color_info[0]}")
    print(f"颜色g值为{color_info[1]}")
    print(f"颜色b值为{color_info[2]}")

用元祖的方式缺陷更明显,我们咋知道第一个元素是r,第二个元素是g,第三个元素是b,甚至可能会出现元祖取值越界的错误

  • 基础类
class Color:
    def __init__(self, r: float, g: float, b: float):
        self.r = r
        self.g = g
        self.b = b

def print_color(color_info:Color):
    print(f"颜色r值为{color_info.r}")
    print(f"颜色g值为{color_info.g}")
    print(f"颜色b值为{color_info.b}")

我们可以定义一个基础类,实例化一个对象,并且用typehint说明它是Color类,我们在使用时pycharm会有提示,这种方法可以很好的维护,调用者也知道要传入什么对象,但是不够简洁,并且python的类属性是存储在__dict__里面的,底层数据结构是dict,空间复杂度比较大

  • NameTuple
from typing import NamedTuple
class Color(NamedTuple):
    r: float
    g: float
    b: float

def print_color(color_info:Color):
    print(f"颜色r值为{color_info.r}")
    print(f"颜色g值为{color_info.g}")
    print(f"颜色b值为{color_info.b}")

使用NamedTuple的方式,并且用typehint说明它是Color类,我们在使用时pycharm会有提示,这种方法优于前三种

  • dataclass
@dataclass
class Color:
    r: float
    g: float
    b: float

def print_color(color_info:Color):
    print(f"颜色r值为{color_info.r}")
    print(f"颜色g值为{color_info.g}")
    print(f"颜色b值为{color_info.b}")

使用dataclass方法,和NameTuple一样,这种方式也能很好的解决问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值