前言
之所以博主思考再三,开设一个数据结构的基础冷门课程。是因为目前大多数数据结构的书籍都使用的是C/C++,无疑增加了学习的门槛。
而python语言相对来说,更容易入门掌握,通过python学习数据结构与算法,对于初学者似乎更加的友好。
本篇,首先介绍的是枚举类型。在python库中,提供了枚举模块enum。通过该模块,我们可以定义程序员容易理解的字面量整数与字符串。
创建枚举
话不多说,我们先来创建一个简单的枚举类:星期。也就是让程序员容易理解的星期几的枚举类。具体定义方式如下:
import enum class Week(enum.Enum): Monday = 1 Tuesday = 2 Wednesday = 3 Thursday = 4 Friday = 5 Saturday = 6 Sunday = 7 print("name", Week.Monday.name) print("value", Week.Monday.value)
运行之后,控制台输出如下:
从上面的代码,我们知道,定义一个枚举类,必须派生Enum。而且还要定义描述值的类属性name与具体的值value。
迭代枚举
这里,因为是我们主动定义的枚举类,所以我们能知道具体的name和value。但是多数情况下,我们引用别人定义的枚举类,并不清楚具体的name与value。这个时候,就需要遍历来获取其枚举的各个成员。
下面,我们来遍历上面的星期枚举,具体代码如下所示:
import enum class Week(enum.Enum): Monday = 1 Tuesday = 2 Wednesday = 3 Thursday = 4 Friday = 5 Saturday = 6 Sunday = 7 for i in Week: print("name=", i.name, end=" ") print("value=", i.value)
运行之后,name和value都会显示出来。
比较枚举
因为枚举具体的值可以是任意类型。所以枚举类型并不能比较大小,只能比较是否相等。我们来看一个简单的例子:
import enum class Week(enum.Enum): Monday = 1 Tuesday = 2 Wednesday = 3 Thursday = 4 Friday = 5 Saturday = 6 Sunday = 7 one_Week = Week.Monday print(one_Week == Week.Monday) print(one_Week == Week.Tuesday) print(one_Week > Week.Tuesday)
运行之后,效果如下:
可以看到,比较枚举大小时,会产生TypeError异常。
enum.IntEnum
当然,如果你想比较枚举的大小。还可以变更继承的枚举类型。比如上面的星期枚举都是整型,那么直接派生自枚举整型。这样,就可以相互比较了,具体代码如下:
import enum class Week(enum.IntEnum): Monday = 1 Tuesday = 2 Wednesday = 3 Thursday = 4 Friday = 5 Saturday = 6 Sunday = 7 one_Week = Week.Monday print(one_Week == Week.Monday) print(one_Week == Week.Tuesday) print(one_Week > Week.Tuesday)
运行之后,效果如下:
唯一枚举值
经过上面的学习,有木有读者尝试在同一个枚举中定义两个不同name等于相同的值呢?这种情况下,枚举是怎么处理的?
我们先来看一段代码:
import enum class Week(enum.IntEnum): Monday = 1 Tuesday = 2 Wednesday = 3 Thursday = 4 Friday = 5 Saturday = 6 Sunday = 7 Mon= 1 Tue= 2 for i in Week: print("name=", i.name, end=" ") print("value=", i.value)
这里,博主在星期枚举中,添加了2个星期缩写,而且也等于1,2。运行之后,你会发现这2个值没有输出。这是因为,相同值的枚举成员会默认被认为是前一个成员的别名。这样做的好处是防止迭代时出现重复的值。
如果你想定义的枚举类型中,没有相同值的成员。可以为定义的枚举类添加修饰符@unique。这个时候,如果有值相同的成员,就会报错。
import enum @enum.unique class Week(enum.IntEnum): Monday = 1 Tuesday = 2 Wednesday = 3 Thursday = 4 Friday = 5 Saturday = 6 Sunday = 7 Mon= 1 Tue= 2
代码中创建枚举
在实际的应用中,我们往往不是直接定义枚举类。而是在程序需要时,动态的生成枚举类型。这个时候,我们有两种方式进行定义:
自动生成枚举类型的值:
import enum Week=enum.Enum( value="Week", names=('Monday Tuesday Wednesday Thursday Friday Saturday Sunday '), ) for i in Week: print("name=", i.name, end=" ") print("value=", i.value)
这里,会自动从1给name中每一个成员变量进行赋值,names中的成员变量用空格分开。运行效果与上面一样,这里不在展示。
手动生成枚举类型的值:
import enum Week = enum.Enum( value="Week", names=[ ('Monday', 1), ('Tuesday', 2), ('Wednesday', 3), ('Thursday', 4), ('Friday', 5), ('Saturday', 6), ('Sunday', 7), ], ) for i in Week: print("name=", i.name, end=" ") print("value=", i.value)
这种方式创建,可以给每个成员手动指定值。要说哪个更方便,还是要结合实际的情况进行判断。