Всіх вітаю! Сьогодні ми поговоримо про конструкція match-case у Python, який, по суті, є подібною до if-else і також виконує різні блоки коду залежно від умов. Дана контсрукція є нововеденням і з’явилався тільки у версії
Розбір конструкції match-case
Використання конструкції match-case із цілими числами
Конструкція match-case дуже схожа з if-else і, по суті, виконує майже ті ж самі дії, але у трохи інший спосіб. Тож пропоную одразу перейти до прикладів.
Створюємо зміну wallet_cash, яка і буде головним виразом нашого оператора:
wallet_cash = 1000Спочатку ми пишемо ключове слово match, а потім вказуємо загальний вираз, на якому будуть базуватися усі подальші умови:
match wallet_cash:Тепер додаємо гілки розвитку нашої програми за допомогою ключового слова case. Даний оператор відповідає за умову, за якої буде виконуватися та чи інша частина коду, що відповідатиме заданій умові.
Додаємо ключові слова з умовами:
match wallet_cash:
case 100:
print("You have 100$")
case 500:
print("You have 500$")
case 800:
print("You have 800$")
case 1000:
print("You have 1000$")У підсумку ми створили програму, яка буде виводити відповідний текст у консоль залежно від значення змінної wallet_cash. Тепер запускаємо код і отримуємо результат:
You have 1000$Отже, спрацювала остання гілка конструкції case, яка виконується лише тоді, якщо змінна wallet_cash дорівнюватиме 1000, що й написано у нашій програмі.
Отже, ось перший повний код та резултат першого прикладу:
wallet_cash = 1000
match wallet_cash:
case 100:
print("You have 100$")
case 500:
print("You have 500$")
case 800:
print("You have 800$")
case 1000:
print("You have 1000$")You have 1000$Використання конструкції match-case з рядками
Тепер спробуємо використати рядки замість чисел. Отже, ось приклад, де ми маємо змінну country_code, від значення якої залежать усі подальші умови:
country_code = "DE"
match country_code:
case "UA":
print("Welcome to Ukraine!")
case "PL":
print("Welcome to Poland!")
case "DE":
print("Welcome to Germany!")
case "CZ":
print("Welcome to Czechia!")
case "GB":
print("Welcome to Great Britain!")
case "USA":
print("Welcome to United States of America!")Результат цього коду:
Welcome to Germany!Отримали саме рядок “Welcome to Germany!”, бо змінна country_code дорівнює “DE”.
Виконання гілки, якщо жодні інші умови не виконуються
Якщо жодні ваші умови не виконуються, але вам потрібно виводити якийсь результат, то можна використати символ нижного підкреслення (_), щоб у разі невиконання усіх попередніх умов програма все одно виконувала визначений блок коду. По суті, символ _ у match-case працює як звичний нам else.
Ось приклад:
secret_key = input("Secret key: ")
match secret_key:
case "qwerty":
print(f"Correct!")
case _:
print("Incorrect")Результат (якщо ключ правильний):
Secret key: qwerty
Correct!Результат (якщо ключ не правильний):
Secret key: jcosaoa
IncorrectПоєднання конструкцій match-case та if-else
Далі пропоную розглянути поєднання конструкцій match-case та if-else. Справа у тому, що їх цілком легко можна використовувати одночасно.
Ось приклад використання обох конструкцій:
chess_shape = "King"
match chess_shape:
case chess_shape if chess_shape == "King":
print("King on the board")
case chess_shape if chess_shape == "Queen":
print("Queen on the board")
case chess_shape if chess_shape == "Rook":
print("Rook on the board")
case chess_shape if chess_shape == "Bishop":
print("Bishop on the board")
case chess_shape if chess_shape == "Knight":
print("Knight on the board")
case chess_shape if chess_shape == "Pawn":
print("Pawn on the board")Результат:
King on the boardТут важливо звернути увагу на те, що після ключового слова case потрібно записувати загальний вираз (у нашому випадку змінну chess_shapes), якщо хочемо використати обидві конструкції.
Використання логічних операторів АБО та І у конструкції match-case
У даному прикладі ми будемо використовувати оператори АБО та І для того, щоб розширити діапазон потрапляння значення умовної змінної у конкретну гілку програми (case).
Ось так виглядають випадки, з умовами або:
artist = "Prince"
match artist:
case "Prince" | "Michael Jackson":
print("Rock-n-Roll/Pop")
case "Nas" | "A$AP Rocky":
print("Rap/Hip-hop")
case "Nirvana" | "Radiohead":
print("Grunge/Rock!")
case "Gil Scott Heron" | "Duke Ellington":
print("Jazz")Результат:
Rock-n-Roll/PopУ цьому коді ми просто додали більше опцій до умов. Тепер кожна умова може спрацювати тоді, коли у змінній artist буде одне із двох прописаних значень. Наприклад, ми отримали текст “Rock-n-Roll/Pop”, тому що значення змінної artist було “Prince”, але отримали б той самий текст, якби значення було "Michael Jackson".
Якщо ж ми захочемо додати оператор І (&&) в умови match-case, то зіштовхнемося із помилкою, бо конструкція match-case цілковито не підтримує використання оператора І.
Єдиний спосіб використати оператор І у match-case — це скомбінувати його із конструкцією if-else. Щоб використати даний оператор потрібно комбінувати конструкції match-case та if-else.
Робиться це доволі легко:
tickets = 5
coins = 5
match [tickets, coins]:
case [tickets, coins] if tickets == 5 and coins == 5:
print("5 tickets = 5 coins")
case [tickets, coins] if tickets == 2 and coins == 2:
print("2 tickets = 2 coins")
case [tickets, coins] if tickets == 7 and coins == 7:
print("7 tickets = 7 coins")
case [tickets, coins] if tickets == 0 and coins == 0:
print("0 tickets = 0 coins")5 tickets = 5 coinsТак як ми використовували одразу дві змінні, то записали їх у загальному виразі match як список.
У цьому коді важливо звернути увагу на той момент, що при використанні оператора І у конструкціях if-else потрібно записувати оператор І як and, а не &&.
Відмінність між match-case та if-else
Напевно, за час прочитання даної статті і постійними порівняннями з конструкцією if-else, ви вже задалися питанням, а чим взагалі відрізняються match-case від if-else? Якраз у цьому розділі ми й розберемо це питання.
Для початку напишемо звичайну програму, використовуючи if-else:
total_grade = 100
if total_grade > 60:
print("Bigger than 60")
if total_grade > 70:
print("Bigger than 70")
if total_grade > 80:
print("Bigger than 80")
if total_grade > 90:
print("Bigger than 90")Тепер пропоную трішки подумати над тим, як саме буде виконуватися цей код. Даний код буде перевіряти та виконувати кожну умову, бо усі умови тут дають True.
Запускаємо код:
Bigger than 60
Bigger than 70
Bigger than 80
Bigger than 90Як бачимо, усі абсолютно умови виконалися.
Тепер напишемо ту саму програму, але використовуючи match-case:
total_grade = 100
match total_grade:
case total_grade if total_grade > 60:
print("Bigger than 60")
case total_grade if total_grade > 70:
print("Bigger than 70")
case total_grade if total_grade > 80:
print("Bigger than 80")
case total_grade if total_grade > 90:
print("Bigger than 90")У цьому коді абсолютно всі ті ж умови, лише додали match-case.
А тепер запустимо цю програму:
Bigger than 60Отже, виконалася лише перша умова — це і є відмінність match-case від if-else. Справа у тому, що конструкція match-case виконує лише першу умову, яка справджується, і далі вона просто зупиняється.
У свою чергу конструкція if-else виконує абсолютно усі умови, які справджуються. Вона зупиняється лише тоді, коли будь-які умови повністю закінчуються.
Використання конструкції match-case зі списками
Тепер слід показати, як саме використовувати конструкцію match-case зі списками. Взагалі-то, ми вже бачили такий приклад, коли намагалися використати логічний оператор І, бо у тому прикладі ми записали обидві змінні як список. Тим не менш, ще один приклад зайвим не буває.
Ось приклад, де ми будемо визначати довжину списку за допомогою конструкцій match-case та if-else:
numbers_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
match numbers_list:
case numbers_list if len(numbers_list) <= 3:
print(f"List length is {len(numbers_list)}, which is less than or equal to 3")
case numbers_list if len(numbers_list) <= 5:
print(f"List length is {len(numbers_list)}, which is less than or equal to 5")
case numbers_list if len(numbers_list) <= 8:
print(f"List length is {len(numbers_list)}, which is less than or equal to 8")
case numbers_list if len(numbers_list) <= 10:
print(f"List length is {len(numbers_list)}, which is less than or equal to 10")
case numbers_list if len(numbers_list) <= 12:
print(f"List length is {len(numbers_list)}, which is less than or equal to 12")
case numbers_list if len(numbers_list) <= 15:
print(f"List length is {len(numbers_list)}, which is less than or equal to 15")Результат:
List length is 15, which is less than or equal to 15Використання конструкції match-case зі словниками
І наостанок спробуємо використати match-case зі словниками:
first_name_input = input("First name: ")
name_dict = {"First name": first_name_input,
"Surname": "Goldsman"
}
match name_dict:
case {"First name": "Andre"}:
print(f"You're Andre Goldsman, welcome!")
case _:
print("Undefined first name")Результат (якщо напишемо ім’я Andre):
First name: Andre
You're Andre Goldsman, welcome!Результат (якщо напишемо будь-яку інше ім’я):
First name: Harold
Undefined first nameТут варто звернути увагу на те, як ми отримуємо перший результат, коли пишемо правильне ім’я. За це відповідає перша гілка програми (case {"First name": "Andre"}:), де ми ставимо умову, що ім’я обов’язково повинно бути Andre, інакше програма не виконує блок коду під цією умовою.
Такий запис взагалі може здатися дивним, але він є і він працює у рамках конструкції match-case. По суті, такий запис рівноцінний звичному запису через if-else:
if name_dict["First name"] == "Andre":
print(f"You're Andre Goldsman, welcome!")Ось аналог програми, що написаний лише за допомогою if-else:
first_name_input = input("First name: ")
name_dict = {"First name": first_name_input,
"Surname": "Goldsman"
}
if name_dict["First name"] == "Andre":
print(f"You're Andre Goldsman, welcome!")
else:
print("Undefined first name")Обидві програми будуть працювати ідентично.
Висновок
Що ж, у цій статті було достатньо детально розібрано конструкцію match-case, її особливості та приклади використання із різними типами даних.
Всім дякую за увагу!