Как реализовать оператор switch-case в Python

Как реализовать оператор switch-case в Python

Оператор switch-case — это мощная функция программирования, которая позволяет управлять потоком вашей программы на основе значения переменной или выражения. Вы можете использовать его для выполнения различных блоков кода, в зависимости от значения переменной во время выполнения. Вот пример инструкции switch в Java.

public static void switch_demo(String[] args) {
        int month = 8;
        String monthString;
        switch (month) {
            case 1:  monthString = "January";
                     break;
            case 2:  monthString = "February";
                     break;
            case 3:  monthString = "March";
                     break;
            case 4:  monthString = "April";
                     break;
            case 5:  monthString = "May";
                     break;
            case 6:  monthString = "June";
                     break;
            case 7:  monthString = "July";
                     break;
            case 8:  monthString = "August";
                     break;
            case 9:  monthString = "September";
                     break;
            case 10: monthString = "October";
                     break;
            case 11: monthString = "November";
                     break;
            case 12: monthString = "December";
                     break;
            default: monthString = "Invalid month";
                     break;
        }
        System.out.println(monthString);
}

Вот как это работает:

  1. Компилятор генерирует таблицу перехода для оператора case switch.
  2. Переменная/выражение переключателя оценивается один раз.
  3. Оператор switch ищет оцененную переменную/выражение в таблице переходов и непосредственно решает, какой блок кода выполнить.
  4. Если совпадение не найдено, код выполняется по умолчанию.

В приведенном выше примере, в зависимости от значения месяца переменной, на стандартном выходе будет отображаться другое сообщение. В этом случае, начиная с месяца = 8, «Август» будет напечатан в стандартном выпуске.

Вывод операторов

Хотя популярные языки, такие как Java и PHP, имеют встроенный оператор switch, вы можете быть удивлены, узнав, что язык Python его не имеет. Таким образом, у вас может возникнуть соблазн использовать серию блоков if-else-if, используя условие if для каждого случая вашего оператора switch.

Однако из-за таблицы перехода оператор switch намного быстрее, чем лестница if-else-if. Вместо того, чтобы последовательно оценивать каждое условие, ему нужно только один раз просмотреть оцененную переменную/выражение и напрямую перейти к соответствующей ветви кода для ее выполнения.

Как реализовать оператор switch в Python

Вот реализация Python вышеупомянутого оператора switch. В следующем примере мы создаем словарь с именем switcher для хранения всех случаев, подобных переключателю.

def switch_demo(argument):
    switcher = {
        1: "January",
        2: "February",
        3: "March",
        4: "April",
        5: "May",
        6: "June",
        7: "July",
        8: "August",
        9: "September",
        10: "October",
        11: "November",
        12: "December"
    }
    print switcher.get(argument, "Invalid month")

В приведенном выше примере, когда вы передаете аргумент функции switch_demo, он рассматривается против сопоставления словарей коммутатора. Если совпадение найдено, соответствующее значение печатается, иначе печатается строка по умолчанию («Недействительный месяц»). Строка по умолчанию помогает реализовать «случай по умолчанию» оператора switch.

Отображение словаря для функций

Вот где это становится более интересным. Значения словаря Python могут быть любого типа данных. Таким образом, вам не нужно ограничиваться использованием констант (целых чисел, строк), вы также можете использовать имена функций и лямбда в качестве значений.

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

def one():
    return "January"
def two():
    return "February"
def three():
    return "March"
def four():
    return "April"
def five():
    return "May"
def six():
    return "June"
def seven():
    return "July"
def eight():
    return "August"
def nine():
    return "September"
def ten():
    return "October"
def eleven():
    return "November"
def twelve():
    return "December"
def numbers_to_months(argument):
    switcher = {
        1: one,
        2: two,
        3: three,
        4: four,
        5: five,
        6: six,
        7: seven,
        8: eight,
        9: nine,
        10: ten,
        11: eleven,
        12: twelve
    }
    # Get the function from switcher dictionary
    func = switcher.get(argument, lambda: "Invalid month")
    # Execute the function
    print func()

Хотя приведенные выше функции довольно просты и только возвращают строки, вы можете использовать этот подход для выполнения сложных блоков кода в каждой функции. Фактически, если вы вызываете методы на объектах, вы даже можете использовать метод отправки для динамического определения, на функцию которую нужно вызывать во время выполнения.

class Switcher(object):
    def numbers_to_months(self, argument):
        """Dispatch method"""
        method_name = 'month_' + str(argument)
        # Get the method from 'self'. Default to a lambda.
        method = getattr(self, method_name, lambda: "Invalid month")
        # Call the method as we return it
        return method()
    def month_1(self):
        return "January"
    def month_2(self):
        return "February"
    def month_3(self):
        return "March"
...
На основе переданного аргумента встроенная функция getattr () будет извлекать методы объекта с определенным именем.
Input: a=Switcher()
Input: a.numbers_to_months(1)
Output: January

Преимущество подхода Python

Поскольку вы можете изменять словари Python во время выполнения (добавлять, удалять или обновлять пары ключ-значение), вы можете легко изменить свой оператор switch на лету. Вот пример,

def zero():
    return "zero"
def one():
    return "one"
def two():
    return "two"
switcher = {
        0: zero,
        1: one,
        2: two
    }
def numbers_to_strings(argument):
    # Get the function from switcher dictionary
    func = switcher.get(argument, "nothing")
    # Execute the function
    return func()
Input: numbers_to_strings(1)
Output: One
Input: switcher[1]=two #changing the switch case
Input: numbers_to_strings(1)
Output: Two

Оператор switch-case представляет собой очень полезную функцию программирования, которая не только обеспечивает лучшую производительность, чем оператор if-else, но и оставляет вас с более управляемым кодом. Если вы почувствовали ограниченность отсутствием оператора switch в Python, то, надеюсь, вышеупомянутая статья поможет вам.

 

Один комментарий к “Как реализовать оператор switch-case в Python

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *