[Explained] Како имплементирати Свитцх-Цасе у Питхон-у

Да ли желите да примените структуру `switch-case` у програмском језику Python? Истражите различите методе које можете користити да симулирате рад `switch` конструкције.

Ако сте већ имали искуства са програмирањем у језицима као што су C или JavaScript, вероватно сте користили `switch-case` наредбу. Али, зашто нам уопште треба ова конструкција?

Претпоставимо да имате скуп различитих операција (или блокова кода). Коју ћете операцију извршити зависи од вредности одређене променљиве или израза.

Неки примери укључују:

  • Додељивање оцена ученицима на основу њихових постигнућа
  • Одабир техника обраде текста у зависности од корисниковог избора
  • Извршавање математичких операција над два броја на основу корисничког уноса

Дакле, `switch-case` структура пружа једноставан начин за имплементацију овакве логике. Потребна је када треба да извршите једну од многих могућих операција на основу вредности неке променљиве или израза.

Иако Python нема уграђену `switch-case` конструкцију, постоји неколико метода које можете користити за постизање сличне функционалности. У овом чланку ћемо истражити те методе.

Симулација `switch-case` понашања у Python-у

Погледајмо како можемо да симулирамо `switch-case` структуру у Python-у кроз један пример.

Написаћемо кратак програм који ради следеће:

  • Насумично бира реч, Python стринг, са листе речи.
  • Пружа кориснику контекст и захтева од њега да дефинише операције над изабраном речју.
  • Узима у обзир операције за промену величине слова (мала, велика, насловна и још неке), укључујући подразумевано понашање. Користи уграђене Python методе за стрингове кад је то потребно.
  • Захтева од корисника унос. Пошто је унос, по дефиницији, стринг, конвертује га у целобројну вредност користећи експлицитну конверзију типа.

Python стрингови су непроменљиви. То значи да методе стрингова не мењају оригинални стринг. Уместо тога, враћају копију стринга са извршеним изменама. Ево прегледа Python метода које ћемо користити:

Метода стринга Опис
lower() Враћа копију стринга где су сва слова претворена у мала слова.
upper() Враћа копију стринга где су сва слова претворена у велика слова.
title() Враћа копију стринга форматирану као наслов (прво слово сваке речи је велико).
swapcase() Враћа копију стринга где се мала слова претварају у велика и обрнуто.

Следећи исечак кода насумично бира реч из word_list и узима кориснички унос:

import random

# Листа речи за избор
word_list = ["Python", "programming", "Hello", "world", "context", "Switch"]

# Насумично изаберите реч са листе
word = random.choice(word_list)

# Пружање контекста и доступних опција кориснику
print("Добродошли! Насумично сте изабрали реч.")
print("Изаберите опцију за манипулацију речју:")
print("1. Мала слова")
print("2. Велика слова")
print("3. Насловна слова")
print("4. Замена слова")
print("5. Подразумевано понашање")

# Узмите опцију корисника
option = int(input("Унесите вашу опцију: "))

Ево примера који показује како се стринг „Python“ мења на основу корисниковог избора:

Када покренете програм, требало би да добијете упит за унос сличан овом:

Добродошли! Насумично сте изабрали реч.

Изаберите опцију за манипулацију речју:
1. Мала слова
2. Велика слова
3. Насловна слова
4. Замена слова
5. Подразумевано понашање

Унесите вашу опцију: 

Сада, хајде да наставимо са имплементацијом различитих приступа.

Коришћење `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"Ваша насумична реч је {word}, а резултат је {result}")

Где:

  • Упоређујемо кориснички унос са сваком опцијом користећи `if-elif` изразе.
  • Када се пронађе поклапање, извршавамо одговарајући блок кода.
  • Ако ниједан од `if-elif` услова није испуњен, извршавамо `else` блок за подразумевано понашање.

Можете покренути скрипту сада, унети избор и проверити излаз:

Добродошли! Насумично сте изабрали реч

Изаберите опцију за манипулацију речју:
1. Мала слова
2. Велика слова
3. Насловна слова
4. Замена слова
5. Подразумевано понашање

Унесите вашу опцију: 2

Ваша насумична реч је Switch, а резултат је SWITCH.

Конструкција `if-elif-else` је једноставна за имплементацију. Али може бити тешко одржавати је. У овом примеру, имали смо пет случајева (укључујући подразумевано понашање). У пракси, међутим, можемо имати много више случајева. Овако дугачка `if-elif-else` структура представља код који треба избегавати.

Зато, пређимо на имплементацију која је лакша за одржавање.

Коришћење мапирања речника и функција прве класе

Можете искористити Python речнике и функције да бисте симулирали `switch-case` понашање.

📑 Python функције су грађани прве класе

У Python-у, функције су грађани првог реда. Можете учинити много више од обичног дефинисања и позивања функција:

  • Када дефинишете функцију, можете је доделити другој променљивој, користити је као елемент листе, вредност у речнику и још много тога.
  • Такође можете прослеђивати функције: функције се могу прослеђивати као аргументи другим функцијама, а функције могу враћати функције.

У овом приступу, користићемо речник да пресликамо корисничке изборе на одговарајуће функције или операције. Ово је ефикаснији начин за руковање већим бројем избора, јер избегава дуг ланац `if-elif` израза.

Прво, дефинишимо функције за различите операције са стринговима:

# Дефинисање функција за сваку опцију
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()

Затим, урадимо следеће:

  • Направите речник који се зове `options` где су кључеви кориснички избори, а вредности су функције или операције које треба извршити.
  • Користите методу речника `get()` да бисте преузели одабрану операцију на основу корисничког избора. Ако избор није пронађен у речнику, пружамо подразумевану акцију специфицирану ламбда функцијом.
  • Затим, извршавамо одабрану операцију на насумичној речи.
# Складиштење функција у речник
options = {
    1: lower_case,
    2: upper_case,
    3: title_case,
    4: swap_case,
}

# Коришћење речника за избор и позивање одговарајуће функције
result = options.get(option, lambda x: x)(word)

print(f"Ваша насумична реч је {word}, а резултат је {result}")

Ево примера излаза:

Добродошли! Насумично сте изабрали реч.

Изаберите опцију за манипулацију речју:
1. Мала слова
2. Велика слова
3. Насловна слова
4. Замена слова
5. Подразумевано понашање

Унесите вашу опцију: 4

Ваша насумична реч је Hello, а резултат је hELLO.

Коришћење `match-case`

📝 Напомена: Потребна вам је верзија Python-а 3.10 или новија да бисте користили изразе за подударање.

Почев од Python-а 3.10, можете користити `match` наредбу за имплементацију `switch-case` конструкције. `match` наредба са својом једноставном синтаксом пружа интуитивнији начин за руковање са више случајева. `_` (доња црта) служи као подразумевани случај.

Ево како можемо да прерадимо наш пример користећи `match-case` конструкцију:

  • Користимо `match` израз да бисмо упоредили кориснички унос са различитим случајевима.
  • Сваки случај наводи избор и код који се извршава ако се тај избор подудара.
  • `_` (доња црта) служи као подразумевани случај, и извршава код када се ниједан други случај не подудара.
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  # Подразумевано понашање, враћање стринга без промена

print(f"Ваша насумична реч је {word}, а резултат је {result}.")

Сада можете покренути скрипту и проверити излаз:

Добродошли! Насумично сте изабрали реч.

Изаберите опцију за манипулацију речју:
1. Мала слова
2. Велика слова
3. Насловна слова
4. Замена слова
5. Подразумевано понашање

Унесите вашу опцију: 2
Ваша насумична реч је world, а резултат је WORLD.

⚙ Иако `match` израз пружа згодан начин за имплементацију `switch-case` конструкције, он је намењен кориснијим подударању структурних узорака изван емулације `switch` понашања.

Закључак

Хајде да сумирамо различите приступе за постизање `switch` функционалности у Python-у:

  • `if-elif-else` конструкција је једноставна за имплементацију, али је тешка за одржавање. Зато је користите минимално – само када немате много опција за проверу.
  • Можете искористити Python речнике и функције за симулацију `switch-case` понашања. Користите различите изборе и одговарајуће функције као кључеве и вредности у речнику, респективно.
  • `match-case` израз, уведен у Python 3.10, помаже у имплементацији `switch-case` конструкције са једноставном и интуитивном синтаксом. Међутим, `match-case` израз је одличан избор за занимљивије случајеве структурног подударања.

Примере кода за овај водич можете пронаћи на GitHub. Ако се припремате за интервјуе за програмирање, погледајте ову компилацију најбољих питања за интервјуе из Python-а.