tuoheng_algN/test/collections/namedtuple.py

83 lines
3.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from collections import namedtuple
"""
可命名元组-namedtuple
生成可以使用名字来访问元素内容的tuple子类命名元组赋予每个位置一个含义提供可读性和自文档性。
它们可以用于任何普通元组,并添加了通过名字获取值的能力,通过索引值也是可以的。
1、参数介绍
namedtuple(typename,field_names,*,verbose=False, rename=False, module=None)
1typename该参数指定所创建的tuple子类的类名相当于用户定义了一个新类。
2field_names该参数是一个字符串序列如 ['x''y']。此外field_names 也可直接使用单个字符串代表所有字段名,多个字段名用空格、逗号隔开,如 'x y''x,y'。任何有效的 Python 标识符都可作为字段名(不能以下画线开头)。有效的标识符可由字母、数字、下画线组成,但不能以数字、下面线开头,也不能是关键字(如 return、global、pass、raise 等)。
3rename如果将该参数设为 True那么无效的字段名将会被自动替换为位置名。例如指定 ['abc','def','ghi','abc'],它将会被替换为 ['abc', '_1','ghi','_3'],这是因为 def 字段名是关键字,而 abc 字段名重复了。
4verbose如果该参数被设为 True那么当该子类被创建后该类定义就被立即打印出来。
5module如果设置了该参数那么该类将位于该模块下因此该自定义类的 __module__ 属性将被设为该参数值。
"""
# 定义命名元组类Point
Point = namedtuple('Point', ['x', 'y'])
# 初始化Point对象即可用位置参数也可用命名参数
p = Point(11, y=22)
# 像普通元组一样用根据索引访问元素
print(p[0] + p[1])
#执行元组解包,按元素的位置解包
a, b = p
print(a, b)
#根据字段名访问各元素
print(p.x + p.y)
print(p)
"""
备注: 在Python中带有前导下划线的方法通常被认为是“私有的”。
但是namedtuple提供的其他方法(如._asdict()、._make()、._replace()等)是公开的。
除了继承元组的方法,命名元组还支持三个额外的方法和两个属性。为了防止字段名冲突,方法和属性以下划线开始。
"""
"""
_make(iterable)
类方法从存在的序列或迭代实例创建一个新实例。
"""
t = [14, 55]
print(Point._make(t))
"""
_asdict()
返回一个新的dict ,它将字段名称映射到它们对应的值:
"""
p = Point(x=11, y=22)
print(p._asdict())
"""
_replace(**kwargs)
返回一个新的命名元组实例,并将指定域替换为新的值
"""
p = Point(x=11, y=22)
p._replace(x=33)
print(p._replace(x=33))
"""
两个属性
_fields
字符串元组列出了字段名。用于提醒和从现有元组创建一个新的命名元组类型。
"""
print(p._fields)
Color = namedtuple('Color', 'red green blue')
Pixel = namedtuple('Pixel', Point._fields + Color._fields)
print(Pixel._fields)
"""
_field_defaults
字典将字段名称映射到默认值。
"""
Account = namedtuple('Account', ['type', 'balance'], defaults=[0])
print(Account._field_defaults)
print(Account('premium'))
"""
getattr()
要获取这个名字域的值,使用 getattr() 函数 :
"""
print(getattr(p, 'x'))