开放的编程资料库

当前位置:我爱分享网 > Python教程 > 正文

Python 就此而言

Python枚举教程展示了如何在Python中使用枚举。枚举是Python3.4中引入的新数据类型。

Python枚举

枚举是一组绑定到唯一常量值的符号名称。枚举可用于创建简单的自定义数据类型,其中包括季节、周、游戏中的武器类型、行星、等级或天数等内容。按照惯例,枚举名称以大写字母开头并且是单数。

enum模块用于在Python中创建枚举。枚举是使用class关键字或函数式API创建的。

有特定的派生枚举enum.IntEnumenum.IntFlagenum.Flag

Python枚举简单例子

下面是一个Python枚举的简单例子。

#!/usr/bin/python

from enum import Enum


class Season(Enum):
    SPRING = 1
    SUMMER = 2
    AUTUMN = 3
    WINTER = 4


seas = Season.SPRING
print(seas)

if seas == Season.SPRING:
    print("Spring")

print(list(Season))

在示例中,我们有一个Season枚举,它有四个不同的值:SPRING、SUMMER、AUTUMN和WINTER。要访问成员,我们指定枚举名称后跟一个点和成员名称。

class Season(Enum):
    SPRING = 1
    SUMMER = 2
    AUTUMN = 3
    WINTER = 4

Season枚举是使用class关键字创建的。我们继承自enum.Enum基类。我们明确地将数字设置为枚举值。

seas = Season.SPRING
print(seas)

一个枚举值被分配给一个变量,它被打印到控制台。

if seas == Season.SPRING:
    print("Spring")

Season.SPRING用于if表达式。

print(list(Season))

使用list内置函数,我们可以获得Season枚举的所有可能值的列表。

$ ./simple.py 
Season.SPRING
Spring
[<Season.SPRING: 1>, <Season.SUMMER: 2>, <Season.AUTUMN: 3>, <Season.WINTER: 4>]

Python枚举简单例子二

下一个示例展示了Python枚举的其他一些基本功能。

#!/usr/bin/python

from enum import Enum


class Season(Enum):
    SPRING = 1
    SUMMER = 2
    AUTUMN = 3
    WINTER = 4


seas = Season.SPRING

print(seas)
print(isinstance(seas, Season))
print(type(seas))
print(repr(seas))

print(Season['SPRING'])
print(Season(1))

同样,我们处理使用class创建的Season枚举。

print(seas)

在这里,我们打印了一个人类可读的字符串表示形式,表示Season成员。

print(isinstance(seas, Season))

使用isinstance方法,我们检查变量是否具有Season类型的值。

print(type(seas))

type函数打印变量的类型。

print(repr(seas))

repr函数提供了有关枚举的更多信息。

print(Season['SPRING'])
print(Season(1))

可以通过项目名称和索引访问枚举成员。

$ ./simple2.py 
Season.SPRING
True
<enum 'Season'>
<Season.SPRING: 1>
Season.SPRING
Season.SPRING

Python枚举函数创建

Python枚举可以使用函数式API创建。

#!/usr/bin/python

from enum import Enum

Season = Enum('Season', 'SPRING SUMMER AUTUMN WINTER', start=1)

seas = Season.SUMMER
print(seas)

if seas == Season.SUMMER:
    print("Summer")

我们可以通过多种方式使用函数式API指定值。在后面的示例中,我们将使用其他函数式方式。

Season = Enum('Season', 'SPRING SUMMER AUTUMN WINTER', start=1)

此处的值在字符串中指定,以空格分隔。start提供初始值。

$ ./functional.py 
Season.SUMMER
Summer

Python枚举迭代

我们可以迭代Python枚举。

#!/usr/bin/python

from enum import Enum


Season = Enum('Season', ['SPRING', 'SUMMER', 'AUTUMN', 'WINTER'], start=5)

for season in Season:
    print(season)

for season in Season:
    print(season.name, season.value)

在此示例中,我们创建了一个Season枚举,其中的值设置在字符串列表中。

for season in Season:
    print(season)

我们在for循环中迭代枚举成员。

for season in Season:
    print(season.name, season.value)

我们在这里打印它们的名称和值。

$ ./iteration.py 
Season.SPRING
Season.SUMMER
Season.AUTUMN
Season.WINTER
SPRING 5
SUMMER 6
AUTUMN 7
WINTER 8

Python枚举自动值

Python枚举值可以使用auto函数自动设置。

#!/usr/bin/python

from enum import Enum, auto


class Season(Enum):
    SPRING = auto()
    SUMMER = auto()
    AUTUMN = auto()
    WINTER = auto()


for season in Season:
    print(season.value)

我们有一个Season枚举,它的成员通过auto函数获得一个值。

$ ./automatic.py 
1
2
3
4

Python枚举唯一成员值

可以使用@unique装饰器强制Python枚举的成员值是唯一的。

#!/usr/bin/python

from enum import Enum, unique

@unique
class Season(Enum):
    SPRING = 1
    SUMMER = 2
    AUTUMN = 3
    WINTER = 3
    # WINTER = 4


for season in Season:
    print(season)

该示例因ValueError:duplicatevaluesfoundin:WINTER->AUTUMN错误而失败,因为AUTUMN和WINTER成员具有相同的值。如果我们注释掉@unique装饰器,该示例将打印三个成员;WINTER被忽略。

Python枚举__members__

特殊属性__members__是名称到成员的只读有序映射。

#!/usr/bin/python

from enum import Enum


Season = Enum('Season', [('SPRING', 1), ('SUMMER', 2), 
    ('AUTUMN', 3), ('WINTER', 4)])


for name, member in Season.__members__.items():
    print(name, member)

在示例中,我们使用了__members__属性。枚举成员是使用函数式API使用元组列表创建的。

$ ./members.py 
SPRING Season.SPRING
SUMMER Season.SUMMER
AUTUMN Season.AUTUMN
WINTER Season.WINTER

Python枚举.Flag

enum.Flag是一个基类,用于创建枚举常量,可以使用按位运算组合这些常量而不会丢失其Flag成员身份。

#!/usr/bin/python

from enum import Flag, auto


class Perm(Flag):
    EXECUTE = auto()
    WRITE = auto()
    READ = auto()


print(list(Perm))
print(Perm.READ | Perm.WRITE)

该示例显示了如何在权限上使用Flag

$ ./derived.py 
[<Perm.EXECUTE: 1>, <Perm.WRITE: 2>, <Perm.READ: 4>]
Perm.READ|WRITE

带有模式匹配的Python枚举

match/case关键字可以与枚举一起使用以创建简洁的代码。

#!/usr/bin/python

from enum import Enum
import random


class Day(Enum):
    Monday = 0
    Tuesday = 1
    Wednesday = 2
    Thursday = 3
    Friday = 4
    Saturday = 5
    Sunday = 6

days = [Day.Monday, Day.Tuesday, Day.Wednesday,
        Day.Thursday, Day.Friday, Day.Saturday, Day.Sunday]

res = random.sample(days, 4)

for e in res:

    match e:
        case Day.Monday:
            print("monday")
        case Day.Tuesday:
            print("tuesday")
        case Day.Wednesday:
            print("wednesay")
        case Day.Thursday:
            print("thursday")
        case Day.Friday:
            print("friday")
        case Day.Saturday:
            print("saturday")
        case Day.Sunday:
            print("sunday")

在示例中,我们定义了一个Day枚举。

days = [Day.Monday, Day.Tuesday, Day.Wednesday,
        Day.Thursday, Day.Friday, Day.Saturday, Day.Sunday]

res = random.sample(days, 4)

我们从列表中随机选择四天。

for e in res:

    match e:
        case Day.Monday:
            print("monday")
        case Day.Tuesday:
            print("tuesday")
        case Day.Wednesday:
            print("wednesay")
        case Day.Thursday:
            print("thursday")
        case Day.Friday:
            print("friday")
        case Day.Saturday:
            print("saturday")
        case Day.Sunday:
            print("sunday")

我们检查四个选择的值并打印它们相应的字符串表示。对于每个选项,我们都有一个特定的案例组。

$ ./pattern_match.py 
monday
friday
thursday
sunday

在本教程中,我们使用了Python枚举。

列出所有Python教程。

未经允许不得转载:我爱分享网 » Python 就此而言

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏