[Explained] Як реалізувати Switch-Case у Python

Хочете реалізувати конструкцію перемикання регістрів у Python? Дізнайтеся про різні підходи, до яких можна імітувати зміну регістру.

Якщо ви програмували на C або JavaScript, ви використовували оператор switch-case. Але навіщо нам конструкція switch-case?

Припустимо, у вас є набір різних дій (або блоків коду). І те, яку дію ви виконуєте (блок коду для виконання), залежить від значення змінної або виразу.

Деякі приклади:

  • Виставлення оцінок учням на основі отриманих балів
  • Вибір техніки маніпулювання рядками на основі вибору користувача
  • Виконання арифметичних дій над двома числами в залежності від введення користувача

Отже, конструкція switch-case забезпечує зручний спосіб реалізації такої логіки. Коли вам потрібно виконати одну з багатьох можливих дій на основі значення змінної або виразу.

Хоча Python не має вбудованої конструкції перемикання регістрів, є кілька підходів, які можна використовувати для досягнення подібної функціональності. У цій статті ми розглянемо ці підходи.

Емуляція поведінки Switch-Case у Python

Давайте подивимося, як ми можемо емулювати поведінку зміни регістру в Python на прикладі.

Ми напишемо просту програму, яка виконує наступне:

  • Зразок слова, рядка Python, випадковим чином зі списку слів.
  • Надайте контекст і підказуйте користувачеві. Визначте операції з рядками — маніпуляції з рядками — для виконання над вибраним словом.
  • Облік операцій для зміни регістру (маленький, верхній регістр, заголовок тощо), включаючи поведінку за замовчуванням. За потреби використовуйте вбудовані рядкові методи Python.
  • Запит користувача на введення. Оскільки введення за замовчуванням є рядком, перетворіть його на int за допомогою приведення типу.

Рядки Python незмінні. Таким чином, рядкові методи не змінюють вихідний рядок. Натомість вони повертають копію рядка з потрібними змінами. Давайте розглянемо рядкові методи Python, які ми будемо використовувати:

String MethodDescriptionlower()Повертає копію рядка, де всі символи написані у нижньому регістріupper()Повертає копію рядка, де всі символи написані у верхньому регістріtitle()Повертає копію рядка, відформатованого в заголовку, caseswapcase()Повертає копію рядок, у якому символи нижнього та верхнього регістрів перетворюються на великі та малі відповідно

Наведений нижче фрагмент коду випадковим чином відбирає слово зі списку word_list і отримує введені користувачем дані:

import random

# List of words to choose from
word_list = ["Python", "programming", "Hello", "world", "context", "Switch"]

# Randomly select a word from the list
word = random.choice(word_list)

# Provide context and available options to the user
print("Welcome! You have a randomly selected word.")
print("Choose an option to manipulate the word:")
print("1. Lowercase")
print("2. Uppercase")
print("3. Titlecase")
print("4. Swapcase")
print("5. Default behavior")

# Get user option
option = int(input("Enter your option: "))

Ось приклад, який показує, як рядок “Python” змінюється на основі вибору користувача:

Коли ви зараз запускаєте програму, вам має бути запропоновано ввести ось такий:

Welcome! You have a randomly selected word.

Choose an option to manipulate the word:
1. Lowercase
2. Uppercase
3. Titlecase
4. Swapcase
5. Default behavior

Enter your option: 

Далі перейдемо до реалізації різних підходів.

Використання сходів If-Elif-Else

У цьому підході ми використовуємо серію операторів if-elif-else, щоб перевірити вибір користувача на попередньо визначені параметри. Потім ми виконуємо відповідний блок коду на основі введених користувачем даних.

# if-elif-else 

if option == 1:
    result = word.lower()
elif option == 2:
    result = word.upper()
elif option == 3:
    result = word.title()
elif option == 4:
    result = word.swapcase()
else:
    result = word

print(f"Your random word is {word} and the result is {result}")

Тут:

  • Ми порівнюємо дані користувача для кожної опції за допомогою операторів if-elif.
  • Коли збіг знайдено, ми виконуємо відповідний блок коду.
  • Якщо жодна з умов if-elif не відповідає, ми виконуємо блок else для типової поведінки.

Ви можете запустити сценарій зараз, ввести вибір і перевірити результат:

Welcome! You have a randomly selected word

Choose an option to manipulate the word:
1. Lowercase
2. Uppercase
3. Titlecase
4. Swapcase
5. Default behavior

Enter your option: 2

Your random word is Switch and the result is SWITCH.

Сходи if-elif-else легко реалізувати. Але підтримувати його може бути складно. У цьому прикладі ми мали п’ять випадків (включаючи поведінку за замовчуванням). Однак на практиці ми можемо мати набагато більше випадків. Такі довгі драбини if-elif-else — кодовий запах, якого вам слід уникати.

Отже, давайте перейдемо до реалізації, яка підтримується.

Використання відображення словника та першокласних функцій

Ви можете використовувати словники та функції Python для імітації поведінки зміни регістру.

📑 Функції Python є першокласними громадянами

У Python функції є громадянами першого класу. Ви можете зробити набагато більше, ніж просто визначити та викликати функції:

  • Визначивши функцію, ви можете призначити її іншій змінній, використовувати функції як елементи списків, значення в словнику та багато іншого.
  • Ви також можете передавати їх: функції можна передавати як аргументи іншим функціям, а функції можуть повертати функції.

У цьому підході ми будемо використовувати словник для зіставлення вибору користувача з відповідними функціями чи діями. Це більш ефективний спосіб обробки кількох варіантів, оскільки він уникає довгого ланцюжка операторів if-elif.

Спочатку давайте визначимо наступні функції для різних операцій над рядками:

# Define functions for each option
def lower_case(word):
    return word.lower()

def upper_case(word):
    return word.upper()

def title_case(word):
    return word.title()

def swap_case(word):
    return word.swapcase()

Далі зробимо наступне:

  • Створіть словник під назвою вибори, де ключі — це вибори користувача, а значення — функції або дії, які потрібно виконати.
  • Використовуйте метод словника get(), щоб отримати вибрану дію на основі вибору користувача. Якщо вибору немає в словнику, ми надаємо дію за замовчуванням, визначену лямбда-функцією.
  • Потім виконайте вибрану дію над випадковим словом.
# Store functions in a dictionary
options = {
    1: lower_case,
    2: upper_case,
    3: title_case,
    4: swap_case,
}

# Use the dictionary to select and call the appropriate function
result = options.get(option, lambda x: x)(word)

print(f"Your random word is {word} and the result is {result}")

Ось зразок результату:

Welcome! You have a randomly selected word.

Choose an option to manipulate the word:
1. Lowercase
2. Uppercase
3. Titlecase
4. Swapcase
5. Default behavior

Enter your option: 4

Your random word is Hello and the result is hELLO.

Використання Match-Case

📝 Примітка: вам потрібен Python 3.10 або пізніша версія, щоб використовувати оператори match-case.

Починаючи з Python 3.10, ви можете використовувати інструкцію відповідності для реалізації конструкції, подібної до регістра. Оператор збігу з його простим синтаксисом забезпечує більш інтуїтивно зрозумілий спосіб обробки кількох випадків. _ (підкреслення) служить регістром за замовчуванням.

Ось як ми можемо переписати наш приклад за допомогою регістру збігів:

  • Ми використовуємо оператор відповідності, щоб порівняти введені користувачем дані з різними випадками.
  • Кожен випадок визначає вибір і код для виконання, якщо цей вибір відповідає.
  • _ (підкреслення) служить регістром за замовчуванням, код виконується, коли жоден інший регістр не відповідає.
match option:
    case 1:
        result =  word.lower()
    case 2:
        result = word.upper()
    case 3:
        result = word.title()
    case 4:
        result = word.swapcase()
    case _:
        result = word  # Default behavior, return the string as is

print(f"Your random word is {word} and the result is {result}.")

Тепер ви можете запустити сценарій і перевірити результат:

Welcome! You have a randomly selected word.

Choose an option to manipulate the word:
1. Lowercase
2. Uppercase
3. Titlecase
4. Swapcase
5. Default behavior

Enter your option: 2
Your random word is world and the result is WORLD.

⚙ Хоча оператор відповідності забезпечує зручний спосіб реалізації конструкції перемикання регістрів, він призначений для більш корисних відповідність структурного зразка завдання, окрім імітації зміни регістру.

Підведенню

Давайте підсумуємо різні підходи до досягнення функціональності зміни регістру в Python:

  • Сходи if-elif-else легко реалізувати, але підтримувати її важко. Тож використовуйте їх мінімально — лише тоді, коли у вас немає надто багато варіантів для перевірки.
  • Ви можете використовувати словники та функції Python для імітації поведінки зміни регістру. Додайте різні варіанти та відповідні функції як ключі та значення словника відповідно.
  • Оператор match-case, представлений у Python 3.10, допомагає реалізувати цю конструкцію switch-case за допомогою простого та інтуїтивно зрозумілого синтаксису. Однак оператор match-case є чудовим вибором для більш цікавих варіантів використання зіставлення структурних шаблонів.

Ви можете знайти приклади коду для цього підручника на GitHub. Якщо ви готуєтеся до співбесіди з кодування, перегляньте цю добірку найпопулярніших запитань для співбесіди з Python.