1.什么是枚举

在python中枚举是一种类(Enum,IntEnum),存放在enum模块中。枚举类型可以给一组标签赋予一组特定的值。

枚举的特点

枚举的特点:

  1. 枚举类中不能存在相同的标签名
  2. 枚举是可迭代的
  3. 不同的枚举标签可以对应相同的值,但它们都会被视为该值对应第一个标签的别名
  4. 如果要限制定义枚举时,不能定义相同值的成员。可以使用装饰器@unique【要导入unique模块】
  5. 枚举成员之间不能进行大小比较,可进行等值和同一性比较
  6. 枚举成员为单例,不可实例化,不可更改

在开始前,我们先定义一个枚举类:

from enum import Enum


class Week(Enum):
    MONDAY = 0
    TUESDAY = 1
    WEDNESDAY = 2
    THURSDAY = 3
    FRIDAY = 4
    SATURDAY = 5
    SUNDAY = 6

获取在枚举类中定义的枚举成员

# 方法一:
print(Week.MONDAY)
print(type(Week.MONDAY))
# 方法二
print(Week['TUESDAY'])
print(type(Week.TUESDAY))
# 方法三
print(Week(2))
print(type(Week(2)))
-------------------------------------------
Week.MONDAY
<enum 'Week'>
Week.TUESDAY
<enum 'Week'>
Week.WEDNESDAY
<enum 'Week'>

枚举成员中包含标签名和该标签对应的值

today = Week.FRIDAY
print('Today is ' + today.name + '. The number of today is ' + str(today.value))
---------------------------------------------------
Today is FRIDAY. The number of today is 4

包含相同值的枚举类的迭代,默认情况下不会输出别名,但可通过迭代__members__来显示所有成员标签

from enum import Enum


class Week(Enum):
    MONDAY = 0
    TUESDAY = 1
    FRIDAY = 4
    TODAY = 4  # 以FRIDAY别名的形式存在


for day in Week:
    print(day)
print('******************')
for day in Week.__members__:
    print(day)
Week.MONDAY
Week.TUESDAY
Week.FRIDAY
******************
MONDAY
TUESDAY
FRIDAY
TODAY

限定不含相同值的枚举类@unique

from enum import Enum, unique


@unique
class Week(Enum):
    MONDAY = 0
    TUESDAY = 1
    FRIDAY = 4
    TODAY = 4  # 以FRIDAY别名的形式存在

# ValueError: duplicate values found in <enum 'Week'>: TODAY -> FRIDAY

3.python的内置函数enumerate()

enumerate()是python使用的内置函数,用于简化程序员执行的任务。在enumerate()的帮助下,我们可以迭代许多不同类型的对象,如字符串,元组,列表等。更有用的是它接受一个可选参数,该参数告诉枚举从哪里开始索引。此外,使用列表,可以创建包含索引和列表的元组。

enu_list = ['Python', 'Java', 'C']
# 枚举 一个是索引号 一个是值
for i, item in enumerate(enu_list):
    print(i)
    print(item)

print(list(enumerate(enu_list, 1)))  # 从1开始索引,默认为0


# 0
# Python
# 1
# Java
# 2
# C
# [(1, 'Python'), (2, 'Java'), (3, 'C')]

3.1.结合列表生成式

# print([index for index, item in enumerate([3, 5, 7, 3, 7])])
# print([item for index, item in enumerate({'name':'dahai','age':18})])
#
# for index, item in enumerate({'name':'dahai','age':18}):
#     print(index,item)
# 被3整除的列表数据  获得是对应的索引
print([index for index, item in enumerate([3, 5, 7, 3, 7]) if item % 3==0])
# 被2整除的列表索引  获得是对应的索引
print([index for index, item in enumerate([3, 5, 7, 3, 7]) if index % 2==0])
# 被3整除的列表数据  获得是对应的数据
print([item for index, item in enumerate([3, 5, 7, 3, 7]) if item % 3==0])

3.2.结合字典生成式

# 字典生成式
print({index:item for index, item in enumerate([3, 5, 7, 3, 7])})
print({str(index):item for index, item in enumerate([3, 5, 7, 3, 7])})
# 被2整除的列表索引  获得是对应的索引和列表数据组合的键值对字典
print({str(index):item for index, item in enumerate([3, 5, 7, 3, 7]) if index % 2==0})
# 被3整除的列表数据  获得是对应的索引和列表数据组合的键值对字典
print({str(index):item for index, item in enumerate([3, 5, 7, 3, 7]) if item % 3==0})