Python是一种易于学习又功能强大的编程语言。它不仅有简单有效的面向对象编程,还有高效的高级数据结构,就让我们一起来学习这部分的内容吧。
Python的原生类型中并不包含枚举类型,在Python3之前数据类型的表示方式有三种
模块中的全局变量
yellow =1 green = 2
字典
{'yellow':1,'green':2}
类的对象
class TypeDiamond(): yellow = 1 green = 2
但是以上三种方法使用时存在缺点:
(1)变量的值是可变的
{'yellow':1,'green':2} a['yellow']=3
(2)没有防止相同标签的功能
为了消除上述缺点,提供更好的解决方案, Python通过PEP435在3.4版本中添加了enum标准库,从而引入了枚举类型。
枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,比如星期、月份、状态等。
用一个具体实例说明枚举类型。QQ的VIP有黄钻、绿钻、黑钻和红钻,下面编写代码将VIP种类分别对应一个数值
from enum import Enum class VIP(Enum): YELLOW = 1 GREEN = 2 BLACK = 3 RED = 4
在上面代码中,我们将钻石的种类用大写字母表示,说明枚举类型中的变量是不可变的,其次不能出现相同的标签,否则就会出现
from enum import Enum class VIP(Enum): #继承 YELLOW = 1 YELLOW = 1 GREEN = 2 BLACK = 3 RED = 4 print(VIP.YELLOW)
TypeError: Attempted to reuse key: 'YELLOW'
上面例子可以说明枚举类型不可实例化,不可更改。
如果枚举类型的标签名不同,但值相同,会出现只打印第一个标签
from enum import Enum class VIP(Enum): #继承 YELLOW = 1 GREEN = 1 BLACK = 3 RED = 4 print(VIP(1))
VIP.YELLOW
因此,我们把第二个具有相同值的标签称为第一个标签的别名。
枚举的操作
(1)获取数值
可以通过成员名来获取成员也可以通过成员值来获取成员
from enum import Enum class VIP(Enum): YELLOW = 1 GREEN = 2 BLACK = 3 RED = 4 print(VIP(1)) print(VIP['YELLOW'])
VIP.YELLOW VIP.YELLOW
(2)获取标签的名字
具体方法如下面代码所示
from enum import Enum class VIP(Enum): YELLOW = 1 GREEN = 2 BLACK = 3 RED = 4 print(VIP.GREEN.name) print(VIP.GREEN) print(VIP['GREEN'])
GREEN VIP.GREEN VIP.GREEN
打印了三种不同的值,通过运用type()函数,可以直观地看出三种打印值属于不同的数据类型。
print(type(VIP.GREEN.name)) #字符串 print(type(VIP.GREEN)) #枚举名字 print(type(VIP['GREEN'])) #枚举的值
<class 'str'> <enum 'VIP'> <enum 'VIP'>
第一个是字符串,第二个是枚举的名字,第三个是枚举的值。枚举的名字和枚举的值组成了枚举类型。
(3)枚举的遍历
from enum import Enum class VIP(Enum): YELLOW = 1 GREEN = 2 BLACK = 3 RED = 4 for v in VIP: print(v)
VIP.YELLOW VIP.GREEN VIP.BLACK VIP.RED
如果有值重复的成员,只能获取重复的第一个成员。
将重复的成员叫做别名,当需要将别名遍历出来时,用Python的特殊属性_members__是一个将名称映射到成员的有序字典,通过它来完成遍历。
from enum import Enum class VIP(Enum): YELLOW = 1 YELLOW_ALIAS = 2 GREEN = 2 BLACK = 3 RED = 4 for v in VIP.__members__.items(): print(v)
('YELLOW', <VIP.YELLOW: 1>) ('YELLOW_ALIAS', <VIP.YELLOW_ALIAS: 2>) ('GREEN', <VIP.YELLOW_ALIAS: 2>) ('BLACK', <VIP.BLACK: 3>) ('RED', <VIP.RED: 4>)
枚举比较
(1)枚举成员可以通过is同一性比较或==等值比较
from enum import Enum class VIP(Enum): YELLOW = 1 GREEN = 2 BLACK = 3 RED = 4 result = VIP.GREEN == VIP.BLACK print(result)
False
from enum import Enum class VIP(Enum): YELLOW = 1 GREEN = 2 BLACK = 3 RED = 4 class VIP1(Enum): YELLOW = 1 GREEN = 2 BLACK = 3 RED = 4 result3 = VIP.GREEN is VIP.GREEN print(result3)
True
(2)枚举成员不能进行大小比较,不同类的枚举不能比较。
from enum import Enum class VIP(Enum): YELLOW = 1 GREEN = 2 BLACK = 3 RED = 4 result2 = VIP.GREEN > VIP.BLACK print(result2)
'>' not supported between instances of 'VIP' and 'VIP'
from enum import Enum class VIP(Enum): YELLOW = 1 GREEN = 2 BLACK = 3 RED = 4 class VIP1(Enum): YELLOW = 1 GREEN = 2 BLACK = 3 RED = 4 result4 = VIP.GREEN == VIP1.GREEN print(result4)
False
既然已经意识到和牛人的差距,那么应该加倍努力,不止每一个放假的日子。平凡人的不平凡,是为梦想费尽力气,是无视荆棘一路前行。