collections 中的namedtuple

namedtuple 基本用法

Tuple还有一个兄弟,叫namedtuple。虽然都是tuple,但是功能更为强大。对于namedtuple,你不必再通过索引值进行访问,你可以把它看做一个字典通过名字进行访问,只不过其中的值是不能改变的。

from collections import namedtuple
Animal = namedtuple('Animal', 'name age type')
perry = Animal(name="perry", age=31, type='cat')
print(perry)
print(perry.name)
# Animal(name='perry', age=31, type='cat')
# perry

为了构造一个namedtuple需要两个参数,分别是tuple的名字和其中域的名字。比如在上例中,tuple的名字是“Animal”,它包括三个域,分别是“name”、“age”和“type”。

Namedtuple比普通tuple具有更好的可读性,可以使代码更易于维护。同时与字典相比,又更加的轻量和高效。

  • 但是有一点需要注意,就是namedtuple中的属性都是不可变的。任何尝试改变其属性值的操作都是非法的。
  • Namedtuple还有一个非常好的一点是,它与tuple是完全兼容的。也就是说,我们依然可以用索引去访问一个namedtuple。

namedtuple特性

具名元组(namedtuple)除了拥有继承自基本元组的所有方法之外,还提供了额外的三个方法和两个属性,为了防止命名冲突,这些方法都会以下划线开头。

_make(iterable)

这是一个类函数,参数是一个迭代器,可以使用这个函数来构建具名元组实例

Point = namedtuple('Point', ['x', 'y'])
t = [11, 22]
print(Point._make(t))
#Point(x=11, y=22)

_asdict()

实例方法,根据具名元组的名称和其元素值,构建一个OrderedDict返回。

Point = namedtuple('Point', ['x', 'y'])
p =Point(x=11, y=22)
print(p._asdict())
#OrderedDict([('x', 11), ('y', 22)])

_replace(**kwargs)

实例方法,根据传入的关键词参数,替换具名元组的相关参数,然后返回一个新的具名元组,注意这里的拷贝方式。

Point = namedtuple('Point', ['x', 'y'])
p = Point(x=11, y=22)
print(p._replace(x=33))
print(p)
#Point(x=33, y=22)
#Point(x=11, y=22)

_fields

这是一个实例属性,存储了此具名元组的元素名称元组,在根据已经存在的具名元组创建新的具名元组的时候使用

Point = namedtuple('Point', ['x', 'y'])
p = Point(x=11, y=22)
print(p._fields)

Color = namedtuple('Color', 'red green blue')
Pixel = namedtuple('Pixel', Point._fields + Color._fields)
print(Pixel(11, 22, 128, 255, 0))

# ('x', 'y')
# Pixel(x=11, y=22, red=128, green=255, blue=0)

_fields_defaults

查看具名元组类的默认值

参考:

(1)https://baijiahao.baidu.com/s?id=1613589944704758634&wfr=spider&for=pc(Python进阶之路:namedtuple

(2). https://www.jianshu.com/p/60e6484a7088(namedtuple工厂函数精讲

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值