python3 枚举_python3 枚举

python3 枚举

1. 枚举类型

当一个变量有几种固定的取值时,通常我们喜欢将它定义为枚举类型,枚举类型用于声明一组命名的常数,使用枚举类型可以增强代买的可读性。在python2中,没有枚举这种数据类型,开发人员不得不使用其他手段来构造出近似于枚举类型的数据结构,从python3开始,python正式提供了枚举类型。

2. 枚举应用场景

假设有这样一个函数

def print_color(color_code):

if color_code == 1:

print('红色')

elif color_code == 2:

print('蓝色')

elif color_code == 3:

print('黑色')

参数color_code取值有3种,1表示红色,2表示蓝色,3表示黑色。color_code是表示颜色的代码,只有3种取值,这种情形下就适合使用枚举类型来表示,在python没有枚举类型之前,可以使用类来定义枚举类型。

class ColorCode:

RED = 1

BLUE = 2

BLACK = 3

def print_color(color_code):

if color_code == ColorCode.RED:

print('红色')

elif color_code == ColorCode.BLUE:

print('蓝色')

elif color_code == ColorCode.BLACK:

print('黑色')

print_color(1)

函数里不再用color_code和1,2,3这些整数值进行比较,而是与ColorCode的类属性进行比较,代码可阅读性更好,因为只看1,2,3,你无法理解这些数字所代表的含义。虽然使用类可以模拟枚举类型,但这种技术有一个缺点,类属性可以随意修改

ColorCode.RED = 4

枚举类型要求一旦完成定义,就不能再修改,否则使用枚举的地方将由于枚举值的改变出现不可知的问题。

3. Enum

python3 提供了enum模块,定义类时继承enum.Enum,可以创建一个枚举类型数据

import enum

class ColorCode(enum.Enum):

RED = 1

BLUE = 2

BLACK = 3

def print_color(color_code):

if color_code == ColorCode.RED.value:

print('红色')

elif color_code == ColorCode.BLUE.value:

print('蓝色')

elif color_code == ColorCode.BLACK.value:

print('黑色')

print_color(1)

看上去和第2小节里的代码没有什么大的区别,但由于继承了enum.Enum,ColorCode的类属性将无法修改,如果执行

ColorCode.RED = 4

将会引发错误

raise AttributeError('Cannot reassign members.')

AttributeError: Cannot reassign members.

4. 枚举值

4.1 枚举值唯一

为了防止定义枚举值时出现重复的值,enum模块还提供了unique装饰器

import enum

from enum import unique

@unique

class ColorCode(enum.Enum):

RED = 1

BLUE = 1

BLACK = 3

如果枚举值出现了重复的情况,由于有unique装饰器修饰,因此在执行时会报错。

4.2 枚举值遍历

使用for循环可以对枚举值进行遍历

import enum

from enum import unique

@unique

class ColorCode(enum.Enum):

RED = 1

BLUE = 2

BLACK = 3

for color in ColorCode:

print(color.name, color.value)

程序输出结果

RED 1

BLUE 2

BLACK 3

4.3 枚举值比较

枚举值之间不支持 > 和 < 操作,但支持等值比较和is身份比较

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值