1. 枚举的定义

  1. 首先,定义枚举要导入enum模块。
  2. 枚举定义用class关键字,继承Enum类。
  3. 用于定义枚举的class和定义类的class是有区别【下一篇博文继续分享】。

  示例代码:

from enum import Enum
class Color(Enum):
red = 1
orange = 2
yellow = 3
green = 4
blue = 5
indigo = 6
purple = 7

  代码分析:

  1. 上面的代码,我们定义了颜色的枚举Color.
  2. 颜色枚举有7个成员,分别是Color.red、Color.orange、Color.yellow等。
  3. 每一个成员都有它们各自名称和值,Color.red成员的名称是:red,值是:1。
  4. 每个成员的数据类型就是它所属的枚举。【*注:用class定义的类,实际上就是一种类型】
1.1 定义枚举时,成员名称不允许重复   
from enum import Enum
class Color(Enum):
red = 1
red = 2

  上面的代码,就无法执行。提示错误:TypeError: Attempted to reuse key: 'red'

 1.2 默认情况下,不同的成员值允许相同。但是两个相同值的成员,第二个成员的名称被视作第一个成员的别名  

from enum import Enum
class Color(Enum):
red = 1
red_alias = 1

  成员Color.red和Color.red_alias具有相同的值,那么成员Color.red_alias的名称red_alias就被视作成员Color.red名称red的别名。

   1.3 如果枚举中存在相同值的成员,在通过值获取枚举成员时,只能获取到第一个成员

from enum import Enum
class Color(Enum):
red = 1
red_alias = 1 print(Color(1))

  输出结果为:Color.red

 1.4 如果要限制定义枚举时,不能定义相同值的成员。可以使用装饰器@unique【要导入unique模块】

from enum import Enum, unique

@unique
class Color(Enum):
red = 1
red_alias = 1

  再执行就会提示错误:ValueError: duplicate values found in <enum 'Color'>: red_alias -> red

2. 枚举取值 

 2.1 通过成员的名称来获取成员

Color['red']

 2.2 通过成员值来获取成员

Color(2)

 2.3 通过成员,来获取它的名称和值

red_member = Color.red
red_member.name
red_member.value

3. 迭代器

 3.1 枚举支持迭代器,可以遍历枚举成员

for color in Color:
print(color)

  输出结果是,枚举的所有成员。Color.red、Color.orange、Color.yellow、Color.green、Color.blue、Color.indigo、Color.purple。

 3.2 如果枚举有值重复的成员,循环遍历枚举时只获取值重复成员的第一个成员

from enum import Enum

class Color(Enum):
red = 1
orange = 2
yellow = 3
green = 4
blue = 5
indigo = 6
purple = 7
red_alias = 1 for color in Color:
print(color)

  输出结果是:Color.red、Color.orange、Color.yellow、Color.green、Color.blue、Color.indigo、Color.purple。但是Color.red_alias并没有出现在输出结果中。

 3.3 如果想把值重复的成员也遍历出来,要用枚举的一个特殊属性__members__

from enum import Enum

class Color(Enum):
red = 1
orange = 2
yellow = 3
green = 4
blue = 5
indigo = 6
purple = 7
red_alias = 1 for color in Color.__members__.items():
print(color)

  输出结果:('red', <Color.red: 1>)、('orange', <Color.orange: 2>)、('yellow', <Color.yellow: 3>)、('green', <Color.green: 4>)、('blue', <Color.blue: 5>)、

       ('indigo', <Color.indigo: 6>)、('purple', <Color.purple: 7>)、('red_alias', <Color.red: 1>)

4. 枚举比较

 4.1 枚举成员可进行同一性比较

Color.red is Color.red

  输出结果是:True

Color.red is not Color.blue

  输出结果是:True

 4.2 枚举成员可进等值比较

Color.blue == Color.red

  输出结果是:False

Color.blue != Color.red

  输出结果是:True

 4.3 枚举成员不能进行大小比较

Color.red < Color.blue

  输出结果出错:TypeError: unorderable types: Color() < Color()

Python 枚举【一】的更多相关文章

  1. Python 枚举 enum

    Python 枚举 enum enum 标准模块在 3.4 版本才可以使用,3.3 以下版本需要独立安装:https://pypi.python.org/pypi/enum34#downloads,官 ...

  2. Python 枚举

    1. 枚举的定义 首先,定义枚举要导入enum模块.枚举定义用class关键字,继承Enum类.用于定义枚举的class和定义类的class是有区别. 示例代码: from enum import E ...

  3. python 枚举Enum

    常量是任何一门语言中都会使用的一种变量类型 如 要表示星期常量,我们可能会直接定义一组变量 JAN = 1 TWO = 2 ... 然后在返回给前端的时候,我们返回的就会是1,2,...这种魔法数字, ...

  4. 人生苦短之Python枚举类型enum

    枚举类型enum是比较重要的一个数据类型,它是一种数据类型而不是数据结构,我们通常将一组常用的常数声明成枚举类型方便后续的使用.当一个变量有几种可能的取值的时候,我们将它定义为枚举类型.在Python ...

  5. 谁是嫌疑犯问题Python枚举法

    原文:https://blog.csdn.net/yunzifengqing/article/details/81941592 问题描述:有6名犯罪嫌疑人A.B.C.D.E.F,已知如下事实: A.B ...

  6. python 枚举类型

    在python中枚举是一种类(Enum,IntEnum),存放在enum模块中.枚举类型可以给一组标签赋予一组特定的值. 枚举的特点: 枚举类中不能存在相同的标签名 枚举是可迭代的 不同的枚举标签可以 ...

  7. python枚举类型 Enum

    在python中枚举是一种类(Enum) 枚举类中不能存在相同的标签名 枚举是可迭代的 例: from enum import Enum class Vip(Enum): MONDAY = 0 TUE ...

  8. python枚举类型

    笔记: 一:枚举类型的定义二:枚举类和普通类的区别 1:值不可变 2:具有防止相同标签得功能,不同标签的值可以相同! 三:枚举类型.枚举值.枚举名称 1:VIP.YELLOW.Value 获得标签的值 ...

  9. Python枚举类

    Enum可以把一组相关常量定义在一个class中,且class不可变,而且成员可以直接比较. 定义枚举类: from enum import Enum, unique @unique class We ...

随机推荐

  1. [C++]指针/指针数组/数组指针/多维指针/单值指针/多值指针

    int main(){ //单值指针(指向单个值得指针,类同普通变量) int *px = new int; *px = 100; printf("%d",*px); delete ...

  2. NOIP2018ty记

    前置传送门:noip2018前流水账 Day-inf~Day-3 写流水账里了 懒得再写了 Day-2~Day-1 做了些noip的原题 真是奇怪,我天天爱跑步和逛公园都是1A的,结果反而有些普及组的 ...

  3. BZOJ 4614[Wf2016]Oil

    权限题鸭qwq 首先可以知道最优答案选出来的直线一定可以经过某条线段左端点,如果这条直线没有过左端点,可以通过平移和旋转等操作达到.所以可以枚举这条直线过了哪条线段的左端点,那么对于其他线段,能对答案 ...

  4. python技巧 switch case语句

    不同于C语言和SHELL,python中没有switch case语句,关于为什么没有,官方的解释是这样的 使用Python模拟实现的方法: def switch_if(fun, x, y):    ...

  5. js代码解析原则

    js引擎在读取js代码时会进行两个步骤,第一个步骤是解释,第二个步骤是执行. 解释就是先通篇扫描所有的Js代码,然后把所有声明提升到顶端,第二步是执行,执行就是执行代码的操作. 例: 例子1: < ...

  6. C++11 并发指南一(C++11 多线程初探)

    引言 C++11 自2011年发布以来已经快两年了,之前一直没怎么关注,直到最近几个月才看了一些 C++11 的新特性,今后几篇博客我都会写一些关于 C++11 的特性,算是记录一下自己学到的东西吧, ...

  7. WM8960音频播放

    第一节 音频播放原理首先需要申明一下,本章的代码来自网络,参考了亚嵌教育李明老师(论坛ID:limingth)的帖子: http://www.arm9home.net/read.php?tid=205 ...

  8. Node.js ECONNREFUSED错误

    1 现象 node服务器 遇见此错误,如下:events.js:71throw arguments[1]; // Unhandled 'error' event^Error: connect ECON ...

  9. 前景检测(1):VIBE

    参考:http://blog.csdn.net/zouxy09/article/details/9622285 看论文很多细节不明白,看这位博主实现的代码就能明白了.

  10. LINUX UBUNTU 快捷键

    一.打开关闭终端 ctrl + alt + t //打开一个新终端 shift + ctrl +n //在打开终端的情况下再打开一个新终端shift + ctrl + q //关闭一个新终端 二.文件 ...