zoukankan      html  css  js  c++  java
  • python模块学习之collections

    更多信息请前往官网网址:

    https://docs.python.org/3.6/library/collections.html
    

     8.3.5. namedtuple() 命名字段的元组的工场函数

    命名元组为元组中的每个位置分配意义,并允许更可读,自我记录的代码。 它们可以在使用常规元组的地方使用,它们增加了通过名称而不是位置索引访问字段的能力。

    collections.namedtuple(typename, field_names, *, verbose=False, rename=False, module=None)¶

    返回名为typename的新元组子类。新的子类用于创建具有可通过属性查找访问的字段以及可索引和可​​迭代的元组类对象。子类的实例也有一个有用的docstring(带有typename和field_names)和一个有用的__repr __()方法,它以name = value格式列出元组内容。

    field_names是诸如['x','y']的字符串序列。或者,field_names可以是单个字符串,每个字段名由空格和/或逗号分隔,例如“x y”或“x,y”。

    任何有效的Python标识符可以用于字段名,除了以下划线开头的名称。有效的标识符由字母,数字和下划线组成,但不能以数字或下划线开头,不能是关键字,如class,for,return,global,pass或raise。

    如果重命名为true,则无效的字段名称将自动替换为位置名称。例如,['abc','def','ghi','abc']转换为['abc','_1','ghi','_3'],消除关键字def和重复字段名abc 。

    如果verbose为真,则类定义在构建后打印。此选项已过时;相反,打印_source属性更为简单。

    如果定义了模块,则将所指定的元组的__module__属性设置为该值。

    命名元组实例没有每个实例的字典,所以它们是轻量级的,不需要比常规元组更多的内存。

    在版本3.1中更改:增加了对重命名的支持。

    版本3.6更改:verbose和rename参数成为仅关键字参数。

    在版本3.6中更改:添加了模块参数。

    >>> #基本的例子
    ...
    >>> Point = collections.namedtuple('Point',['x','y'])
    >>> p = Point(11,y=22)
    >>> p[0]
    11
    >>> p[0]+p[1]
    33
    >>> x,y = p
    >>> x,y
    (11, 22)
    >>> p.x
    11
    >>> p
    Point(x=11, y=22)
    

    命名的元组对于将字段名称分配给csv或sqlite3模块返回的结果元组特别有用:

    EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')
    
    import csv
    for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))):
        print(emp.name, emp.title)
    
    import sqlite3
    conn = sqlite3.connect('/companydata')
    cursor = conn.cursor()
    cursor.execute('SELECT name, age, title, department, paygrade FROM employees')
    for emp in map(EmployeeRecord._make, cursor.fetchall()):
        print(emp.name, emp.title)
    

    除了从元组继承的方法,命名的元组还支持三个附加方法和两个属性。 为了防止与字段名称冲突,方法和属性名称以下划线开头。

    classmethod somenamedtuple._make(iterable)

    从现有序列或可迭代创建新实例的Class方法。

    >>> t = [11, 22]
    >>> Point._make(t)
    Point(x=11, y=22)
    

    somenamedtuple._asdict()

    返回一个新的OrderedDict,将字段名称映射到相应的值:

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

    在版本3.1中更改:返回OrderedDict而不是常规的dict。

    somenamedtuple._replace(**kwargs)  

    返回namedTuple的新实例,用新值替换特定字段:

    >>> p = Point(x=11, y=22)
    >>> p._replace(x=33)
    Point(x=33, y=22)
    
    >>> for partnum, record in inventory.items():
    ...     inventory[partnum] = record._replace(price=newprices[partnum], timestamp=time.now())
    

    somenamedtuple._source  

    一个包含纯Python源代码的字符串,用于创建指定的元组类。 来源使得命名的元组自我记录。 它可以打印,使用exec()执行,或保存到文件并导入。

    版本3.3中新增。

    somenamedtuple._fields

    字符串元组列出字段名称。 用于内省和从现有的指定元组创建新的命名元组类型。

    >>> p._fields            # view the field names
    ('x', 'y')
    
    >>> Color = namedtuple('Color', 'red green blue')
    >>> Pixel = namedtuple('Pixel', Point._fields + Color._fields)
    >>> Pixel(11, 22, 128, 255, 0)
    Pixel(x=11, y=22, red=128, green=255, blue=0)
    

    要检索名称存储在字符串中的字段,请使用getattr()函数:

    >>> getattr(p, 'x')
    11
    

    要将字典转换为指定的元组,请使用双星运算符(如“解包参数列表”中所述):

    >>> d = {'x': 11, 'y': 22}
    >>> Point(**d)
    Point(x=11, y=22)
    

    由于一个指定的元组是一个普通的Python类,所以很容易添加或更改一个子类的功能。 以下是如何添加计算字段和固定宽度的打印格式:

    >>> class Point(namedtuple('Point', ['x', 'y'])):
    ...     __slots__ = ()
    ...     @property
    ...     def hypot(self):
    ...         return (self.x ** 2 + self.y ** 2) ** 0.5
    ...     def __str__(self):
    ...         return 'Point: x=%6.3f  y=%6.3f  hypot=%6.3f' % (self.x, self.y, self.hypot)
    
    >>> for p in Point(3, 4), Point(14, 5/7):
    ...     print(p)
    Point: x= 3.000  y= 4.000  hypot= 5.000
    Point: x=14.000  y= 0.714  hypot=14.018
    

    上面显示的子类将__slots__设置为空元组。 这有助于通过阻止创建实例字典来保持内存要求较低。

    子类化对于添加新的存储字段无效。 相反,只需从_fields属性创建一个新的命名元组类型:

    >>> Point3D = namedtuple('Point3D', Point._fields + ('z',))
    

    可以通过对__doc__字段进行直接分配来定制Docstrings:

    >>> Book = namedtuple('Book', ['id', 'title', 'authors'])
    >>> Book.__doc__ += ': Hardcover book in active collection'
    >>> Book.id.__doc__ = '13-digit ISBN'
    >>> Book.title.__doc__ = 'Title of first printing'
    >>> Book.authors.__doc__ = 'List of authors sorted by last name'
    

    版本3.5更改:属性文本字符串变为可写。
    可以使用_replace()来定制原型实例来实现默认值:

    >>> Account = namedtuple('Account', 'owner balance transaction_count')
    >>> default_account = Account('<owner name>', 0.0, 0)
    >>> johns_account = default_account._replace(owner='John')
    >>> janes_account = default_account._replace(owner='Jane')
    
    也可以看看
    Jan Kaliszewski的元类混合的名为tuple抽象基类的配方。 除了为命名元组提供抽象基类外,它还支持一个替代的基于元类的构造函数,方便使用命名元组进行子类化的用例。
    请参阅types.SimpleNamespace()基于基础字典而不是元组的可变命名空间。
    有关为命名元组添加类型提示的方式,请参阅typing.NamedTuple()。

      

      

      

      

      

      

      

      

  • 相关阅读:
    自己觉得好的文章(2)
    为什么要用C运行时库的_beginthreadex代替操作系统的CreateThread来创建线程?
    GraphEdit
    吴裕雄天生自然Spring BootSpring Boot与Thymeleaf实现页面信息国际化
    吴裕雄天生自然Spring BootThymeleaf基础语法
    吴裕雄天生自然Spring BootSpring Boot处理JSON数据
    吴裕雄天生自然Spring Boot基于Thymeleaf与BootStrap的Web开发实例
    吴裕雄天生自然Spring Boot基本配置和注解
    吴裕雄天生自然Spring Boot自定义Starters
    吴裕雄天生自然Spring Boot的基本配置
  • 原文地址:https://www.cnblogs.com/leomei91/p/7252045.html
Copyright © 2011-2022 走看看