python 命名元组结合mysql_Python的命名元组

元组(tuple)是 Python 中常见的数据类型之一,和列表(list)相似,不同的地方在于列表是可变数组,而tuple是一个不可变的数组,你不能改变元组中的值

>>> bar = ("bob", 10)

>>> bar[1] = 11

Traceback (most recent call last):

File "", line 1, in

TypeError: 'tuple' object does not support item assignment

错误提示很清晰的告诉你tuple不支持元素重新赋值。

元组除了可以看做是不可变的列表之外,还可以当做没有字段名的记录(record)。比如从一个数据库的用户表中查询出一条记录包含有:姓名、性别、身高、体重这四个字段的值,用元组来表示这条记录是:

user = ("jack", "female", 170, 120)

name = user[0]

gender = user[1]

height = user[2]

weight = user[3]

通过下标索引分别赋值给这4个变量,元组还支持自动解包,可以在一行代码中同时赋值给四个不同的变量

name, gender, height, weight = ("jack", "female", 170, 120)

使用元组表示一条记录从性能上来说是要超过列表,因为列表是可变对象,列表内部维护的东西更多,而元组则更轻量级。

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

有一种更高级的元组叫 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 "", line 1, in

AttributeError: can't set attribute

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值