首先,我会介绍下使用namedtuple所需要了解的基本概念,然后讲解如何使用namedtuple,最后使用namedtuple来创建一摞纸牌。理解这些之后,就可以权衡利弊,并在生产中使用

基本概念

namedtuple是一个 工厂函数,定义在python标准库的collections模块中,使用此函数可以创建一个可读性更强的元组

namedtuple函数所创建(返回)的是一个 元组的子类(python中基本数据类型都是类,且可以在buildins模块中找到)

namedtuple函数所创建元组,中文名称为 具名元组

在使用普通元组的时候,我们只能通过index来访问元组中的某个数据

使用具名元组,我们既可以使用index来访问,也可以使用具名元组中每个字段的名称来访问

值得注意的是,具名元组和普通元组所需要的内存空间相同,所以 不必使用性能来权衡是否使用具名元组

如何使用

namedtuple是一个函数,我们先来看下他的参数

参数解析

def namedtuple(typename, field_names, *, rename=False, defaults=None, module=None):

有两个必填参数typename和field_names

typename

参数类型为字符串

具名元组返回一个元组子对象,我们要为这个对象命名,传入typename参数即可

field_names

参数类型为字符串序列

用于为创建的元组的每个元素命名,可以传入像['a', 'b']这样的序列,也可以传入'a b'或'a, b'这种被逗号或空格分割的单字符串

必须是合法的标识符。不能是关键字如class,def等

rename

注意的参数中使用了*,其后的所有参数必须指定关键字

参数为布尔值

默认为False。当我们指定为True时,如果定义field_names参数时,出现非法参数时,会将其替换为位置名称。如['abc', 'def', 'ghi', 'abc']会被替换为['abc', '_1', 'ghi', '_3']

defaults

参数为None或者可迭代对象

当此参数为None时,创建具名元组的实例时,必须要根据field_names传递指定数量的参数

当设置defaults时,我们就为具名元组的元素赋予了默认值,被赋予默认值的元素在实例化的时候可以不传入

当defaults传入的序列长度和field_names不一致时,函数默认会右侧优先

如果field_names是['x', 'y', 'z'],defaults是(1, 2),那么x是实例化必填参数,y默认为1,z默认为2

基本使用

理解了namedtuple函数的参数,我们就可以创建具名元组了

>>> Point = namedtuple('Point', ['x', 'y']) # 返回一个名为`Point`的类,并赋值给名为`Point`的变量

>>> p = Point(11, y=22) # 可以根据参数的位置,或具名参数来实例化(像普通的类一样)

>>> p[0] + p[1] # 具名元组可以像普通元组一样通过`index`访问

33

>>> x, y = p # 具名元组可以像普通元组一样解包

>>> x, y

(11, 22)

>>> p.x + p.y # 具名元组还可以通过属性名称访问元组内容

33

>>> p # 具名元组在调用`__repr__`,打印实例时,更具可读性

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)

特性

具名元组除了拥有继承自基本元组的所有方法之外,还提供了额外的三个方法和两个属性,为了防止命名冲突,这些方法都会以下划线开头

_make(iterable)

这是一个类函数,参数是一个迭代器,可以使用这个函数来构建具名元组实例

>>> t = [11, 22]

>>> Point._make(t)

Point(x=11, y=22)

_asdict()

实例方法,根据具名元组的名称和其元素值,构建一个OrderedDict返回

>>> p = Point(x=11, y=22)

>>> p._asdict()

OrderedDict([('x', 11), ('y', 22)])

_replace(**kwargs)

实例方法,根据传入的关键词参数,替换具名元组的相关参数,然后返回一个新的具名元组

>>> 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())

_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)

_fields_defaults

查看具名元组类的默认值

>>> Account = namedtuple('Account', ['type', 'balance'], defaults=[0])

>>> Account._fields_defaults

{'balance': 0}

>>> Account('premium')

Account(type='premium', balance=0)

使用技巧

使用getattr获取具名元组元素值

>>> getattr(p, 'x')

11

将字典转换为具名元组

>>> d = {'x': 11, 'y': 22}

>>> Point(**d)

Point(x=11, y=22)

既然具名元组是一个类,我们当然可以随心所欲的进行定制

>>> 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__值的设置可以保证具名元组保持最小的内存占用

namedtuple纸牌

import collections

# 将纸牌定义为具名元组,每个纸牌都有等级和花色

Card = collections.namedtuple('Card', 'rank suit')

class FrenchDeck:

# 等级2-A

ranks = [str(n) for n in range(2,11)] + list('JQKA')

# 花色红黑方草

suits = 'spades diamonds clubs hearts'.split()

# 构建纸牌

def __init__(self):

self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks]

# 获取纸牌

def __getitem__(self, position):

return self._cards[position]

>>> french_deck = FrenchDeck()

>>> french_deck[0]

Card(rank='2', suit='spades')

>>> french_deck[0].rank

'2'

>>> french_deck[0].suit

'spades'

pythonnamedtuple定义类型_python namedtuple的使用相关推荐

  1. pythonnamedtuple定义类型_python - namedtuple和可选关键字参数的默认值

    python - namedtuple和可选关键字参数的默认值 我正在尝试将一个冗长的空洞"数据"类转换为一个命名元组. 我的班级目前看起来像这样: class Node(obje ...

  2. pythonnamedtuple定义类型_详解Python中namedtuple的使用

    namedtuple是Python中存储数据类型,比较常见的数据类型还有有list和tuple数据类型.相比于list,tuple中的元素不可修改,在映射中可以当键使用. namedtuple: na ...

  3. pythonnamedtuple定义类型_python-自定义type.NamedTuple

    我正在使用NamedTuples来保存数据,并且我想添加一个可由多个基于NamedTuple的类继承的方法.但是,当我尝试使用多重继承或基于NamedTuple的类的子类化时,它不起作用.具体来说,我 ...

  4. C++/C++11中用于定义类型别名的两种方法:typedef和using

    类型别名(type alias)是一个名字,它是某种类型的同义词.使用类型别名有很多好处,它让复杂的类型名字变得简单明了.易于理解和使用,还有助于程序员清楚地知道使用该类型的真实目的.在C++中,任何 ...

  5. MySQL学习笔记(5)之数据定义类型

    数据定义类型总汇 1.整数型: 整数类型 字节 有符号范围 无符号范围 用途 tinyint 1 (-128,127) (0,255) 小整数 smallint 2 (-32 768,32 767) ...

  6. 具有用户定义类型的format的示例用法

    具有用户定义类型的format的示例用法 实现功能 C++实现代码 实现功能 具有用户定义类型的format的示例用法 C++实现代码 #include "boost/format.hpp& ...

  7. udt java_Java DB中的Java用户定义类型(UDT)

    udt java Java DB是基于Java编程语言和SQL的关系数据库管理系统. 这是Apache软件基金会的开源Derby项目的Oracle版本. Java SE 7 SDK中包含Java DB ...

  8. Java DB中的Java用户定义类型(UDT)

    Java DB是基于Java编程语言和SQL的关系数据库管理系统. 这是Apache软件基金会的开源Derby项目的Oracle版本. Java SE 7 SDK中包含Java DB. 用户定义类型( ...

  9. java中已定义类型car_Java 8 习惯用语(8):Java 知道您的类型

    Java™8 是第一个支持类型推断的 Java 版本,而且它仅对 lambda 表达式支持此功能.在 lambda 表达式中使用类型推断具有强大的作用,它将帮助您做好准备以应对未来的 Java 版本, ...

最新文章

  1. 明年东京奥运会,将首次引进人脸识别系统
  2. 2019手卫生定义_2021年卫生资格考试部分科目大纲和教材变化归总!
  3. 2016 大连网赛---Weak Pair(dfs+树状数组)
  4. Docker 安装 MongoDB
  5. C# 连接SQL 连接字符串
  6. js a/a中this的使用
  7. mysql 的各种 join
  8. Zookeeper+Curator 分布式锁
  9. signature=9293cc4bd6f47e4f2a5f299011c6e89e,02-本地证书配置指导
  10. 微信支付:不支持虚拟货币交易 如发现违规行为将予以清退处理
  11. 魔兽怀旧服怎么找不到服务器,魔兽世界怀旧服世界服务器无法连接怎么办
  12. WPF剪切板问题-OpenClipboard HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN))
  13. Wechat协议初探
  14. 华北电力保定校区计算机专业好就业吗,2021年华北电力大学(保定)专业排行榜,哪个专业就业比较好...
  15. jquery ui table
  16. 星星泪用计算机怎么弹,星星泪简谱
  17. -128的补码及原码、反码、补码
  18. Word 2016 for Mac(文档和文字处理软件)激活教程
  19. 20行代码爬取原神角色全图
  20. 国内终端安全防护市场报告发布 360网神排行第一

热门文章

  1. 一些前端大牛都在学习的github库
  2. 面试mysql之SQL优化总结一:索引的使用
  3. BetaFlight深入传感设计之三:IMU传感模块
  4. Android 模拟器 计步器,春雨计步器怎样刷步数图文教程
  5. CNN Application
  6. 既想吸猫又不想当猫奴?这款治愈系的机器人或许会适合你
  7. AnyConnect Windows系统的使用教程
  8. HashMap源码阅读启读
  9. java float四舍五入保留两位小数_java基础入门-float四舍五入保留两位小数注意的地方...
  10. 串级PID的一些理解