Python数据结构与算法(1)---枚举类型enum

举报
择城终老 发表于 2021/07/26 23:23:30 2021/07/26
【摘要】 目录 前言创建枚举迭代枚举比较枚举enum.IntEnum 唯一枚举值代码中创建枚举 前言 之所以博主思考再三,开设一个数据结构的基础冷门课程。是因为目前大多数数据结构的书籍都使用的是C/C++,无疑增加了学习的门槛。 而python语言相对来说,更容易入门掌握,通过python学习数据结构与算法,对于初学者似乎更加的友好。 本篇,首先介绍的是枚...

前言

之所以博主思考再三,开设一个数据结构的基础冷门课程。是因为目前大多数数据结构的书籍都使用的是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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

运行之后,控制台输出如下:
枚举定义

从上面的代码,我们知道,定义一个枚举类,必须派生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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

运行之后,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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

运行之后,效果如下:
比较枚举

可以看到,比较枚举大小时,会产生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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

运行之后,效果如下:
比较枚举2

唯一枚举值

经过上面的学习,有木有读者尝试在同一个枚举中定义两个不同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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

这里,博主在星期枚举中,添加了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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

报错

代码中创建枚举

在实际的应用中,我们往往不是直接定义枚举类。而是在程序需要时,动态的生成枚举类型。这个时候,我们有两种方式进行定义:

  1. 自动生成枚举类型的值:
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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

这里,会自动从1给name中每一个成员变量进行赋值,names中的成员变量用空格分开。运行效果与上面一样,这里不在展示。

  1. 手动生成枚举类型的值:
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)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

这种方式创建,可以给每个成员手动指定值。要说哪个更方便,还是要结合实际的情况进行判断。

文章来源: liyuanjinglyj.blog.csdn.net,作者:李元静,版权归原作者所有,如需转载,请联系作者。

原文链接:liyuanjinglyj.blog.csdn.net/article/details/115675141

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。