PY_I_R_W13_M08 Instrukcja wyboru
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:
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