Czy chcesz wdrożyć konstrukcję przełącznika w Pythonie? Poznaj różnorodne strategie, które umożliwią Ci symulację działania przełączników.
Programując w C lub JavaScript, z pewnością korzystałeś z instrukcji switch-case. Ale dlaczego w ogóle potrzebujemy konstrukcji przełącznika?
Wyobraź sobie, że masz zestaw różnorodnych działań (lub bloków kodu). To, które działanie zostanie wykonane (jaki blok kodu zostanie uruchomiony), zależy od wartości zmiennej lub wyniku pewnego wyrażenia.
Oto kilka przykładów:
- Przypisywanie ocen uczniom w oparciu o uzyskane przez nich wyniki.
- Wybieranie metod manipulacji łańcuchami znaków na podstawie decyzji użytkownika.
- Realizowanie operacji arytmetycznych na dwóch liczbach w zależności od danych wejściowych użytkownika.
Konstrukcja przełącznika oferuje więc dogodny sposób na wdrożenie tego rodzaju logiki. Przydaje się, gdy na podstawie wartości zmiennej lub wyrażenia trzeba wybrać jedną z wielu możliwych akcji.
Chociaż Python nie zawiera wbudowanej konstrukcji przełącznika, istnieje kilka metod, za pomocą których można osiągnąć podobną funkcjonalność. W tym artykule przyjrzymy się tym właśnie podejściom.
Symulacja działania przełącznika w Pythonie
Zobaczmy, jak możemy symulować zachowanie przełącznika w Pythonie, na konkretnym przykładzie.
Stworzymy prosty program, który będzie realizował następujące zadania:
- Losowe wybieranie słowa (łańcucha znaków) z przygotowanej listy.
- Prezentowanie użytkownikowi kontekstu i dostępnych opcji manipulacji tekstem.
- Udostępnianie opcji zmiany wielkości liter (małe, duże, tytułowe i inne), w tym zachowania domyślnego. W implementacji wykorzystamy wbudowane metody łańcuchów znaków Pythona.
- Zachęcanie użytkownika do wprowadzenia wyboru. Ponieważ domyślnie dane wejściowe to tekst, przekonwertujemy go na liczbę całkowitą za pomocą rzutowania typów.
Łańcuchy znaków w Pythonie są niemodyfikowalne. Dlatego metody manipulujące łańcuchami nie zmieniają pierwotnego łańcucha. Zamiast tego generują one kopię łańcucha z wprowadzonymi zmianami. Przyjrzyjmy się metodom, których będziemy używać:
String MethodDescriptionlower() Tworzy kopię łańcucha znaków, w której wszystkie litery są zamienione na małe.upper() Tworzy kopię łańcucha znaków, w której wszystkie litery są zamienione na duże.title() Tworzy kopię łańcucha znaków sformatowaną jako tytuł.swapcase() Tworzy kopię łańcucha znaków, w której małe litery stają się dużymi, a duże małymi.
Poniższy fragment kodu losowo wybiera słowo z listy i pobiera dane wejściowe od użytkownika:
import random # Lista słów do wyboru word_list = ["Python", "programowanie", "Witaj", "świecie", "kontekst", "Przełącznik"] # Losowy wybór słowa z listy word = random.choice(word_list) # Prezentacja kontekstu i dostępnych opcji użytkownikowi print("Witaj! Wylosowano dla Ciebie słowo.") print("Wybierz opcję manipulacji słowem:") print("1. Małe litery") print("2. Duże litery") print("3. Tytuł") print("4. Zamiana wielkości liter") print("5. Zachowanie domyślne") # Pobranie opcji od użytkownika option = int(input("Wprowadź swój wybór: "))
Oto przykład pokazujący, jak łańcuch „Python” jest modyfikowany w zależności od wyboru użytkownika:
Po uruchomieniu programu, zostaniesz poproszony o wprowadzenie danych w następujący sposób:
Witaj! Wylosowano dla Ciebie słowo. Wybierz opcję manipulacji słowem: 1. Małe litery 2. Duże litery 3. Tytuł 4. Zamiana wielkości liter 5. Zachowanie domyślne Wprowadź swój wybór:
Przejdźmy teraz do implementacji różnych podejść.
Wykorzystanie konstrukcji If-Elif-Else
W tej metodzie użyjemy sekwencji instrukcji if-elif-else, aby porównać wybór użytkownika z wcześniej zdefiniowanymi opcjami. Następnie, na podstawie danych wejściowych użytkownika, wykonujemy odpowiedni blok kodu.
# 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"Twoje losowe słowo to {word}, a wynik to {result}")
W tym przypadku:
- Porównujemy dane wprowadzone przez użytkownika z każdą opcją za pomocą instrukcji if-elif.
- Po znalezieniu dopasowania wykonujemy odpowiedni blok kodu.
- Jeżeli żaden z warunków if-elif nie zostanie spełniony, wykonujemy blok else, czyli działanie domyślne.
Możesz teraz uruchomić skrypt, wprowadzić wybór i sprawdzić wynik:
Witaj! Wylosowano dla Ciebie słowo Wybierz opcję manipulacji słowem: 1. Małe litery 2. Duże litery 3. Tytuł 4. Zamiana wielkości liter 5. Zachowanie domyślne Wprowadź swój wybór: 2 Twoje losowe słowo to Przełącznik, a wynik to PRZEŁĄCZNIK.
Konstrukcja if-elif-else jest prosta do wdrożenia, ale utrzymanie jej 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. Długie sekwencje if-elif-else to przykład niepożądanego kodu, którego należy unikać.
Przejdźmy więc do implementacji, która jest łatwiejsza w utrzymaniu.
Wykorzystanie mapowania słownikowego i funkcji pierwszej klasy
Do symulacji działania przełącznika można użyć słowników i funkcji Pythona.
📑 Funkcje w Pythonie są obiektami pierwszej klasy.
W Pythonie funkcje są traktowane jako obiekty pierwszej klasy. Możesz zrobić z nimi znacznie więcej, niż tylko definiować i wywoływać:
- Po zdefiniowaniu funkcji możesz przypisać ją do innej zmiennej, używać jako elementów list, wartości w słownikach i nie tylko.
- Można je także przekazywać: funkcje mogą być przekazywane jako argumenty do innych funkcji, a także funkcje mogą zwracać funkcje.
W tym podejściu wykorzystamy słownik, aby przypisać wybory użytkownika do odpowiednich funkcji lub akcji. Jest to bardziej efektywny sposób obsługi wielu wyborów, ponieważ pozwala uniknąć długiego łańcucha instrukcji if-elif.
Najpierw zdefiniujmy funkcje dla różnych operacji na łańcuchach:
# Definiowanie funkcji dla każdej opcji 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 wykonamy następujące czynności:
- Stworzymy słownik o nazwie „options”, gdzie kluczami będą wybory użytkownika, a wartościami – funkcje lub akcje do wykonania.
- Wykorzystamy metodę „get()” słownika, aby pobrać wybraną akcję na podstawie decyzji użytkownika. Jeśli wyboru nie ma w słowniku, zapewnimy działanie domyślne zdefiniowane przy pomocy funkcji lambda.
- Na końcu wykonamy wybraną akcję na losowo wybranym słowie.
# Przechowywanie funkcji w słowniku options = { 1: lower_case, 2: upper_case, 3: title_case, 4: swap_case, } # Użycie słownika do wyboru i wywołania odpowiedniej funkcji result = options.get(option, lambda x: x)(word) print(f"Twoje losowe słowo to {word}, a wynik to {result}")
Oto przykładowe wyniki:
Witaj! Wylosowano dla Ciebie słowo. Wybierz opcję manipulacji słowem: 1. Małe litery 2. Duże litery 3. Tytuł 4. Zamiana wielkości liter 5. Zachowanie domyślne Wprowadź swój wybór: 4 Twoje losowe słowo to Witaj, a wynik to wITAJ.
Wykorzystanie instrukcji match
📝 Uwaga: Aby móc korzystać z instrukcji „match”, potrzebujesz Pythona w wersji 3.10 lub nowszej.
Począwszy od Pythona 3.10, można użyć instrukcji „match” w celu wdrożenia konstrukcji przypominającej przełącznik. Instrukcja „match” dzięki swojej prostej składni zapewnia bardziej intuicyjny sposób obsługi wielu przypadków. Podkreślnik „_” służy jako domyślny przypadek.
Oto jak możemy ponownie zapisać nasz przykład, wykorzystując instrukcję „match”:
- 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żeli wybór pasuje.
- Podkreślnik „_” pełni rolę przypadku domyślnego 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 # Domyślne zachowanie - zwracanie słowa bez zmian print(f"Twoje losowe słowo to {word}, a wynik to {result}.")
Możesz teraz uruchomić skrypt i sprawdzić wynik:
Witaj! Wylosowano dla Ciebie słowo. Wybierz opcję manipulacji słowem: 1. Małe litery 2. Duże litery 3. Tytuł 4. Zamiana wielkości liter 5. Zachowanie domyślne Wprowadź swój wybór: 2 Twoje losowe słowo to świecie, a wynik to ŚWIECIE.
⚙ Chociaż instrukcja „match” oferuje wygodny sposób wdrożenia konstrukcji przełącznika, jest ona bardziej przydatna w przypadku dopasowywania wzorców strukturalnych, czyli zadań wykraczających poza symulowanie zachowania przełączników.
Podsumowanie
Podsumujmy różne podejścia do osiągnięcia funkcjonalności przełącznika w Pythonie:
- Konstrukcja if-elif-else jest prosta do wdrożenia, ale jej utrzymanie bywa problematyczne. Dlatego korzystaj z niej w minimalnym zakresie – tylko wtedy, gdy nie masz zbyt wielu opcji do sprawdzenia.
- Możesz wykorzystać słowniki i funkcje Pythona, aby symulować działanie przełącznika. Zastosuj różne opcje i odpowiadające im funkcje jako klucze i wartości słownika.
- Instrukcja „match”, wprowadzona w Pythonie 3.10, pomaga wdrożyć tę konstrukcję za pomocą prostej i intuicyjnej składni. Jednak instrukcja „match” jest doskonałym wyborem w bardziej zaawansowanych zastosowaniach związanych z dopasowywaniem wzorców strukturalnych.
Przykłady kodu do tego poradnika można znaleźć na GitHub. Jeśli przygotowujesz się do rozmów kwalifikacyjnych na temat programowania, sprawdź ten zbiór najpopularniejszych pytań na temat Pythona.
newsblog.pl