Структуры данных и алгоритмы Python (1) --- тип перечисления enum

OpenCV
Структуры данных и алгоритмы Python (1) --- тип перечисления enum

предисловие

Причина, по которой блогер думает снова и снова, заключается в том, чтобы открыть базовый непопулярный курс по структуре данных. Это связано с тем, что большинство книг по структурам данных в настоящее время используют C/C++, что, несомненно, повышает порог обучения.

С языком python относительно легко начать, а изучение структур данных и алгоритмов с помощью python кажется более удобным для начинающих.

В этой статье мы сначала познакомимся с типом перечисления. В библиотеке python предоставляется модуль перечисления enum. С помощью этого модуля мы можем определять буквальные целые числа и строки, которые легко понять программистам.

Создать перечисление

Без лишних слов давайте создадим простой класс перечисления: week. То есть класс перечисления дней недели, понятный программистам. Конкретное определение выглядит следующим образом:

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. А также определите имя атрибута класса, которое описывает значение и конкретное значение значения.

повторять перечисление

Здесь, поскольку это класс перечисления, который мы активно определили, мы можем знать конкретное имя и значение. Но в большинстве случаев мы ссылаемся на класс перечисления, определенный другими, и мы не знаем конкретного имени и значения. В это время вам нужно пройти, чтобы получить каждый член его перечисления.

Далее, давайте пройдемся по приведенному выше перечислению недель, конкретный код выглядит следующим образом:

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)

После запуска будут отображаться как имя, так и значение.

迭代枚举

Сравните перечисления

Потому что конкретное значение перечисления может быть любого типа. Поэтому типы перечисления нельзя сравнивать по размеру, только по равенству. Давайте рассмотрим простой пример:

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)

После запуска эффект следующий:

比较枚举2

Уникальное значение перечисления

После приведенного выше исследования, есть ли читатели, которые попытаются определить два разных имени, равных одному и тому же значению в одном и том же перечислении? Как осуществляется перечисление в этом случае?

Давайте сначала посмотрим на кусок кода:

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

报错

Создать перечисление в коде

В практических приложениях мы часто не определяем классы перечисления напрямую. Вместо этого тип перечисления создается динамически, когда это необходимо программе. На данный момент у нас есть два способа определения:

  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, а переменные-члены в именах разделяются пробелами. Эффект бега такой же, как и выше, который здесь не показан.

  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)

Созданный таким образом, вы можете вручную присвоить значения каждому элементу. Говорить, что удобнее, или судить исходя из реальной ситуации.