Máte v úmyslu použít konstrukci switch-case v Pythonu? Seznamte se s různými metodami, které můžete využít k simulaci chování přepínače.
Pokud máte zkušenosti s programováním v jazycích C nebo JavaScript, jste obeznámeni s příkazem switch-case. Ale jaký je vlastně důvod pro konstrukci switch-case?
Představte si situaci, kdy máte k dispozici několik různých akcí (nebo bloků kódu). Která akce se provede, tedy který blok kódu se spustí, závisí na hodnotě proměnné nebo výrazu.
Zde je několik příkladů:
- Přiřazování známek studentům na základě jejich bodového hodnocení.
- Volba různých metod pro práci s textovými řetězci podle výběru uživatele.
- Provádění aritmetických operací se dvěma čísly v závislosti na tom, jakou operaci zvolí uživatel.
Konstrukce přepínače je tedy užitečným nástrojem pro implementaci takové logiky. Používá se, když je potřeba na základě hodnoty proměnné nebo výrazu provést jednu z mnoha možných akcí.
Ačkoliv Python nemá vestavěnou konstrukci přepínače, existuje několik způsobů, jak docílit obdobné funkčnosti. V tomto článku si tyto přístupy podrobněji probereme.
Simulace chování Switch-Case v Pythonu
Podívejme se na konkrétním příkladu, jak můžeme napodobit chování switch-case v Pythonu.
Vytvoříme jednoduchý program, který bude fungovat následovně:
- Vybere náhodně slovo, konkrétně řetězec z Pythonu, ze seznamu slov.
- Zobrazí kontext a nabídne uživateli možnosti. Definujeme operace s textovými řetězci – manipulace s řetězci – které se mají s vybraným slovem provést.
- Implementujeme operace pro změnu velikosti písmen (malá písmena, velká písmena, titulková písmena a další) včetně výchozího nastavení. Využijeme vestavěné metody pro práci s řetězci v Pythonu.
- Požádáme uživatele o zadání volby. Protože vstup je standardně typu řetězec, převedeme ho na typ integer.
Textové řetězce v Pythonu jsou neměnné. Metody pro práci s řetězci tedy nemění původní řetězec, ale vracejí jeho kopii s požadovanými úpravami. Zde jsou metody, které budeme používat:
Metoda řetězce | Popis |
lower() | Vrací kopii řetězce, kde jsou všechna písmena převedena na malá písmena. |
upper() | Vrací kopii řetězce, kde jsou všechna písmena převedena na velká písmena. |
title() | Vrací kopii řetězce formátovanou jako nadpis (první písmeno každého slova velké). |
swapcase() | Vrací kopii řetězce, kde jsou malá písmena převedena na velká a velká písmena na malá. |
Následující úsek kódu náhodně vybere slovo ze seznamu a načte vstup od uživatele:
import random # Seznam slov pro výběr word_list = ["Python", "programming", "Hello", "world", "context", "Switch"] # Náhodný výběr slova ze seznamu word = random.choice(word_list) # Zobrazení kontextu a dostupných možností print("Vítejte! Bylo pro vás náhodně vybráno slovo.") print("Zvolte možnost pro úpravu slova:") print("1. Malá písmena") print("2. Velká písmena") print("3. Titulková písmena") print("4. Změna velikosti písmen") print("5. Výchozí chování") # Načtení volby od uživatele option = int(input("Zadejte vaši volbu: "))
Následuje příklad, jak je řetězec ‚Python‘ upraven v závislosti na volbě uživatele:
Když program spustíte, měl by vás vyzvat k zadání volby takto:
Vítejte! Bylo pro vás náhodně vybráno slovo. Zvolte možnost pro úpravu slova: 1. Malá písmena 2. Velká písmena 3. Titulková písmena 4. Změna velikosti písmen 5. Výchozí chování Zadejte vaši volbu:
Dále se podíváme na implementaci různých přístupů.
Použití If-Elif-Else struktury
V tomto přístupu používáme sérii příkazů if-elif-else, abychom porovnali volbu uživatele s předem definovanými možnostmi. Poté spustíme odpovídající blok kódu podle vstupu uživatele.
# 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"Vaše náhodně vybrané slovo je {word} a výsledek je {result}")
Zde:
- Porovnáváme vstup uživatele s každou možností pomocí příkazů if-elif.
- Když je nalezena shoda, spustíme odpovídající blok kódu.
- Pokud žádná z podmínek if-elif neplatí, provedeme blok else pro výchozí chování.
Nyní můžete skript spustit, zadat volbu a ověřit výstup:
Vítejte! Bylo pro vás náhodně vybráno slovo Zvolte možnost pro úpravu slova: 1. Malá písmena 2. Velká písmena 3. Titulková písmena 4. Změna velikosti písmen 5. Výchozí chování Zadejte vaši volbu: 2 Vaše náhodně vybrané slovo je Switch a výsledek je SWITCH.
Struktura if-elif-else je poměrně snadná k implementaci, ale může se stát těžko udržitelnou. V tomto příkladu jsme měli pět případů (včetně výchozího chování), v praxi jich ale může být mnohem více. Takové rozsáhlé struktury if-elif-else se považují za zápach kódu, kterému bychom se měli pokud možno vyhnout.
Podívejme se tedy na řešení, které je více udržitelné.
Použití slovníkového mapování a funkcí první třídy
Můžeme využít slovníky a funkce v Pythonu pro simulaci chování přepínače.
📑 Funkce v Pythonu jsou objekty první třídy
V Pythonu mají funkce status objektů první třídy. To znamená, že s nimi můžeme dělat mnohem více, než je jen definovat a volat:
- Jakmile funkci definujeme, můžeme ji přiřadit jiné proměnné, používat je jako prvky v seznamech, jako hodnoty ve slovnících a podobně.
- Můžeme je také předávat: funkce mohou být předávány jako argumenty jiným funkcím a funkce mohou vracet jiné funkce.
V tomto přístupu použijeme slovník k namapování uživatelských voleb na odpovídající funkce nebo akce. To je efektivnější způsob, jak zpracovat více možností, protože se vyhneme dlouhému řetězci příkazů if-elif.
Nejdříve si definujme funkce pro jednotlivé operace s textovými řetězci:
# Definice funkcí pro jednotlivé možnosti 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()
Dále provedeme následující:
- Vytvoříme slovník s názvem „options“, kde klíče jsou uživatelské volby a hodnoty jsou funkce nebo akce, které se mají provést.
- Použijeme metodu get() slovníku, abychom získali vybranou akci na základě volby uživatele. Pokud volba ve slovníku neexistuje, použijeme výchozí akci definovanou funkcí lambda.
- Poté provedeme vybranou akci s náhodně vybraným slovem.
# Uložení funkcí do slovníku options = { 1: lower_case, 2: upper_case, 3: title_case, 4: swap_case, } # Použití slovníku pro výběr a volání odpovídající funkce result = options.get(option, lambda x: x)(word) print(f"Vaše náhodně vybrané slovo je {word} a výsledek je {result}")
Zde je ukázkový výstup:
Vítejte! Bylo pro vás náhodně vybráno slovo. Zvolte možnost pro úpravu slova: 1. Malá písmena 2. Velká písmena 3. Titulková písmena 4. Změna velikosti písmen 5. Výchozí chování Zadejte vaši volbu: 4 Vaše náhodně vybrané slovo je Hello a výsledek je hELLO.
Použití Match-Case
📝 Poznámka: Pro použití výrazů odpovídajících vzoru potřebujete Python 3.10 nebo novější.
Od Pythonu 3.10 můžeme použít příkaz match pro implementaci konstrukce typu switch-case. Příkaz match s jednoduchou syntaxí nabízí intuitivnější způsob, jak zpracovat více případů. Symbol _ (podtržítko) slouží jako výchozí možnost.
Zde je, jak můžeme přepsat náš příklad s využitím match-case:
- Používáme příkaz match pro porovnání vstupu uživatele s různými případy.
- Každý případ definuje volbu a kód, který se má provést, pokud tato volba odpovídá vstupu.
- Symbol _ (podtržítko) slouží jako výchozí případ a spustí se, když žádný z ostatních případů neodpovídá.
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 # Výchozí chování, vrací řetězec beze změn print(f"Vaše náhodně vybrané slovo je {word} a výsledek je {result}.")
Nyní můžete skript spustit a ověřit výstup:
Vítejte! Bylo pro vás náhodně vybráno slovo. Zvolte možnost pro úpravu slova: 1. Malá písmena 2. Velká písmena 3. Titulková písmena 4. Změna velikosti písmen 5. Výchozí chování Zadejte vaši volbu: 2 Vaše náhodně vybrané slovo je world a výsledek je WORLD.
⚙ I když příkaz match nabízí snadný způsob implementace konstrukce switch-case, je určen spíše pro komplexnější úlohy spojené s porovnáváním vzorů než jen pro pouhou simulaci chování přepínače.
Závěrem
Shrňme si různé přístupy k dosažení funkčnosti přepínače v Pythonu:
- Struktura if-elif-else je snadná k implementaci, ale je těžké ji udržovat. Používejte ji tedy co nejméně – pouze pokud nemáte příliš mnoho možností k otestování.
- Můžete využít slovníky a funkce v Pythonu k simulaci chování přepínače. Uložte různé volby a odpovídající funkce jako klíče a hodnoty slovníku.
- Příkaz match-case, který byl představen v Pythonu 3.10, umožňuje implementovat konstrukci switch-case s jednoduchou a intuitivní syntaxí. Prohlášení match-case se ale hodí i pro složitější případy využití porovnávání vzorů.
Příklady kódu pro tento tutoriál naleznete na GitHubu. Pokud se připravujete na pohovory na programátora, doporučujeme se podívat na tento souhrn častých otázek na pohovorech týkajících se Pythonu.