Wielokrotny wybór w języku Python
Wielokrotny wybór w języku Python
Podczas tworzenia programu zdarzają się sytuacje, w których potrzebujemy zrealizować jeden z wielu scenariuszy działań.
Przeanalizujmy przykład, gdzie mamy wypisać informację, w którym z następujących przedziałów: zawiera się dana liczba.
Do zrealizowania takiego scenariusza możemy zastosować konstrukcję if/elif/else, ponieważ wybieramy jeden z wielu przedziałów.
Ogólną postać instrukcji znajdziesz w e‑materiale Instrukcja warunkowa w języku PythonInstrukcja warunkowa w języku Python.
Napiszmy program, który zrealizuje taki scenariusz.
Powyższy program możemy zapisać, korzystając z kilku instrukcji warunkowych.
Przy kilku instrukcjach if warunek każdej z nich sprawdzany jest niezależnie od innych, natomiast przy konstrukcji if/elif/else, jeśli jakiś warunek zostanie spełniony, to dalsze warunki nie są sprawdzane.
Spróbujmy teraz przeanalizować inną sytuację. Chcemy, w zależności od podanej przez użytkownika liczby (wybranej opcji), wykonać pewną akcję. Zdefiniujemy cztery funkcje, a do wyboru odpowiedniej opcji wykorzystamy instrukcję if/elif/else:
Użycie słownika jako alternatywy dla konstrukcji wielokrotnego wyboru if/elif/else
Możemy skorzystać z pewnej właściwości języka Python. Zgodnie z nią każda funkcja może być potraktowana jako obiekt i przypisana do dowolnego elementu innego obiektu. Zatem poprawny będzie następujący przykład.
Zdefiniujmy cztery funkcje i wykonajmy je w zależności od wyboru użytkownika.
Trójargumentowe wyrażenie wyboru
Używane jest w sytuacjach, gdy wystarczy zwrócić prostą informację zależną od jednego warunku. W takim przypadku rozbudowywanie kodu jest niecelowe.
Oto wyrażenie trójargumentowe zapisane w języku Python:
Instrukcja taka odpowiada poleceniom:
Porównajmy kody dwóch funkcji. Mają one sprawdzić, czy tekst przekazany im jako argument jest palindromem. Sprawdzenie, czy słowo jest palindromem, wykonane jest przy użyciu wyrażenia indeksującego.
Pierwsza funkcja wykorzystuje zwykłą konstrukcję if/else:
Druga funkcja wykorzystuje wyrażenie trójargumentowe:
Obie powyższe funkcje mogą być zapisane również następująco:
Innym przykładem zastosowania wyrażenia trójargumentowego jest podanie jednego z dwóch komunikatów, zależnych od spełnienia pewnego warunku. Posłużymy się funkcją print():
Instrukcja match/case
W wersji 3.10 języka Python została wprowadzona instrukcja match/case. Instrukcja ta jako argument przyjmuje wyrażenie i porównuje jego wartość ze zdefiniowanymi schematami. Jeśli wyrażenie jest zgodne ze zdefiniowanym schematem, wykonywane są związane z nim instrukcje.
Instrukcja match/case zapisana za pomocą języka Python wygląda następująco:
Instrukcja match/case pobiera obiekt (numer_ucznia), testuje go względem jednego lub więcej wzorców dopasowania (case 1, case 2 etc.) i wykonuje akcję, jeśli znajdzie dopasowanie.
Po każdym słowie kluczowym case następuje wzorzec dopasowania.
Python wykonuje dopasowania, przechodząc przez listę przypadków od góry do dołu. Przy pierwszym dopasowaniu Python wykonuje instrukcje w odpowiadającym im bloku przypadków, a następnie przeskakuje na koniec bloku dopasowania i kontynuuje dalszą część programu. Oznacza to, że po znalezieniu pierwszego pasującego przypadku, kończy się działanie instrukcji match/case.
Załóżmy, że chcemy napisać program, który wyświetli komunikat Wakacje!, jeśli użytkownik poda numer wakacyjnego miesiąca (zakładamy, że wakacyjne miesiące to lipiec i sierpień) lub To nie wakacje :-(, jeśli poda numer jakiegokolwiek innego miesiąca.
Łączenie warunków
Używając operatora |, oznaczającego alternatywę, możemy łączyć warunki.
Domyślny przypadek
W instrukcji match/case możemy podać przypadek _, który oznacza „w każdym innym przypadku”, czyli jeżeli wartość zmiennej podanej do sprawdzenia nie będzie równa żadnemu z ustawionych przypadków, program wykona fragment kodu zawarty w poleceniu.
Przeanalizuj przykład:
Zaawansowane wykorzystanie
Instrukcja match/case pozwala na zdefiniowanie zmiennych lokalnych, które będą dopasowywane do argumentu. Do tych zmiennych lokalnych możemy się odwołać w zasięgu pojedynczej klauzuli case. Co więcej, możemy doprecyzować, kiedy ma się do tych zmiennych wpasować, stosując polecenie if.
Przeanalizujmy następujący program:
Funkcja wypisz_informacje przyjmuje trzy parametry: punkt, dziedzina_x, dziedzina_y. Dwa ostatnie mają podane wartości domyślne. Jeśli przy wywoływaniu funkcji do argumentów nie zostaną przekazane nowe wartości, funkcja zostanie wywołana z wartościami domyślnymi.
Widać to przy wywołaniach funkcji – funkcja wypisz_informacje wywoływana jest z jednym argumentem (dwa pozostałe mają przypisane wartości domyślne).
Wartości przekazane do funkcji są krotkami.
W programie definiujemy pewną dziedzinę, która ograniczona jest podanymi wartościami. Zwizualizujmy ją.

Moglibyśmy zdefiniować dwa główne przypadki:
Punkt należy do rozważanej dziedziny.
Punkt nie należy do rozważanej dziedziny.
Jeśli punkt miałby należeć do dziedziny, wartość współrzędnej musiałaby mieścić się w następującym przedziale , a wartość współrzędnej musiałaby zawierać się w następującym przedziale :
Gdyby punkt nie znajdował się w tym przedziale, nie należałby do dziedziny:
Jednak to niejedyny przypadek, jaki możemy zdefiniować. Pozostałe:
Punkt leży na osi rzędnych.
Punkt leży na osi odciętych.
Punkt leży w środku układu współrzędnych.
Jeśli punkt miałby leżeć na osi rzędnych, jego pierwsza współrzędna musiałaby wynosić 0.
Jeśli punkt miałby leżeć na osi odciętych, jego druga współrzędna musiałaby wynosić 0.
Jeśli punkt miałby leżeć w środku układu współrzędnych, obie jego współrzędne musiałyby wynosić 0.
Wiemy, że w przypadku instrukcji match/case program kończy działanie instrukcji, kiedy zostanie spełniony pierwszy warunek. Musimy zatem odpowiednio zaplanować ułożenie warunków.
Zacznijmy od sprawdzenia, czy punkt należy do dziedziny. Zatem to ten warunek zostanie zapisany jako pierwszy.
Następnie sprawdźmy, czy punkt leży w środku układu współrzędnych, na rzędnej lub odciętej. Zapiszmy kolejne warunki.
Warto pamiętać, że trzy wspomniane wcześniej przypadki odnoszą się do sytuacji, w której punkt nie należy do dziedziny, ale za to leży na osi współrzędnych. To rozróżnienie również powinno znaleźć się w komunikatach wyświetlanych przez program.
Sprawdziliśmy kilka konkretnych przypadków. Weźmy jednak pod uwagę również taką sytuację, w której punkt nie należy do dziedziny, nie leży w środku układu współrzędnych ani na żadnej osi.
Przetestujmy działanie programu dla następujących punktów:
Nanieśmy je na wizualizację:

Wywołajmy funkcję z nimi jako argumentami:
Wynik programu:
Porównaj wynik programu z wizualizacją.
Słownik
(ang. immutable) obiekt, który po stworzeniu nie może być modyfikowany.
ciąg znaków, który brzmi tak samo czytany w obu kierunkach (od strony lewej do prawej i wspak)
(ang. slice) zawarte w nawiasach kwadratowych wyrażenie, które pozwala określić wybraną część sekwencji; może ono mieć postać [start:koniec:krok]; wyrażenie indeksujące zwraca wycinek, zaczynający się od argumentu start, następnie zwiększając indeks o krok, aż do przekroczenia lub wyrównania wartości koniec; nieprzekazanie argumentu start skutkuje tym, że zaczynamy wycinek od początku sekwencji; podobnie, gdy nie przekażemy argumentu koniec, to górnym ograniczeniem wycinka będzie ostatnia wartość; wartość domyślna dla parametru krok to jeden; lista w języku Python może być indeksowana od tyłu; ostatnia wartość listy jest dostępna pod indeksem -1, przedostatnia pod -2 itd.; argument krok również może przyjąć wartość ujemną, wtedy wartość domyślna parametru start jest równa -1, np. dla [::-1] otrzymamy listę w odwrotnej kolejności