[Explained] Jak zaimplementować Switch-Case w Pythonie

Chcesz zaimplementować konstrukcję przełącznika w Pythonie? Poznaj różne podejścia, które możesz zastosować, aby emulować zachowanie przełączników.

Jeśli programowałeś w C lub JavaScript, użyłeś instrukcji switch-case. Ale dlaczego potrzebujemy konstrukcji obudowy przełącznika?

Załóżmy, że masz zestaw różnych akcji (lub bloków kodu). To, jaką akcję wykonasz (blok kodu do wykonania), zależy od wartości zmiennej lub wyrażenia.

Oto kilka przykładów:

  • Przydzielanie ocen uczniom na podstawie uzyskanych przez nich wyników
  • Wybór technik manipulacji ciągami w oparciu o wybór użytkownika
  • Wykonywanie operacji arytmetycznych na dwóch liczbach w zależności od danych wprowadzonych przez użytkownika

Zatem konstrukcja przełącznika zapewnia wygodny sposób implementacji takiej logiki. Kiedy musisz wykonać — w oparciu o wartość zmiennej lub wyrażenia — jedną z wielu możliwych akcji.

Chociaż Python nie ma wbudowanej konstrukcji przełączników, istnieje kilka podejść, których można użyć, aby osiągnąć podobną funkcjonalność. W tym artykule omówimy te podejścia.

Emulowanie zachowania przełącznika w Pythonie

Zobaczmy, jak możemy emulować zachowanie zmiany wielkości liter w Pythonie, biorąc przykład.

Napiszemy prosty program, który wykona następujące czynności:

  • Próbuj losowo słowo (ciąg Pythona) z listy słów.
  • Podaj kontekst i zapytaj użytkownika. Zdefiniuj operacje na ciągach — manipulację ciągami — do wykonania na wybranym słowie.
  • Uwzględnij operacje zmiany wielkości liter (małe, wielkie, tytułowe i inne), w tym zachowanie domyślne. W razie potrzeby użyj wbudowanych metod ciągów Pythona.
  • Monituj użytkownika o wprowadzenie danych. Ponieważ domyślnie danymi wejściowymi jest ciąg znaków, przekonwertuj je na int poprzez rzutowanie typu.

Ciągi Pythona są niezmienne. Zatem metody łańcuchowe nie modyfikują oryginalnego ciągu. Zamiast tego zwracają kopię ciągu znaków z wymaganymi zmianami. Przyjrzyjmy się metodom ciągów Pythona, których będziemy używać:

String MethodDescriptionlower() Zwraca kopię ciągu znaków, w którym wszystkie znaki są pisane małymi literami.upper() Zwraca kopię ciągu, w którym wszystkie znaki są pisane wielkimi literami.title() Zwraca kopię ciągu znaków sformatowanego w tytule.wapcase() Zwraca kopię ciąg znaków, w którym małe i wielkie litery są konwertowane odpowiednio na wielkie i małe litery

Poniższy fragment kodu losowo pobiera słowo z listy słów i pobiera dane wprowadzone przez użytkownika:

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: "))

Oto przykład pokazujący, jak ciąg „Python” jest modyfikowany w zależności od wyboru użytkownika:

Kiedy teraz uruchomisz program, powinieneś zostać poproszony o wprowadzenie danych w następujący sposób:

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: 

Następnie przejdźmy do wdrażania różnych podejść.

Korzystanie z drabinki If-Elif-Else

W tym podejściu używamy serii instrukcji if-elif-else, aby porównać wybór użytkownika z predefiniowanymi opcjami. Następnie wykonujemy odpowiedni blok kodu na podstawie danych wprowadzonych przez użytkownika.

# 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}")

Tutaj:

  • Porównujemy dane wejściowe użytkownika dotyczące każdej opcji za pomocą instrukcji if-elif.
  • Po znalezieniu dopasowania wykonujemy odpowiedni blok kodu.
  • Jeśli żaden z warunków if-elif nie pasuje, wykonujemy blok else w celu zachowania domyślnego.

Możesz teraz uruchomić skrypt, wprowadzić wybór i zweryfikować wynik:

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.

Drabina if-elif-else jest łatwa do wdrożenia. Ale utrzymanie tego może być wyzwaniem. W tym przykładzie mieliśmy pięć przypadków (w tym zachowanie domyślne). W praktyce jednak takich przypadków może być znacznie więcej. Takie długie drabiny if-elif-else to zapach kodu, którego powinieneś unikać.

Przejdźmy więc do implementacji, która jest łatwa w utrzymaniu.

Korzystanie z mapowania słownikowego i funkcji najwyższej klasy

Możesz wykorzystać słowniki i funkcje języka Python do emulacji zachowania zmiany wielkości liter.

📑 Funkcje Pythona to obywatele pierwszej klasy

W Pythonie funkcje są obywatelami pierwszej klasy. Możesz zrobić znacznie więcej niż tylko definiowanie i wywoływanie funkcji:

  • Po zdefiniowaniu funkcji możesz przypisać ją do innej zmiennej, używać funkcji jako elementów list, wartości w słowniku i nie tylko.
  • Można je także przekazywać: funkcje można przekazywać jako argumenty do innych funkcji, a funkcje mogą zwracać funkcje.

W tym podejściu użyjemy słownika, aby przypisać wybory użytkownika do odpowiednich funkcji lub działań. Jest to bardziej efektywny sposób obsługi wielu wyborów, ponieważ pozwala uniknąć długiego łańcucha instrukcji if-elif.

Najpierw zdefiniujmy następujące funkcje dla różnych operacji na łańcuchach:

# 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()

Następnie wykonajmy następujące czynności:

  • Utwórz słownik o nazwie wybory, w którym klucze to wybory użytkownika, a wartości to funkcje lub akcje do wykonania.
  • Użyj metody słownikowej get(), aby pobrać wybraną akcję na podstawie wyboru użytkownika. Jeżeli wyboru nie znajdziemy w słowniku, udostępniamy domyślną akcję określoną funkcją lambda.
  • Następnie wykonaj wybraną akcję na losowym słowie.
# 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}")

Oto przykładowe dane wyjściowe:

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.

Korzystanie z dopasowania

📝 Uwaga: aby móc używać instrukcji dopasowania, potrzebujesz Pythona 3.10 lub nowszego.

Począwszy od Pythona 3.10, możesz użyć instrukcji match, aby zaimplementować konstrukcję przypominającą wielkość przełącznika. Instrukcja match ze swoją prostą składnią zapewnia bardziej intuicyjny sposób obsługi wielu przypadków. _ (podkreślenie) służy jako domyślny przypadek.

Oto jak możemy ponownie zapisać nasz przykład, używając dopasowania:

  • Używamy instrukcji match, aby porównać dane wprowadzone przez użytkownika z różnymi przypadkami.
  • Każdy przypadek określa wybór i kod do wykonania, jeśli ten wybór pasuje.
  • _ (podkreślenie) służy jako przypadek domyślny i wykonuje kod, gdy żaden inny przypadek nie pasuje.
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}.")

Możesz teraz uruchomić skrypt i zweryfikować dane wyjściowe:

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.

⚙ Choć instrukcja match zapewnia wygodny sposób implementacji konstrukcji typu switch-case, jest bardziej pomocna dopasowanie wzorca strukturalnego zadania wykraczające poza emulację zachowania przełączników.

Podsumowanie

Podsumujmy różne podejścia do osiągnięcia funkcjonalności przełączania wielkości liter w Pythonie:

  • Drabina if-elif-else jest łatwa do wdrożenia, ale jej utrzymanie jest trudne. Dlatego używaj ich minimalnie — tylko wtedy, gdy nie masz zbyt wielu opcji do sprawdzenia.
  • Możesz wykorzystać słowniki i funkcje języka Python do emulacji zachowania zmiany wielkości liter. Uwzględnij różne opcje i odpowiadające im funkcje odpowiednio jako klucze i wartości słownika.
  • Instrukcja dopasowania wielkości liter wprowadzona w Pythonie 3.10 pomaga zaimplementować tę konstrukcję zmiany wielkości liter za pomocą prostej i intuicyjnej składni. Jednakże instrukcja dopasowania przypadku jest doskonałym wyborem w przypadku bardziej interesujących przypadków użycia dopasowywania wzorców strukturalnych.

Przykłady kodu do tego samouczka można znaleźć na stronie GitHub. Jeśli przygotowujesz się do rozmów kwalifikacyjnych na temat programowania, zapoznaj się z tą kompilacją najpopularniejszych pytań do rozmów kwalifikacyjnych w języku Python.