zoukankan      html  css  js  c++  java
  • 5.3.5 namedtuple() 创建命名字段的元组结构

    在命名元组里。给每一个元组的位置加入一个名称,而且能够通过名称来訪问。大大地提高可读性,以便写出清晰代码,提高代码的维护性。事实上它就像C++里的结构体。

    collections.namedtuple(typename, field_names, verbose=False, rename=False) 

    返回一个新类型名称typenname的元组。參数field_names是一个字串表示的元素名称,每一个字段之间能够通过空格、逗号方式来分隔,比方’x y’,’x, y’。

    另外也能够採用列表的方式,比方[‘x’, ‘y’]。在字段名称命名上须要注意的是每一个字段要是有效的python标识符规则,同一时候不能是pythonkeyword。另外不要下面划线或数字开头。

    假设參数renameTrue就会自己主动地把不合法名称转换为对应合法的名称,比方:['abc', 'def', 'ghi', 'abc']转换为['abc', '_1', 'ghi', '_3'],在这里把def转换_1,同一时候把反复的abc转换_3

    假设參数verboseTrue就会自己主动打印_source属性。

    样例:

    #python 3.4

    import collections

    Point = collections.namedtuple('Point', 'x, y, z')

    p1 = Point(30, 40, 50)

    print(p1)

    print(p1[0] + p1[1] + p1[2])

    x, y, z = p1

    print(x, y, z)

    print(p1.x, p1.y, p1.z)

    结果输出例如以下:

    Point(x=30, y=40, z=50)

    120

    30 40 50

    30 40 50

    classmethod somenamedtuple._make(iterable)

    从已经存在迭代对象或者序列生成一个新的命名元组。

    样例:

    #python 3.4

    import collections

    Point = collections.namedtuple('Point', 'x, y, z')

    t = [10, 20, 30]

    p1 = Point._make(t)

    print(p1)

    结果输出例如以下:

    Point(x=10, y=20, z=30)

    somenamedtuple._asdict() 

    把命名元组生成一个新的OrderedDict对象返回,能够使用内置函数vars()实现对应的功能。

    样例:

    #python 3.4

    import collections

    Point = collections.namedtuple('Point', 'x, y, z')

    t = [10, 20, 30]

    p1 = Point._make(t)

    print(p1._asdict())

    print(vars(p1))

    结果输出例如以下:

    OrderedDict([('x', 10), ('y', 20), ('z', 30)])

    OrderedDict([('x', 10), ('y', 20), ('z', 30)])

    somenamedtuple._replace(kwargs) 

    对指定的字段的值进行替换。并返回新的命名元组。

    样例:

    #python 3.4

    import collections

    Point = collections.namedtuple('Point', 'x, y, z')

    t = [10, 20, 30]

    p1 = Point._make(t)

    print(p1._replace(x=100))

    print(vars(p1))

    结果输出例如以下:

    Point(x=100, y=20, z=30)

    OrderedDict([('x', 10), ('y', 20), ('z', 30)])

    somenamedtuple._source 

    返回创建命名元组相关的python代码字符串。能够把它打印出来,或者使用exec()函数运行。或者输出到文件中,再给别的代码导入。

    样例:

    #python 3.4

    import collections

    Point = collections.namedtuple('Point', 'x, y, z')

    t = [10, 20, 30]

    p1 = Point._make(t)

    print(p1._source)

    输出结果例如以下:

    from builtins import property as _property, tuple as _tuple

    from operator import itemgetter as _itemgetter

    from collections import OrderedDict

    class Point(tuple):

        'Point(x, y, z)'

        __slots__ = ()

        _fields = ('x', 'y', 'z')

        def __new__(_cls, x, y, z):

            'Create new instance of Point(x, y, z)'

            return _tuple.__new__(_cls, (x, y, z))

        @classmethod

        def _make(cls, iterable, new=tuple.__new__, len=len):

            'Make a new Point object from a sequence or iterable'

            result = new(cls, iterable)

            if len(result) != 3:

                raise TypeError('Expected 3 arguments, got %d' % len(result))

            return result

        def _replace(_self, **kwds):

            'Return a new Point object replacing specified fields with new values'

            result = _self._make(map(kwds.pop, ('x', 'y', 'z'), _self))

            if kwds:

                raise ValueError('Got unexpected field names: %r' % list(kwds))

            return result

        def __repr__(self):

            'Return a nicely formatted representation string'

            return self.__class__.__name__ + '(x=%r, y=%r, z=%r)' % self

        @property

        def __dict__(self):

            'A new OrderedDict mapping field names to their values'

            return OrderedDict(zip(self._fields, self))

        def _asdict(self):

            'Return a new OrderedDict which maps field names to their values.'

            return self.__dict__

        def __getnewargs__(self):

            'Return self as a plain tuple.  Used by copy and pickle.'

            return tuple(self)

        def __getstate__(self):

            'Exclude the OrderedDict from pickling'

            return None

        x = _property(_itemgetter(0), doc='Alias for field number 0')

        y = _property(_itemgetter(1), doc='Alias for field number 1')

        z = _property(_itemgetter(2), doc='Alias for field number 2')

    somenamedtuple._fields 

    返回命名元组的字段列表。

    能够用于从已经创建命名元组组合产生新的元组。

    样例:

    #python 3.4

    import collections

    Point = collections.namedtuple('Point', 'x, y, z')

    print(Point._fields)

    Point4 = collections.namedtuple('Point4', Point._fields + ('w',))

    print(Point4, Point4._fields)

    结果输出例如以下:

    ('x', 'y', 'z')

    <class '__main__.Point4'> ('x', 'y', 'z', 'w')

    使用命名元组从csv文件或者SQLite生成结构体信息保存:

    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)

    从这个样例里。能够看到从csv文件读取之后。就能够函数map的运算。生成一个EmployeeRecord结构体记录了,这样能够把行记录转换对应的结构化的信息。就方便查找,排序等操作。

    使用命名元组作为基类继承:

    #python 3.4

    import collections

    class Point(collections.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

    蔡军生 QQ:9073204 深圳

  • 相关阅读:
    leetcode Convert Sorted List to Binary Search Tree
    leetcode Convert Sorted Array to Binary Search Tree
    leetcode Binary Tree Level Order Traversal II
    leetcode Construct Binary Tree from Preorder and Inorder Traversal
    leetcode[105] Construct Binary Tree from Inorder and Postorder Traversal
    证明中序遍历O(n)
    leetcode Maximum Depth of Binary Tree
    限制 button 在 3 秒内不可重复点击
    HTML 和 CSS 画三角形和画多边行基本原理及实践
    在线前端 JS 或 HTML 或 CSS 编写 Demo 处 JSbin 与 jsFiddle 比较
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/6953715.html
Copyright © 2011-2022 走看看