- Как реализовать оператор switch-case в Python
- Оператор switch
- Как реализовать оператор switch в Python
- Сопоставление ключей словаря для функций
- Преимущество подхода Python для реализации switch
- Реализация Switch-Case в Python
- Реализация Switch-Case в Python
- 1. Реализация Python Switch Case с использованием словаря
- 2. С динамическими функциями
- Вывод
- Python Switch Statement – Switch Case Example
- How Python Programmers Used to Simulate Switch Case
- How to Implement Switch Statements with the match and case Keywords in Python 3.10
- Conclusion
Как реализовать оператор 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 mont"; break; >System.out.println(monthString); >
Вот как работает этот код:
- Компилятор создает таблицу переходов для оператора switch case .
- Переменная/выражение в скобках после ключевого слова switch вычисляется один раз.
- Оператор switch ищет вычисленное значение переменной/выражения в таблице переходов и после этого непосредственно определяет, какой блок кода выполнить.
- Если совпадений не найдено, выполняется код по умолчанию, помещенный в блок кода default .
В приведенном выше примере, в зависимости от значения переменной month , в потоке стандартного вывода будет отображаться соответствующее сообщение. В этом случае, поскольку month = 8 , то будет выведено сообщение August .
Оператор switch
И хотя в таких популярных языках, таких как Java и PHP, есть собственный оператор switch , то вы наверное быть удивлены, узнав, что в языке Python его нет. Поэтому у вас, наверняка, уже возникал соблазн написать серию блоков кода if-else-if, используя условный оператор if для каждого значения в case оператора switch .
Тем не менее из-за использования этой таблицы переходов оператор switch работает намного быстрее, чем “лестница” из if-else-if . Вместо того, чтобы последовательно оценивать каждое условие после оператора if , ему нужно только один раз вычислить значение переменной/выражения в switch и непосредственно перейти к соответствующей ветви кода для его выполнения.
Как реализовать оператор switch в Python
Рассмотрим способ реализации оператора switch на языке Python, который заключается в использовании механизма сопоставления словарей. Также этот тип данных более известен как ассоциативные массивы, которые реализуют операцию простого сопоставления «ключ-значение».
В следующем примере мы создаем словарь switcher , который будет хранить все значения, помещаемые после ключевого слова case .
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 , оно сопоставляется с ключами словаря switcher . И если совпадение будет найдено, то в терминале будет выведено связанное с ним значение (месяц), в противном случае печатается строка по умолчанию «Invalid month». Строка по умолчанию помогает реализовать инструкцию default case оператора switch .
Сопоставление ключей словаря для функций
Теперь становится интереснее. Как известно, значениями словаря Python могут быть данные любого типа. Таким образом, нам не нужно ограничиваться использованием констант (целых чисел, строк), мы можем использовать в качестве значений словаря как имена функций, так и лямбда-выражения.
Теперь с учетом вышесказанного, мы можем переписать наш пример реализации оператора switch , используя словарь с именами функций, используемых в качестве значений. В данном случае 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 ># Получим функцию из словаря switcher func = switcher.get(argument, lambda: "Invalid month") # Вызовем полученную функцию print func()
Хотя указанные выше функции довольно просты и возвращают только строки, вы можете использовать этот подход для выполнения более сложных блоков кода внутри каждой функции.
Фактически, если вы вызываете методы для объектов, вы даже можете использовать специальный метод для диспетчеризации, чтобы динамически определять, какую функцию нужно вызывать во время выполнения.
class Switcher(object): def numbers_to_months(self, argument): """Dispatch method""" method_name = 'month_' + str(argument) # Получим соответствующий метод у объекта self. По умолчанию передадим lambda функцию. method = getattr(self, method_name, lambda: "Invalid month") # Вызовем метод и вернем его результат 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 для реализации switch
Поскольку можно изменять словари 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): # Получим функцию из словаря switcher func = switcher.get(argument, "nothing") # вызовем соответствующую функции return func()
Результатом его выполнения будет вывод следующих значений в терминале.
Input: numbers_to_strings(1) Output: One Input: switcher[1]=two # тут мы изменили поведение для определенного case в switcher Input: numbers_to_strings(1) Output: Two
Switch-case — очень полезная конструкция кода, которая не только обеспечивает лучшую производительность, чем использование последовательности операторов if-else , но и предоставляет разработчику более управляемый и гибкий код. Если вы почувствовали себя ограниченным в своих действия из-за отсутствия оператора switch в Python, надеюсь, эта статья поможет реализовать его в ваших программах.
Реализация Switch-Case в Python
Python не поддерживает операторы switch-case. Было предложение ввести операторы Python switch case в PEP-3103, но оно было отклонено, поскольку не добавляет слишком большого значения.
Мы можем легко реализовать логику операторов switch-case, используя операторы if-else-elif. Однако мы можем реализовать поведение типа switch, используя собственный код.
Реализация Switch-Case в Python
Есть два способа реализовать в Python поведение switch-case.
1. Реализация Python Switch Case с использованием словаря
Мы можем создать словарь, в котором ключ будет регистром, а значение будет результатом. Мы вызовем метод словаря get() со значением по умолчанию, чтобы реализовать сценарий, когда нет подходящего случая.
Допустим, у нас есть следующий блок if-else.
print("Choices:\n 1 - Email\n 2 - SMS\n 3 - Push Notification") x = input("Please enter your choice:\n") x = int(x) if x is 1: print('sending email') elif x is 2: print('sending sms') elif x is 3: print('sending push notification') else: print('wrong choice')
Теперь мы хотим преобразовать его в поведение switch-case с помощью словаря.
print("Choices:\n 1 - Email\n 2 - SMS\n 3 - Push Notification") x = input("Please enter your choice:\n") x = int(x) choices_dict = print(choices_dict.get(x, 'wrong choice'))
2. С динамическими функциями
Вышеупомянутая реализация работает с простыми операторами печати. Но в большинстве случаев мы выполняем какой-либо метод в блоках if-else, и тогда словарь не будет работать как замена switch-case.
Допустим, у нас есть следующий блок if-else для выполнения некоторой операции с входным целым числом.
import math x = input("Please enter an integer:\n") x = int(x) print("Choices:\n 1 - Square\n 2 - Cube\n 3 - Square Root") choice = input("Please enter your choice:\n") choice = int(choice) if choice is 1: print(math.pow(x, 2)) elif choice is 2: print(math.pow(x, 3)) elif choice is 3: print(math.sqrt(x))
Мы можем создать динамический метод для реализации поведения типа switch-case.
import math x = input("Please enter an integer:\n") x = int(x) print("Choices:\n 1 - Square\n 2 - Cube\n 3 - Square Root") choice = input("Please enter your choice:\n") choice = int(choice) def switch_func(value, i): return < 1: lambda val: math.pow(val, 2), 2: lambda val: math.pow(val, 3), 3: lambda val: math.sqrt(val), >.get(value)(i) print(switch_func(choice, x))
Здесь выбор сопоставляется с ключом словаря, а входное целое число сопоставляется с лямбда-функцией. Наконец, результат лямбда-функции возвращается из вызова switch_func().
Вывод
Хорошо поэкспериментировать с реализацией операторов switch-case. Но это очень сбивает с толку, и мы не можем реализовать сложные сценарии с несколькими операторами в блоке if-else. Итак, придерживайтесь простых старых операторов if-else и делайте свой код простым и легким для чтения.
Python Switch Statement – Switch Case Example
Kolade Chris
Until version 3.10, Python never had a feature that implemented what the switch statement does in other programming languages.
So, if you wanted to execute multiple conditional statements, you would’ve had to use the elif keyword like this:
age = 120 if age > 90: print("You are too old to party, granny.") elif age < 0: print("You're yet to be born") elif age >= 18: print("You are allowed to party") else: "You're too young to party" # Output: You are too old to party, granny.
From version 3.10 upwards, Python has implemented a switch case feature called “structural pattern matching”. You can implement this feature with the match and case keywords.
Some people debate whether or not the match and case are keywords in Python. This is because you can use both of them as variable and function names. But that’s another story for another day.
You can refer to both keywords as «soft keywords» if you like.
In this article, I will show you how to write a switch statement in Python using the match and case keywords.
But before that, I have to show you how Python programmers used to simulate a switch statement back in the day.
How Python Programmers Used to Simulate Switch Case
There were multiple ways Pythonistas simulated switch statements back in the day.
Using a function and the elif keyword was one of them and you can do it this way:
def switch(lang): if lang == "JavaScript": return "You can become a web developer." elif lang == "PHP": return "You can become a backend developer." elif lang == "Python": return "You can become a Data Scientist" elif lang == "Solidity": return "You can become a Blockchain developer." elif lang == "Java": return "You can become a mobile app developer" print(switch("JavaScript")) print(switch("PHP")) print(switch("Java")) """ Output: You can become a web developer. You can become a backend developer. You can become a mobile app developer """
How to Implement Switch Statements with the match and case Keywords in Python 3.10
To write switch statements with the structural pattern matching feature, you can use the syntax below:
match term: case pattern-1: action-1 case pattern-2: action-2 case pattern-3: action-3 case _: action-default
Note that the underscore symbol is what you use to define a default case for the switch statement in Python.
An example of a switch statement written with the match case syntax is shown below. It is a program that prints what you can become when you learn various programming languages:
lang = input("What's the programming language you want to learn? ") match lang: case "JavaScript": print("You can become a web developer.") case "Python": print("You can become a Data Scientist") case "PHP": print("You can become a backend developer") case "Solidity": print("You can become a Blockchain developer") case "Java": print("You can become a mobile app developer") case _: print("The language doesn't matter, what matters is solving problems.")
That’s a much cleaner syntax than multiple elif statements and simulating the switch statement with a function.
You probably noticed I did not add a break keyword to each of the cases, as it is done in other programming languages. That’s the advantage Python’s native switch statement has over those of other languages. The break keyword’s functionality is done for you behind the scenes.
Conclusion
This article showed you how to write switch statements with the “match” and “case” keywords. You also learned how Python programmers used to write it before version 3.10.
The Python match and case statements were implemented to provide the functionality that the switch statement feature in other programming languages such as JavaScript, PHP, C++, and others give us.