python基础 - namedtuple和enum

Python附带⼀个模块,它包含许多容器数据类型,名字叫作collections。
我们将讨论的是:

  • namedtuple
  • enum.Enum (包含在Python 3.4以上)

另外还有defaultdict、counter、deque很常用不在赘述。

1、namedtuple

⼀个元组是⼀个不可变的列表,你可以存储⼀个数据的序列,它和命名元组(namedtuples)⾮常像,但有⼏个关键的不同。
主要相似点是都不像列表,你不能修改元组中的数据。为了获取元组中的数据,你需要使⽤整数作为索引:

man = ('Ali', 30)
print(man[0])
## 输出: Ali

那namedtuples是什么呢?它把元组变成⼀个针对简单任务的容器。你不必使⽤整数索引来访问⼀个namedtuples的数据。你可以像字典(dict)⼀样访问namedtuples,但namedtuples是不可变的。

from collections import namedtuple
Animal = namedtuple('Animal', 'name age type')
perry = Animal(name="perry", age=31, type="cat")
print(perry)
## 输出: Animal(name='perry', age=31, type='cat')
print(perry.name)
## 输出: 'perry'

以上可以看到,可以⽤名字来访问namedtuple中的数据。⼀个命名元组(namedtuple)有两个必需的参数。它们是元组名称和字段名称
在上⾯的例⼦中,我们的元组名称是Animal,字段名称是'name','age'和'type'。
不必使⽤整数索引来访问⼀个命名元组,这让你的代码更易于维护。⽽且,namedtuple的每个实例没有对象字典,所以它们很轻量,与普通的元组⽐,并不需要更多的内存。这使得它们⽐字典更快。然⽽,要记住它是⼀个元组,属性值在namedtuple中是不可变的,所以下⾯的代码不能⼯作: 

from collections import namedtuple
Animal = namedtuple('Animal', 'name age type')
perry = Animal(name="perry", age=31, type="cat")
perry.age = 42
## 输出:
## Traceback (most recent call last):
## File "", line 1, in
## AttributeError: can't set attribute

你应该使⽤命名元组来让代码⾃注释,它们向后兼容于普通的元组,这意味着你可以既使⽤整数索引,也可以使⽤名称来访问namedtuple:

from collections import namedtuple
Animal = namedtuple('Animal', 'name age type')
perry = Animal(name="perry", age=31, type="cat")
print(perry[0])
## 输出: perry

最后,你可以将⼀个命名元组转换为字典,⽅法如下:

from collections import namedtuple
Animal = namedtuple('Animal', 'name age type')
perry = Animal(name="Perry", age=31, type="cat")
print(perry._asdict())
## 输出: OrderedDict([('name', 'Perry'), ('age', 31), ... 

2、Enum 

另⼀个有⽤的容器是枚举对象,它属于enum模块,存在于Python 3.4以上版本中。Enums(枚举类型)基本上是⼀种组织各种东
西的⽅式。
让我们回顾⼀下上⼀个'Animal'命名元组的例⼦。它有⼀个type字段,问题是,type是⼀个字符串。那么问题来了,万⼀程序员输⼊了Cat,因为他按到了Shift键,或者输⼊了'CAT',甚⾄'kitten'?
枚举可以帮助我们避免这个问题,通过不使⽤字符串。考虑以下这个例⼦:

from collections import namedtuple
from enum import Enum
class Species(Enum):
    cat = 1
    dog = 2
    horse = 3
    aardvark = 4
    butterfly = 5
    owl = 6
    platypus = 7
    dragon = 8
    unicorn = 9
    # 依次类推

Animal = namedtuple('Animal', 'name age type')
perry = Animal(name="Perry", age=31, type=Species.cat)
drogon = Animal(name="Drogon", age=4, type=Species.dragon)
tom = Animal(name="Tom", age=75, type=Species.cat)
charlie = Animal(name="Charlie", age=2, type=Species.kitten)

 现在,我们进⾏⼀些测试:

print(charlie.type == tom.type)
# True
print(charlie.type)
# <Species.cat: 1>

这样就没那么容易错误,我们必须更明确,⽽且我们应该只使⽤定义后的枚举类型。
有三种⽅法访问枚举数据,例如以下⽅法都可以获取到'cat'的值:

  • Species(1)
  • Species['cat']
  • Species.cat

摘自:《python进阶》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值