RwO12huyFYRpz
Zdjęcie przedstawia dwa włączniki światła zamieszczone na ścianie.

PY_I_R_W13_M08 Instrukcja wyboru

Źródło: Karim Manjra, domena publiczna.

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: ( 10 ,   15 ] ,   ( 15 ,   21 ] ,   ( 21 ,   50 ] 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 PythonPb35akOxSInstrukcja warunkowa w języku Python.

Przykład 1

Napiszmy program, który zrealizuje taki scenariusz.

Linia 1. wartosc znak równości 23. Linia 3. if 10 otwórz nawias ostrokątny wartosc and wartosc otwórz nawias ostrokątny znak równości 15 dwukropek. Linia 4. print otwórz nawias okrągły cudzysłów Przedział 1 cudzysłów zamknij nawias okrągły. Linia 5. elif wartosc zamknij nawias ostrokątny 15 and wartosc otwórz nawias ostrokątny znak równości 21 dwukropek. Linia 6. print otwórz nawias okrągły cudzysłów Przedział 2 cudzysłów zamknij nawias okrągły. Linia 7. elif wartosc zamknij nawias ostrokątny 21 and wartosc otwórz nawias ostrokątny znak równości 50 dwukropek. Linia 8. print otwórz nawias okrągły cudzysłów Przedział 3 cudzysłów zamknij nawias okrągły. Linia 9. else dwukropek. Linia 10. print otwórz nawias okrągły cudzysłów Liczba nie zawiera się w żadnym z przedziałów cudzysłów zamknij nawias okrągły.
Ważne!

Powyższy program możemy zapisać, korzystając z kilku instrukcji warunkowych.

Linia 1. wartosc znak równości 23. Linia 3. if wartosc zamknij nawias ostrokątny 10 and wartosc otwórz nawias ostrokątny znak równości 15 dwukropek. Linia 4. print otwórz nawias okrągły cudzysłów Przedział 1 cudzysłów zamknij nawias okrągły. Linia 5. if wartosc zamknij nawias ostrokątny 15 and wartosc otwórz nawias ostrokątny znak równości 21 dwukropek. Linia 6. print otwórz nawias okrągły cudzysłów Przedział 2 cudzysłów zamknij nawias okrągły. Linia 7. if wartosc zamknij nawias ostrokątny 21 and wartosc otwórz nawias ostrokątny znak równości 50 dwukropek. Linia 8. print otwórz nawias okrągły cudzysłów Przedział 3 cudzysłów zamknij nawias okrągły. Linia 9. if wartosc otwórz nawias ostrokątny znak równości 10 or wartosc zamknij nawias ostrokątny 50 dwukropek. Linia 10. print otwórz nawias okrągły cudzysłów Liczba nie zawiera się w żadnym z przedziałów cudzysłów zamknij nawias okrągły.

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.

Przykład 2

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:

Linia 1. def funkcja podkreślnik 1 otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 2. print otwórz nawias okrągły cudzysłów Funkcja 1 kropka cudzysłów zamknij nawias okrągły. Linia 4. def funkcja podkreślnik 2 otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 5. print otwórz nawias okrągły cudzysłów Funkcja 2 kropka cudzysłów zamknij nawias okrągły. Linia 7. def funkcja podkreślnik 3 otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 8. print otwórz nawias okrągły cudzysłów Funkcja 3 kropka cudzysłów zamknij nawias okrągły. Linia 10. def funkcja podkreślnik x otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 11. print otwórz nawias okrągły cudzysłów Funkcja x kropka cudzysłów zamknij nawias okrągły. Linia 14. wybor znak równości input otwórz nawias okrągły cudzysłów Podaj numer dwukropek cudzysłów zamknij nawias okrągły. Linia 15. wynik znak równości int otwórz nawias okrągły wybor zamknij nawias okrągły. Linia 17. if wynik znak równości znak równości 1 dwukropek. Linia 18. funkcja podkreślnik 1 otwórz nawias okrągły zamknij nawias okrągły. Linia 19. elif wynik znak równości znak równości 2 dwukropek. Linia 20. funkcja podkreślnik 2 otwórz nawias okrągły zamknij nawias okrągły. Linia 21. elif wynik znak równości znak równości 3 dwukropek. Linia 22. funkcja podkreślnik 3 otwórz nawias okrągły zamknij nawias okrągły. Linia 23. else dwukropek. Linia 24. funkcja podkreślnik x otwórz nawias okrągły zamknij nawias okrągły. Linia 26. kratka Efekt wykonania dwukropek. Linia 28. kratka Podaj numer dwukropek 2. Linia 29. kratka Funkcja 2 kropka.

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.

Linia 1. def funkcja podkreślnik 1 otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 2. print otwórz nawias okrągły cudzysłów Funkcja 1 kropka cudzysłów zamknij nawias okrągły. Linia 4. def funkcja podkreślnik 2 otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 5. print otwórz nawias okrągły cudzysłów Funkcja 2 kropka cudzysłów zamknij nawias okrągły. Linia 7. def funkcja podkreślnik 3 otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 8. print otwórz nawias okrągły cudzysłów Funkcja 3 kropka cudzysłów zamknij nawias okrągły. Linia 10. def funkcja podkreślnik x otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 11. print otwórz nawias okrągły cudzysłów Funkcja x kropka cudzysłów zamknij nawias okrągły. Linia 14. wybor znak równości input otwórz nawias okrągły cudzysłów Podaj numer dwukropek cudzysłów zamknij nawias okrągły. Linia 15. wynik znak równości int otwórz nawias okrągły wybor zamknij nawias okrągły. Linia 17. kratka tworzymy słownik zawierający jako wartości nazwy funkcji. Linia 18. slownik znak równości otwórz nawias klamrowy 1 dwukropek funkcja podkreślnik 1 przecinek 2 dwukropek funkcja podkreślnik 2 przecinek 3 dwukropek funkcja podkreślnik 3 zamknij nawias klamrowy. Linia 20. kratka jeśli wybór jest kluczem słownika przecinek wykonujemy funkcję. Linia 21. if wynik in slownik dwukropek. Linia 22. slownik otwórz nawias kwadratowy wynik zamknij nawias kwadratowy otwórz nawias okrągły zamknij nawias okrągły. Linia 23. kratka w innym przypadku wykonujemy konkretną funkcję. Linia 24. else dwukropek. Linia 25. funkcja podkreślnik x otwórz nawias okrągły zamknij nawias okrągły.

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:

Linia 1. wartość podkreślnik gdy podkreślnik prawda if warunek podkreślnik logiczny else wartość podkreślnik gdy podkreślnik fałsz.

Instrukcja taka odpowiada poleceniom:

Linia 1. if warunek podkreślnik logiczny dwukropek. Linia 2. wartość podkreślnik gdy podkreślnik prawda. Linia 3. else dwukropek. Linia 4. wartość podkreślnik gdy podkreślnik fałsz.

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:

Linia 1. def czy podkreślnik palindrom otwórz nawias okrągły tekst zamknij nawias okrągły dwukropek. Linia 2. if tekst znak równości znak równości tekst otwórz nawias kwadratowy dwukropek dwukropek minus 1 zamknij nawias kwadratowy dwukropek. Linia 3. return True. Linia 4. else dwukropek. Linia 5. return False.

Druga funkcja wykorzystuje wyrażenie trójargumentowe:

Linia 1. def czy podkreślnik palindrom otwórz nawias okrągły tekst zamknij nawias okrągły dwukropek. Linia 2. return True if tekst znak równości znak równości tekst otwórz nawias kwadratowy dwukropek dwukropek minus 1 zamknij nawias kwadratowy else False.

Obie powyższe funkcje mogą być zapisane również następująco:

Linia 1. def czy podkreślnik palindrom otwórz nawias okrągły tekst zamknij nawias okrągły dwukropek. Linia 2. return tekst znak równości znak równości tekst otwórz nawias kwadratowy dwukropek dwukropek minus 1 zamknij nawias kwadratowy.

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

Linia 1. wartosc znak równości 15. Linia 2. print otwórz nawias okrągły apostrof Dużo apostrof if wartosc zamknij nawias ostrokątny 20 else apostrof Mało apostrof przecinek apostrof pieniędzy kropka apostrof zamknij nawias okrągły. Linia 3. kratka Mało pieniędzy kropka. Linia 5. wartosc znak równości 23. Linia 6. print otwórz nawias okrągły apostrof Dużo apostrof if wartosc zamknij nawias ostrokątny 20 else apostrof Mało apostrof przecinek apostrof pieniędzy kropka apostrof zamknij nawias okrągły. Linia 7. kratka Dużo pieniędzy kropka.

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:

Linia 1. match numer podkreślnik ucznia dwukropek. Linia 2. case 1 dwukropek. Linia 3. kratka wypisz informacje o uczniu numer 1 kropka. Linia 4. case 2 dwukropek. Linia 5. kratka wypisz informacje o uczniu numer 2 kropka. Linia 6. case 3 dwukropek. Linia 7. kratka wypisz informacje o uczniu numer 3 kropka. Linia 8. case 4 dwukropek. Linia 9. kratka wypisz informacje o uczniu numer 4 kropka.
Linia 1. numerUucznia znak równości 3. Linia 3. match numer podkreślnik ucznia dwukropek. Linia 4. case 1 dwukropek. Linia 5. kratka wypisz informacje o uczniu numer 1 kropka. Linia 6. case 2 dwukropek. Linia 7. kratka wypisz informacje o uczniu numer 2 kropka. Linia 8. case 3 dwukropek. Linia 9. kratka wypisz informacje o uczniu numer 3 kropka. Linia 10. case 4 dwukropek. Linia 11. kratka wypisz informacje o uczniu numer 4 kropka.

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.

Linia 1. miesiac znak równości 2. Linia 3. match miesiac dwukropek. Linia 4. case 1 dwukropek. Linia 5. print otwórz nawias okrągły cudzysłów To nie wakacje dwukropek minus otwórz nawias okrągły cudzysłów zamknij nawias okrągły. Linia 6. case 2 dwukropek. Linia 7. print otwórz nawias okrągły cudzysłów To nie wakacje dwukropek minus otwórz nawias okrągły cudzysłów zamknij nawias okrągły. Linia 8. case 3 dwukropek. Linia 9. print otwórz nawias okrągły cudzysłów To nie wakacje dwukropek minus otwórz nawias okrągły cudzysłów zamknij nawias okrągły. Linia 10. case 4 dwukropek. Linia 11. print otwórz nawias okrągły cudzysłów To nie wakacje dwukropek minus otwórz nawias okrągły cudzysłów zamknij nawias okrągły. Linia 12. case 5 dwukropek. Linia 13. print otwórz nawias okrągły cudzysłów To nie wakacje dwukropek minus otwórz nawias okrągły cudzysłów zamknij nawias okrągły. Linia 14. case 6 dwukropek. Linia 15. print otwórz nawias okrągły cudzysłów To nie wakacje dwukropek minus otwórz nawias okrągły cudzysłów zamknij nawias okrągły. Linia 16. case 7 dwukropek. Linia 17. print otwórz nawias okrągły cudzysłów Wakacje wykrzyknik cudzysłów zamknij nawias okrągły. Linia 18. case 8 dwukropek. Linia 19. print otwórz nawias okrągły cudzysłów Wakacje wykrzyknik cudzysłów zamknij nawias okrągły. Linia 20. case 9 dwukropek. Linia 21. print otwórz nawias okrągły cudzysłów To nie wakacje dwukropek minus otwórz nawias okrągły cudzysłów zamknij nawias okrągły. Linia 22. case 10 dwukropek. Linia 23. print otwórz nawias okrągły cudzysłów To nie wakacje dwukropek minus otwórz nawias okrągły cudzysłów zamknij nawias okrągły. Linia 24. case 11 dwukropek. Linia 25. print otwórz nawias okrągły cudzysłów To nie wakacje dwukropek minus otwórz nawias okrągły cudzysłów zamknij nawias okrągły. Linia 26. case 12 dwukropek. Linia 27. print otwórz nawias okrągły cudzysłów To nie wakacje dwukropek minus otwórz nawias okrągły cudzysłów zamknij nawias okrągły.

Łączenie warunków

Używając operatora |, oznaczającego alternatywę, możemy łączyć warunki.

Linia 1. miesiac znak równości 2. Linia 3. match miesiac dwukropek. Linia 4. case 1 kreska pionowa 2 kreska pionowa 3 kreska pionowa 4 kreska pionowa 5 kreska pionowa 6 kreska pionowa 9 kreska pionowa 10 kreska pionowa 11 kreska pionowa 12 dwukropek. Linia 5. print otwórz nawias okrągły cudzysłów To nie wakacje dwukropek minus otwórz nawias okrągły cudzysłów zamknij nawias okrągły. Linia 6. case 7 kreska pionowa 8 dwukropek. Linia 7. print otwórz nawias okrągły cudzysłów Wakacje wykrzyknik cudzysłów zamknij nawias okrągły.

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:

Linia 1. miesiac znak równości 27. Linia 3. match miesiac dwukropek. Linia 4. case 1 kreska pionowa 2 kreska pionowa 3 kreska pionowa 4 kreska pionowa 5 kreska pionowa 6 kreska pionowa 9 kreska pionowa 10 kreska pionowa 11 kreska pionowa 12 dwukropek. Linia 5. print otwórz nawias okrągły cudzysłów To nie wakacje dwukropek minus otwórz nawias okrągły cudzysłów zamknij nawias okrągły. Linia 6. case 7 kreska pionowa 8 dwukropek. Linia 7. print otwórz nawias okrągły cudzysłów Wakacje wykrzyknik cudzysłów zamknij nawias okrągły. Linia 8. case podkreślnik dwukropek. Linia 9. print otwórz nawias okrągły cudzysłów Wybrano liczbę spoza przedziału otwórz nawias kwadratowy 1 przecinek 12 zamknij nawias kwadratowy cudzysłów zamknij nawias okrągły.

Słownik

obiekt niezmienny
obiekt niezmienny

(ang. immutable) obiekt, który po stworzeniu nie może być modyfikowany.

palindrom
palindrom

ciąg znaków, który brzmi tak samo czytany w obu kierunkach (od strony lewej do prawej i wspak)

wyrażenie indeksujące
wyrażenie indeksujące

(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