python进阶(26)collections标准库


namedtuple的由来

因为元组的局限性:不能为元组内部的数据进行命名,所以往往我们并不知道一个元组所要表达的意义,所以引入namedtuple这个工厂函数,来构造一个带字段名的元组。namedtuple继承自tuple
命名元组赋予每个位置一个含义,提供可读性。它们可以用于任何普通元组,并添加了通过名字获取值的能力,通过索引值也是可以的。
 

namedtuple的格式

highlighter- Python

collections.namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)
  • typename: 返回一个新的元组子类,名为typename。这个新的子类用于创建类元组的对象,可以通过字段名来获取属性值,同样也可以通过索引和迭代获取值。
  • field_names: 像['x', 'y'] 一样的字符串序列。另外field_names可以是一个纯字符串,用空白或逗号分隔开元素名,比如 'x y' 或者 'x, y' 。
  • rename=False: 如果rename为true,无效字段名会自动转换成_+索引值,比如 ['abc', 'def', 'ghi', 'abc'] 转换成 ['abc', '_1', 'ghi', '_3'] , 消除关键词def和重复字段名abc。
  • default=None: defaults 可以为 None 或者是一个默认值的 iterable 。default默认值赋值跟我们平常的默认值相反,default默认值是从最右边开始,比如field_names中提供了3个字段['x', 'y', 'z'],default默认值设置为(1, 2),那么我们必须为x指定1个值,y默认值为1,z默认值为2
  • module=None: 如果 module 值有定义,命名元组的 module 属性值就被设置。
     

namedtuple声明以及实例化

我们首先创建一个User类,定义3个字段nameageheight,并给age设置默认值为18,给height设置了默认值180
python

User = namedtuple('User', ['name', 'age', 'height'], defaults=(18, 180))
print(User.__mro__)

我们查看结果

python

(<class '__main__.User'>, <class 'tuple'>, <class 'object'>)

可以看到我们声明的User类是继承于tuple,接下来我们创建实例

python

user1 = User(name='jkc')
user2 = User(name='jkc2', age=20, height=198)
print(user1)
print(user2)
print(user1.name)
print(user2.age)

运行结果为

python

User(name='jkc', age=18, height=180)
User(name='jkc2', age=20, height=198)
jkc
20

 

namedtuple的方法和属性

命名元组还支持三个额外的方法和两个属性。为了防止字段名冲突,方法和属性以下划线开始。
_make(iterable) 类方法从存在的序列或迭代实例创建一个新实例。

python

>>> t = ['jkc3', 25, 190]
>>> User._make(t)
User(name='jkc3', age=25, height=190)

 

_asdict() 返回一个新的 dict ,它将字段名称映射到它们对应的值

python

>>> user4 = User(name='jkc4', age=28, height=200)
>>> user4._asdict()
{'name': 'jkc4', 'age': 28, 'height': 200}

 

_replace(**kwargs) 返回一个新的命名元组实例,并将指定域替换为新的值

python

>>> user5 = User(name='jkc5', age=30, height=210)
>>> user5._replace(age=18)
User(name='jkc5', age=30, height=210)

 

_fields 字符串元组列出了字段名。用于提醒和从现有元组创建一个新的命名元组类型

python

>>> user5._fields        
('name', 'age', 'height')

 

_field_defaults 字典将字段名称映射到默认值

python

>>> User._field_defaults
{'name': 'jkc', 'age': 18, 'height': 180}

 

转换一个字典到命名元组,使用 ** 两星操作符

python

>>> d = {'name': 'jkc6', 'age': 18, 'height': 180}
>>> User(**d)
User(name='jkc6', age=18, height=180)

本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;

2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;

3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;

4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;

5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/293505.html

(0)
上一篇 2022年11月26日
下一篇 2022年11月26日

相关推荐

发表回复

登录后才能评论