Конструкция `match` в Python 3
Конструкция `match` в Python 3 – это мощный инструмент, введенный в версии 3.10, который позволяет выполнять сопоставление с образцами (pattern matching). Он предоставляет более гибкий и читаемый способ разветвления кода по различным условиям, похожий на конструкциях switch
в других языках программирования.
Основные принципы
- Сопоставление с образцами:
match
пытается сопоставить значение с одним из образцов, указанных в блокеcase
. Если соответствие найдено, выполняется код в блокеcase
. - Порядок выполнения:
match
выполняет проверку образцов последовательно, от первого к последнему. Если соответствие найдено, дальнейшие проверки не происходят. - Условие `_`: Условие
_
(подчеркивание) используется для задания поведения по умолчанию, если ни один из предыдущих образцов не совпал. - Переменные в образцах: В образцах можно использовать переменные для захвата значений, соответствующих образцу.
Примеры
1. Простой пример
def get_message(day):
match day:
case "понедельник":
return "С началом рабочей недели!"
case "пятница":
return "До выходных осталось совсем немного!"
case _:
return "Какой-то другой день."
print(get_message("понедельник")) # Выведет: "С началом рабочей недели!"
print(get_message("пятница")) # Выведет: "До выходных осталось совсем немного!"
print(get_message("среда")) # Выведет: "Какой-то другой день."
В этом примере функция get_message
принимает название дня недели и возвращает соответствующее сообщение. Конструкция match
проверяет значение переменной day
на соответствие образцам “понедельник” и “пятница”. Если совпадение найдено, возвращается соответствующее сообщение. В противном случае выполняется блок _
, который возвращает “Какой-то другой день.”.
2. Сопоставление с переменными
def calculate_area(shape):
match shape:
case {"тип": "квадрат", "сторона": side}:
return side * side
case {"тип": "прямоугольник", "ширина": width, "высота": height}:
return width * height
case _:
return "Неизвестный тип фигуры"
print(calculate_area({"тип": "квадрат", "сторона": 5})) # Выведет: 25
print(calculate_area({"тип": "прямоугольник", "ширина": 4, "высота": 3})) # Выведет: 12
print(calculate_area({"тип": "круг", "радиус": 2})) # Выведет: "Неизвестный тип фигуры"
В этом примере функция calculate_area
принимает словарь, описывающий геометрическую фигуру. Конструкция match
сопоставляет значение переменной shape
с образцами, задающими тип фигуры и ее параметры. Если совпадение найдено, выполняется соответствующий код для вычисления площади. В противном случае выполняется блок _
, который возвращает сообщение “Неизвестный тип фигуры.”.
3. Сопоставление с последовательностями
def check_status(status):
match status:
case [200, 201]:
return "Успешный запрос"
case [400, 401, 403]:
return "Ошибка запроса"
case [500, 502, 503]:
return "Ошибка сервера"
case _:
return "Неизвестный статус"
print(check_status([200])) # Выведет: "Успешный запрос"
print(check_status([401])) # Выведет: "Ошибка запроса"
print(check_status([502])) # Выведет: "Ошибка сервера"
print(check_status([418])) # Выведет: "Неизвестный статус"
В этом примере функция check_status
принимает код HTTP статуса и возвращает сообщение о статусе запроса. Конструкция match
сопоставляет значение переменной status
с образцами, представляющими группы HTTP кодов статусов. Если совпадение найдено, выполняется соответствующий код для возврата сообщения. В противном случае выполняется блок _
, который возвращает сообщение “Неизвестный статус.”.
4. Использование as
для присваивания значений
def get_user_data(data):
match data:
case {"name": name, "age": age}:
return f"Имя: {name}, возраст: {age}"
case {"username": username, "email": email}:
return f"Имя пользователя: {username}, email: {email}"
case _:
return "Некорректные данные"
user_data = {"name": "Иван", "age": 30}
print(get_user_data(user_data)) # Выведет: "Имя: Иван, возраст: 30"
В этом примере функция get_user_data
принимает словарь, описывающий данные пользователя. Конструкция match
сопоставляет значение переменной data
с образцами, задающими структуру данных пользователя. Ключевое слово as
используется для присваивания значений переменных name
, age
, username
и email
, которые соответствуют образцу. Если совпадение найдено, возвращается строка, содержащая данные пользователя. В противном случае выполняется блок _
, который возвращает сообщение “Некорректные данные.”.
Конструкция match
в Python 3 предоставляет более гибкий и читаемый способ разветвления кода по различным условиям. Она позволяет сопоставлять значение с образцами, использовать переменные для захвата значений, а также использовать условие _
для задания поведения по умолчанию.
match
упрощает написание кода и делает его более читаемым, особенно в случаях с большим количеством условий и сложной логикой.