前言这个模块实现了特定目标的容器,以提供Python标准内建容器dict
,list
,set
, 和tuple
的替代选择 。这个模块提供了以下几个函数
函数作用namedtuple()创建命名元组子类的工厂函数deque类似列表(list)的容器 , 实现了在两端快速添加(append)和弹出(pop)ChainMap类似字典(dict)的容器类,将多个映射集合到一个视图里面Counter字典的子类,提供了可哈希对象的计数功能OrderedDict字典的子类,保存了他们被添加的顺序defaultdict字典的子类,提供了一个工厂函数,为字典查询提供一个默认值UserDict封装了字典对象,简化了字典子类化UserList封装了列表对象 , 简化了列表子类化UserString封装了字符串对象,简化了字符串子类化namedtuplenamedtuple的由来因为元组的局限性:不能为元组内部的数据进行命名,所以往往我们并不知道一个元组所要表达的意义,所以引入namedtuple
这个工厂函数,来构造一个带字段名的元组 。namedtuple
继承自tuple
类命名元组赋予每个位置一个含义,提供可读性 。它们可以用于任何普通元组,并添加了通过名字获取值的能力 , 通过索引值也是可以的 。
namedtuple的格式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默认值为2module=None
: 如果 module 值有定义,命名元组的 module 属性值就被设置 。
name
、age
、height
,并给age设置默认值为18,给height设置了默认值180User = namedtuple('User', ['name', 'age', 'height'], defaults=(18, 180))print(User.__mro__)
我们查看结果(<class '__main__.User'>, <class 'tuple'>, <class 'object'>)
可以看到我们声明的User类是继承于tuple
, 接下来我们创建实例user1 = User(name='jkc')user2 = User(name='jkc2', age=20, height=198)print(user1)print(user2)print(user1.name)print(user2.age)
运行结果为User(name='jkc', age=18, height=180)User(name='jkc2', age=20, height=198)jkc20
namedtuple的方法和属性命名元组还支持三个额外的方法和两个属性 。为了防止字段名冲突,方法和属性以下划线开始 。_make(iterable)
类方法从存在的序列或迭代实例创建一个新实例 。>>> t = ['jkc3', 25, 190]>>> User._make(t)User(name='jkc3', age=25, height=190)
_asdict()
返回一个新的 dict,它将字段名称映射到它们对应的值>>> user4 = User(name='jkc4', age=28, height=200)>>> user4._asdict(){'name': 'jkc4', 'age': 28, 'height': 200}
_replace(**kwargs)
返回一个新的命名元组实例,并将指定域替换为新的值>>> user5 = User(name='jkc5', age=30, height=210)>>> user5._replace(age=18)User(name='jkc5', age=30, height=210)
_fields
字符串元组列出了字段名 。用于提醒和从现有元组创建一个新的命名元组类型>>> user5._fields('name', 'age', 'height')
_field_defaults
字典将字段名称映射到默认值 。【26 python进阶collections标准库】
>>> User._field_defaults{'name': 'jkc', 'age': 18, 'height': 180}
转换一个字典到命名元组,使用 ** 两星操作符>>> d = {'name': 'jkc6', 'age': 18, 'height': 180}>>> User(**d)User(name='jkc6', age=18, height=180)
OrderedDict有序字典就像常规字典一样 , 但有一些与排序操作相关的额外功能 。由于内置的
推荐阅读
- 信号量 C# 多线程访问之 SemaphoreSlim【C# 进阶】
- 炉石传说新手攻略萌新到底怎么玩(炉石传说新手进阶流程)
- 38 全球名校AI课程库| 马萨诸塞大学 · 自然语言处理进阶课程『Advanced Natural Language Processing』
- Python基础指面向对象:2、动静态方法
- Python基础之面向对象:3、继承与派生
- ysoserial CommonsCollections2 分析
- 如何免安装使用 Python?推荐 17 个在线的 Python 解释器!
- Python处理刚刚,分钟,小时,天前等时间
- python渗透测试入门——取代netcat
- 六 Selenium4+Python3系列 - Selenium的三种等待,强制等待、隐式等待、显式等待