Stosowanie instrukcji warunkowej w języku Python
W tym e‑materiale poznasz i wykorzystasz instrukcje warunkowe do sterowania działaniem programu.
Interaktywna treść merytorycznaInteraktywna treść merytoryczna
MultimediumMultimedium
Zestaw ćwiczeń interaktywnychZestaw ćwiczeń interaktywnych
SłownikSłownik
BibliografiaBibliografia
Wprowadzenie do programowania w języku PythonWprowadzenie do programowania w języku Python
Pisanie poleceń w języku Python w trybie interaktywnymPisanie poleceń w języku Python w trybie interaktywnym
Stosowanie funkcji w języku Python do realizacji algorytmu Euklidesa z odejmowaniemStosowanie funkcji w języku Python do realizacji algorytmu Euklidesa z odejmowaniem
Omówisz budowę instrukcji warunkowej w języku Python.
Napiszesz i uruchomisz program, w którym zastosowana została instrukcja warunkowa.
Zastosujesz różne wersje instrukcji warunkowych, wykonując ćwiczenia.
Instrukcja warunkowa
Instrukcję warunkową if można przedstawić za pomocą schematu blokowego następująco:
Blok początkowy START reprezentuje początek procesu, jest to punkt wyjścia lub stan początkowy przed wykonaniem jakichkolwiek instrukcji warunkowych.
Blok operacyjny reprezentuje dowolne instrukcje, kod wykonywany w danym kroku programu.
Blok decyzyjny zawiera warunek do oceny. Jest zazwyczaj przedstawiany jako romb z jednym wejściem (na górze) i dwoma wyjściami (dla sytuacji, gdy warunek jest spełniony, oraz sytuacji, gdy nie jest spełniony).
Blok końcowy STOP oznacza koniec wykonywania algorytmu

W językach programowania używamy instrukcji warunkowych, by sterować przepływem wykonywania programu, czyli wykonywać bloki instrukcji dla określonych warunków logicznychwarunków logicznych. Za pomocą instrukcji warunkowych możemy na przykład sprawdzić, czy liczba jest podzielna przez inną liczbę albo czy dany wyraz zawiera wybraną literę. Do zapisywania warunków logicznych wykorzystujemy operator relacjioperator relacji. Zapoznajmy się z najważniejszymi:
Operator | Opis |
| mniejszy niż |
| większy niż |
| mniejszy lub równy |
| większy lub równy |
| równy |
| nierówny (różny) |
W przypadku ostatnich operatorów (<= i >=) zwracajmy szczególną uwagę na kolejność znaków. Znak mniejszości lub większości jest zawsze pierwszym znakiem!
Ogólna składnia instrukcji warunkowej w Pythonie jest następująca:
Pierwszy wiersz definiuje warunek, który ma zostać sprawdzony. Jeśli warunek jest spełniony, wtedy zostaną wykonane instrukcje znajdujące się w bloku instrukcji po słowie kluczowym if. Jeśli warunek nie jest spełniony, zostaną wykonane instrukcje znajdujące się w bloku instrukcji po słowie kluczowym else (co tłumaczymy również jako w każdym innym przypadku).
W poniższym przykładzie wypisany zostanie tylko jeden z komunikatów. Jeśli zmienna będzie równa 0, kod wykona się tylko w części instrukcji warunkowej następującej po if. Dla każdego innego przypadku, jeśli zmienna nie będzie równa 0, wykona się kod zawarty po słowie kluczowym else.
W tym przypadku wypisany komunikat to: Zmienna równa się zero.
Po zmianie wartości zmiennej na 1, wyświetli się komunikat Zmienna jest różna od zera.
Instrukcja warunkowa nie musi zawierać słowa kluczowego else. Możemy zapisać tylko słowo kluczowe if wraz z warunkiem oraz blok instrukcji, który wykona się po jego spełnieniu.
Blok koduBlok kodu w języku python oznaczamy za pomocą wcięcia – domyślnie są to cztery znaki spacji.
Alternatywa – różne przypadki z różnymi warunkami logicznymi
Można również stosować bardziej złożone instrukcje warunkowe, używając słowa kluczowego elif, które oznacza else if. Instrukcja ta jest używana do sprawdzenia dodatkowych warunków, jeżeli warunek w instrukcji if nie jest prawdziwy. Możemy użyć wielu instrukcji elif po instrukcji if do obsługi wielu różnych warunków.
Ogólna konstrukcja:
W przykładzie wypisany zostanie tylko jeden z komunikatów, mimo że dla zmiennej równej 50 prawdziwym jest, że liczba ta jest większa i od 0 i od 10 (oba warunki postawione przy słowie elif). Gdy wartość zmiennej nie będzie większa bądź równa 100 (pierwszy warunek), wykona się jedynie instrukcja podana dla pierwszego spełnionego warunku, a reszta nie będzie już sprawdzana.
Po zmianie wartości zmiennej na liczbę ujemną, np. -50, wykona się instrukcja po słowie else (w przeciwnym razie), ponieważ żaden z wcześniej postawionych warunków nie został spełniony.
Zagnieżdżone instrukcje warunkowe
Zagnieżdżone instrukcje warunkowe w języku Python pozwalają na umieszczenie jednej instrukcji warunkowej wewnątrz innej instrukcji warunkowej – używamy ich, gdy mamy do czynienia z sytuacjami, które wymagają sprawdzania różnych warunków.
Ogólna składnia zagnieżdżonych instrukcji warunkowych w języku Python:
W powyższym przykładzie, jeśli warunek_1 jest spełniony, to zostaną wykonane instrukcje z wiersza 2. Następnie, jeśli warunek_2 jest spełniony, zostaną wykonane instrukcje z wiersza 4. Jeśli warunek_2 nie jest spełniony, ale warunek_1 jest spełniony (pamiętamy, że warunek_2 jest sprawdzany tylko w sytuacji gdy warunek_1 jest prawdziwy), to zostaną wykonane instrukcje z wiersza 6. Jeśli warunek_1 nie jest spełniony, zostaną wykonane instrukcje z wiersza 8.
W poniższym przykładzie zostaną wypisane dwa komunikaty.
Najpierw sprawdzany jest warunek, czy liczba jest parzysta (czyli czy reszta z dzielenia przez 2 wynosi 0). Jeśli ten warunek jest spełniony, sprawdzamy, czy parzysta liczba jest większa bądź równa 0. Jeśli tak to wypisywany jest komunikat Liczba jest większa bądź równa 0
, a w każdym innym przypadku (czyli dla liczb ujemnych) wypisujemy komunikat Liczba jest mniejsza od 0
.
Po zmianie wartości zmiennej na -7, liczba nie jest już parzysta, zatem nie spełnia pierwszego warunku (reszta z dzielenia przez 2 nie wynosi 0). W konsekwencji program przechodzi do wykonania instrukcji zapisanych po słowie kluczowym else. Jeśli liczba nie jest parzysta, nie są sprawdzane dodatkowe warunki.
Innym przypadkiem zagnieżdżania instrukcji warunkowych, jest konstrukcja z else: po której następuje if. Słowo kluczowe if zawsze musi występować na początku bloku kodu.
Zagnieżdżenie instrukcji if po słowie kluczowym else pozwala osiągnąć efekt podobny do elif.
Chcemy sprawdzić, czy dana liczba całkowita przechowywana w zmiennej należy do jednego z podanych przedziałów. Program powinien wyświetlić tylko jeden komunikat.
Możemy to zrobić za pomocą zagnieżdżonych instrukcji warunkowych. Dla wartości zmiennej równej 20 program przejdzie przez kolejne zagnieżdżenia instrukcji warunkowych if...else i wyświetli wyłącznie przedostatni komunikat informujący, że wartość zmiennej należy do drugiej dziesiątki.
Mimo że powyższy kod jest w pełni poprawny i działa tak, jak tego oczekujemy, nie jest to zalecany sposób stosowania zagnieżdżonych instrukcji warunkowych. Ten sam program można napisać za pomocą konstrukcji if...elif...else, a jej zastosowanie jest bardziej zwięzłe i łatwiejsze do odczytania, szczególnie gdy mamy wiele warunków do sprawdzenia.
Poniższy kod wykonuje dokładnie tą samą procedurę, ale ze zwiększoną przejrzystością działania.
Zagnieżdżanie instrukcji warunkowych powinno być stosowane z umiarem, aby uniknąć zbyt skomplikowanego i trudnego do zrozumienia kodu.
Przykład instrukcji warunkowej w życiu codziennym: jeśli pogoda jest deszczowa, weź parasol. W języku programowania wprowadzamy i sprawdzamy warunek, używając operatora relacjioperatora relacji. Zapoznajmy się z przykładowym warunkiem w środowisku blokowym Scratch.

W języku Python zapisujemy to w następujący sposób:
Możesz urchomić ten kod w środowisku IDLEIDLE.

Zauważ, że w środowisku Scratch operator porównania to pojedynczy znak równości (=), a w języku Python to podwójny znak równości (==).
Chcemy sprawdzić, jak duża jest podana liczba. Sprawdzimy, czy liczba spełnia warunki:
Przyjmujemy, że sprawdzana liczba to 5.
Jest ona jedynie większa albo równa 0.
O liczbie 200 możemy powiedzieć, że jest większa albo równa 100, większa albo równa 10 i większa albo równa 0. Natomiast tak naprawdę wystarczyłoby stwierdzenie, że jest większa albo równa 100, ponieważ oznacza to również, że jest większa od 10 oraz 0.
W zależności od użytej instrukcji warunkowej w języku Python możemy prześledzić dwa różne wyniki działania programu, związane z kolejnością zapisanych warunków oraz konstrukcją instrukcji warunkowej.
Przeanalizujmy zaprezentowany kod.
W poniższym przypadku stosujemy konstrukcję if...elif:
Program wypisze wyłącznie jeden komunikat ze względu na zastosowaną konstrukcję instrukcji warunkowej if... elif. W kodzie sprawdzane są kolejno zapisane warunki, aż do momentu napotkania pierwszego, którego wartość wynosi True. Wówczas wykonywany jest blok instrukcji zapisany po dwukropku i instrukcja kończy swoje działanie bez sprawdzania pozostałych warunków. Zmienna liczba o przypisanej wartości 50 nie jest większa albo równa 100, więc program przechodzi do sprawdzania kolejnego warunku. Zadana wartość zmiennej jest większa albo równa 10, więc instrukcja warunkowa zakończy sprawdzanie warunków po pierwszym przypadku spełnienia warunku.
W kolejnym przykładzie instrukcję if...elif zastępujemy trzema instrukcjami warunkowymi if:
Zapoznajmy się z różnicami w działaniu obu programów. W przypadku kilku instrukcji if następujących po sobie wszystkie instrukcje są wykonywane, a każdy warunek jest sprawdzany indywidualnie. W kolejnych instrukcjach sprawdzane są warunki niezależnie od pozostałych bloków instrukcji, co oznacza, że wypisane zostaną dwa komunikaty, ponieważ zmienna liczba równa się 50, czyli jest większa i od 10, i od 0, a więc spełnia warunki zapisane w drugiej i trzeciej instrukcji if.
Zwróć uwagę, że ze względu na odmienne działanie konstrukcji złożonej z trzech niezależnych od siebie instrukcji warunkowych if w powyższym przykładzie błędne stały się wyświetlane komunikaty – liczba 50 jest większa od 0, ale nie jest mniejsza niż 10. Kod nie działa zgodnie z założeniami.
Aby program działał poprawnie bez zmiany treści komunikatów, należy użyć instrukcji warunkowych if, zatem należy poprawić warunki. W tym celu użyjemy słowa kluczowego and pozwalającego łączyć wyrażenia logiczne.
Operator and zwraca wartość True tylko wtedy, gdy wszystkie połączone wyrażenia są prawdziwe. Jeśli którekolwiek z wyrażeń jest fałszywe, cała instrukcja warunkowa zwraca False. Wartość zmiennej liczba równa 50 nadal nie jest większa od 100, dlatego pierwszy komunikat nie zostanie wyświetlony.
Druga instrukcja warunkowa zwróci wartość True, ponieważ 50 jest większe albo równe 10 oraz (and) jest mniejsze od 100. Jak widzimy, oba warunki są spełnione, zatem drugi komunikat zostanie wyświetlony.
W ostatniej instrukcji warunkowej prawdziwy jest wyłącznie pierwszy warunek, ponieważ 50 jest większe bądź równe 0, ale nie jest mniejsze od 10. Zgodnie ze sposobem działania operatora and, jeśli którekolwiek z wyrażeń jest fałszywe, cała instrukcja warunkowa jest fałszywa, a więc jej kod wewnętrzny nie zostanie wykonany.
Bankomaty wykorzystują różne technologie do przetwarzania transakcji, technologię kryptograficzną do zapewnienia bezpieczeństwa transakcji i technologię sieci komputerowych do komunikacji z centralą banku. Wewnątrz bankomatu znajduje się komputer, którego program musi podjąć wiele decyzji na podstawie dostarczonych informacji, np.:
w jakim języku wyświetlać komunikaty,
czy włożona karta jest prawidłowa,
czy karta nie jest zastrzeżona,
czy podaliśmy prawidłowy PIN do karty,
czy kwota, którą chcemy wypłacić, jest mniejsza niż saldo konta,
czy kwota, którą chcemy wypłacić, jest mniejsza niż limity wypłat jednorazowych lub dziennych,
czy kwota, którą chcemy wypłacić, jest możliwa do wypłaty (czy w bankomacie są banknoty),
jakimi banknotami wydać kwotę.
Pomińmy trzy pierwsze punkty z listy. By wypłacić środki, zaczynamy od podania numeru PIN. Jeśli będzie poprawny, kolejne warunki będą sprawdzane. Jeśli nie będzie poprawny, działanie programu zostanie przerwane.
Spróbujmy przygotować odpowiednie instrukcje w środowisku Scratch, zakładając, że poprawny PIN to 1234:

Zapiszmy odpowiednie instrukcje również w języku Python. Wczytamy PIN z klawiatury funkcją input() i porównamy z poprawnym, używając odpowiedniego operatora relacjioperatora relacji:
Sprawdź działanie tego kodu w środowisku IDLEIDLE.
Przykład takiego wykonania:

Rozważmy przykład karty bankomatowej, która pozwala na wypłacanie różnych sum pieniędzy w zależności od użytego numeru PIN, np.:
dla numeru PIN 1234 maksymalna kwota to 100 zł,
dla numeru PIN 2345 maksymalna kwota to 300 zł,
dla numeru PIN 3374 maksymalna kwota to 500 zł,
dla numeru PIN 1034 maksymalna kwota to 700 zł.
Dla każdego innego numeru PIN należy wypisać informację o błędnym numerze PIN.
W ten sposób sterujemy wykonywaniem programu. Jeśli warunekwarunek będzie spełniony, wykonamy pewien blok instrukcji. WarunekWarunek sprawdzamy do pierwszego spełnionego warunku if lub elif, a jeśli nie będzie spełniony w żadnym z przypadków – wtedy wykonamy blok instrukcji else.
Przykładowy program w Scratch, który zrealizuje takie założenia:

Przykładowy kod w języku Python, który realizuje takie założenia:
Poprawna jest również inna kolejność warunków elif.
Sprawdź działanie tego kodu w środowisku IDLEIDLE.
Przykład takiego wykonania:

Wróćmy do bankomatu, tym razem ignorując ograniczenia nałożone na PIN. Przedstawmy za pomocą listy kroków algorytm wypłaty pieniędzy z bankomatu:
Pobieramy od użytkownika PIN.
Jeśli podany PIN jest błędny – wypisujemy odpowiedni komunikat i kończymy działanie.
Jeśli PIN jest poprawny, pobieramy od użytkownika kwotę do wypłaty.
Jeśli kwota pobrana od użytkownika w kroku 3 jest mniejsza albo równa dostępnej na koncie użytkownika, przechodzimy do kroku 5. W innym przypadku wypisujemy odpowiedni komunikat i kończymy działanie.
Jeśli kwota pobrana od użytkownika w kroku 3 jest mniejsza albo równa dostępnej w bankomacie, przechodzimy do kroku 6. W innym przypadku wypisujemy odpowiedni komunikat i kończymy działanie.
Jeśli kwota pobrana od użytkownika w kroku 3 jest możliwa do wypłaty dostępnymi banknotami w bankomacie, przechodzimy do kroku 7. W innym przypadku wypisujemy odpowiedni komunikat i kończymy działanie.
Wypłacamy kwotę pobraną od użytkownika w kroku 3 i kończymy działanie.
Listę kroków możemy zapisać za pomocą skryptu w środowisku Scratch. Pamiętajmy, że zmienne zawierające stan naszego konta i ilość pieniędzy w bankomacie to tylko przykłady. Zauważmy, że kolejne bloki sterujące znajdują się wewnątrz innych – zagnieżdżamy je.

Sprawdźmy teraz, w jaki sposób możemy przygotować kod w języku Python, aby zrealizować taki algorytm:
W kolejnych krokach sprawdzamy różne warunki.
Uruchom program w środowisku IDLEIDLE. Pamiętaj, by użyć trybu skryptowego, zapisując program w pliku, np. if_pin_01.py.

Notatnik
Prezentacja multimedialna
Indeks górny Źródło: Adam Jurkiewicz, licencja: CC BY 3.0. Indeks górny koniecŹródło: Adam Jurkiewicz, licencja: CC BY 3.0.
Swoje programy przetestuj w środowisku IDLEIDLE lub innym środowisku programistycznym języka Python zainstalowanym lokalnie. Pamiętaj, aby przy wczytywaniu danych funkcją input() zadbać o zmianę typu danych na liczbę, np. funkcją int().
Dany jest algorytm sprawdzania, która z dwóch liczb naturalnych jest większa. Zapisz go, wykorzystując język Python.

Tutaj wklej kod swojego programu (wcześniej przetestuj jego działanie w środowisku IDLE):
Napisz program sprawdzający, czy liczba podana przez użytkownika jest większa, mniejsza lub równa zero. Pamiętaj o odpowiednich funkcjach wczytywania danych od użytkownika oraz o zmianie typu danych. Zastanów się, jakie instrukcje warunkowe i w jakiej kolejności możesz zastosować.
Tutaj wklej kod swojego programu (wcześniej przetestuj jego działanie w środowisku IDLE):
Zestaw ćwiczeń interaktywnych
imie wartość Ania. Możliwe odpowiedzi: 1. imie = "Ania", 2. imie = Ania, 3. imie == "Ania", 4. "imie" = "Ania"Napisz program, który pobierze z klawiatury wiek użytkownika (liczba naturalna) i na tej podstawie określi, czy może on głosować w wyborach (w wyborach głosować może obywatel, który ma 18 lat). Program powinien następnie wyświetlić odpowiedni komunikat (zgodnie z przykładem).

Ćwiczenie możesz również wykonać w poniższej testerce w kilku etapach. Zamiast pobierania z klawiatury wieku użytkownika, na początku zdefiniujesz odpowiednie zmienne.
Zapisz funkcję, która zwróci informację o różnicy pomiędzy dwoma podanymi liczbami całkowitymi, odejmując od większej liczby mniejszą. Kolejność odejmowania nie ma znaczenia, jeśli liczby są równe.
Specyfikacja problemu:
Dane wejściowe:
liczba_1– liczba całkowitaliczba_2– liczba całkowita
Wyniki:
różnica między liczbami całkowitymi
Przykład:
Ćwiczenie wykonaj w testerce.
Słownik
wydzielona grupa instrukcji przyporządkowana do nadrzędnego elementu
ang. Integrated Development and Learning Environment; środowisko do zapisywania i uruchamiania programów napisanych w języku Python
operator, który porównuje dwa wyrażenia lub wartości i zwraca wartość logiczną prawda (True) albo fałsz (False)
wyrażenie, które przyjmuje wartość logiczną prawda (True) lub fałsz (False); w języku Python odpowiadają im wartości liczbowe 1 oraz 0
sprawdzenie, czy liczba jest parzysta, czyli czy reszta z dzielenia przez 2 wynosi 0
Bibliografia
Dokumentacja języka Python, docs.python.org, dostęp 12.03.2024.
Jurkiewicz A., Python 3 – Projekty dla początkujących i pasjonatów, wyd. Helion, Gliwice 2021.
Łos K., Python dla nastolatków. Projekty graficzne z Python Turtle, wyd. Helion, Gliwice 2022.
Platforma OSE IT‑Szkoła, Programowanie w Pythonie z Klubem Młodego Programisty, it‑szkola.edu.pl, dostęp 12.03.2024.
Sysło M.M., Algorytmy, wyd. Helion, Gliwice 2016.











