Друкарня від WE.UA

Конструкція match-case у Python

Зміст

Всіх вітаю! Сьогодні ми поговоримо про конструкція 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, її особливості та приклади використання із різними типами даних.
Всім дякую за увагу!

Статті про вітчизняний бізнес та цікавих людей:

Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Magnifique numérique
Magnifique numérique@nocturnal_reader

Нічний читач

78Довгочити
1.5KПерегляди
23Підписники
Підтримати
На Друкарні з 14 липня 2025

Більше від автора

  • Метод isspace() у Python

    Всіх вітаю! У даній статті ми розглянемо метод isspace() та приклади його використання у коді.

    Теми цього довгочиту:

    Програмування
  • Метод join() у Python

    Всіх вітаю! Сьогодні ми розглянемо метод join() та принцип його використання у коді.

    Теми цього довгочиту:

    Програмування
  • Метод capitalize() у Python

    Всіх вітаю! У цій статті ми поговоримо про метод capitalize() у Python та те, яким чином він працює.

    Теми цього довгочиту:

    Програмування

Це також може зацікавити:

Коментарі (0)

Підтримайте автора першим.
Напишіть коментар!

Це також може зацікавити: