说说 Python 的具名元组

Python 提供的元组与列表类似,不同之处在于元组的元素不能修改。虽然有时候很方便,但因为不能为元组内部的数据进行命名,所以没有那么直观。

Python 引入了 collections.namedtuple 这个工厂函数,用来构造一个带字段名的元组。

(1)声明与实例化

我们一般这样来构造具名元组:

namedtuple(typename, field_names)
参数 说明
typename 元组名称。
field_names 元组中元素的名称;可以是有多个字符串组成的可迭代对象,或者是有空格分隔开的字段名组成的字符串。

下面是声明一个具名元组及其实例化方法的示例:

import collections
import logging
logging.basicConfig(level=logging.DEBUG, format='%(levelname)s - %(message)s')


Card = collections.namedtuple('Card', ['rank', 'suit'])
select_card=Card('10', 'spades')
logging.info('select_card -> %s',select_card)

运行结果:

INFO - select_card -> Card(rank='10', suit='spades')

这里通过 collections.namedtuple 创建了一个具名元组,用来表示一张扑克牌。rank 表示扑克牌点数,suit 表示花色。可以通过字段名或者位置来实例化一个具名元组。这里的 select_card 表示抽到一张黑桃 10。

(2)特有属性与方法

具名元组还拥有以下这些特有的属性与方法。

特有属性与方法 说明
_fields 该具名元组所包含的所有字段名的元组
_make(iterable) 接受一个可迭代对象来创建具名元组实例
_asdict() 返回 collections.OrdereDict 形式,可以利用它来展示元组内的信息
# 展示所有属性名称
logging.info('select_card._fields -> %s',select_card._fields)

# _make 接受 list 作为入参
select_card=Card._make(['10', 'spades'])
logging.info('select_card -> %s',select_card)

# 转换为字典
logging.info('select_card._asdict() -> %s',select_card._asdict())

运行结果:

INFO - select_card._fields -> ('rank', 'suit')
INFO - select_card -> Card(rank='10', suit='spades')
INFO - select_card._asdict() -> {'rank': '10', 'suit': 'spades'}

另外,通过 . 语法还可以获取具名元组中所对应的属性值:

logging.info('select_card.rank -> %s',select_card.rank)
logging.info('select_card.suit -> %s',select_card.suit)

运行结果:

INFO - select_card.rank -> 10
INFO - select_card.suit -> spades

猜你喜欢

转载自blog.csdn.net/deniro_li/article/details/106870401