← Lekcje
Python · lekcja 06

elif oraz and, or, not

  1. Trzy drogi zamiast dwóch: słowo elif
  2. Kolejność warunków: pierwszy prawdziwy wygrywa
  3. Łączenie warunków: and, or, not
  4. Ćwiczenie: trzy programy, które same wybierają odpowiedź
Rozgrzewka · 3 minuty

Co pamiętacie z lekcji 5?

  1. Co takiego wpisujemy po słowie if, żeby program wiedział, co wybrać?
  2. Ile dróg wykona się w programie z if i else: jedna czy obie?
  3. Po czym Python poznaje, które linijki należą do bloku po if?
Część 1 · Po co elif

Cztery oceny, jeden program

Oceniamy test punktowo. Dróg jest cztery, a if z else daje tylko dwie. Bez nowego słowa trzeba zagnieżdżać, czyli wkładać jeden if do środka drugiego.

Zagnieżdżanie: wcięcia rosną

if points >= 90:
    print("Ocena: 5")
else:
    if points >= 75:
        print("Ocena: 4")
    else:
        if points >= 50:
            print("Ocena: 3")
        else:
            print("Ocena: 1")

Z elif: wcięcie jedno

if points >= 90:
    print("Ocena: 5")
elif points >= 75:
    print("Ocena: 4")
elif points >= 50:
    print("Ocena: 3")
else:
    print("Ocena: 1")

Dla points = 80 obie wersje wypisują Ocena: 4.

docs.python.org, The Python Tutorial, rozdz. 4.1 (if Statements) · Podręcznik Informatyka na czasie 2 (Nowa Era), s. 224 (dodatek 7, zagnieżdżanie instrukcji warunkowych)
Część 1 · Jak działa elif

Pierwszy prawdziwy wygrywa

Python sprawdza warunki po kolei, z góry na dół. Przy pierwszym prawdziwym wykonuje jego blok i kończy całą instrukcję: pozostałych warunków nawet nie czyta.

if points >= 90: elif points >= 75: elif points >= 50: else: fałsz fałsz prawda prawda prawda Ocena: 5 Ocena: 4 Ocena: 3 Ocena: 1 koniec

Skąd nazwa: elif to skrót od angielskiego „else if”, czyli „w przeciwnym razie jeśli”. Tutorial Pythona podaje, że części elif może być dowolnie wiele, a else jest opcjonalne.

docs.python.org, The Python Tutorial, rozdz. 4.1 (if Statements)
Część 1 · Kolejność warunków

Ten sam próg, zła kolejność

points = 95

if points >= 50:
    print("Ocena: 3")
elif points >= 75:
    print("Ocena: 4")
elif points >= 90:
    print("Ocena: 5")

Na ekranie: Ocena: 3

Liczba 95 spełnia wszystkie trzy warunki. Python bierze pierwszy z góry, więc dalsze progi są nieosiągalne: ocena 4 i 5 nie wyjdą nigdy, dla żadnej liczby punktów.

Reguła: gdy warunki się nakładają, na górze stawiamy ten najtrudniejszy do spełnienia. Przy progach punktowych: od największego do najmniejszego.

docs.python.org, The Python Tutorial, rozdz. 4.1 (if Statements)
Część 2 · Operatory logiczne

Nie, lub, i

Jeden warunek często nie wystarcza. Trzy operatory logiczne łączą warunki w jeden większy. Python zapisuje je zwykłymi angielskimi słowami.

NazwaZapisKiedy całość jest prawdąPrzykład
koniunkcja („i”)andtylko gdy oba warunki są prawdą narazdla x równego 3 i y równego 2 zapis x < 5 and y > 1 daje True
alternatywa („lub”)orgdy choć jeden jest prawdą; fałszem tylko, gdy oba fałszywedla x równego 5 i y równego 5 zapis x == 5 or y == 5 daje True
zaprzeczenie („nieprawda, że”)notgdy warunek po nim jest fałszywydla x równego 3 zapis not x == 4 daje True
Podręcznik Informatyka na czasie 2 (Nowa Era), s. 222 (dodatek 5, tabela operatorów logicznych w języku Python)
Część 2 · Wartości logiczne

Cztery przypadki i granica

p q not p p or q p and q 1 0 0 1 0 0 1 1 1 0 1 1 1 1 0 0 0 0 1 to prawda, 0 to fałsz Zaprzeczenie granicy p: x < 4 not p: x >= 4 nie x > 4: czwórka też ma swoją drogę
Podręcznik Informatyka na czasie 2 (Nowa Era), s. 220–221 (dodatek 5, tabela wartości logicznych, zaprzeczenie)
Część 2 · Zagnieżdżenie

Pytanie w środku pytania

if product == "buty":
    if color == "zielony":
        discount = 0.5
    else:
        discount = 0.2
else:
    discount = 0.1

buty zielone: 0.5 · buty czarne: 0.2 · czapka: 0.1

Tu pytania są dwa i jedno zależy od drugiego: kolor ma znaczenie tylko dla butów. Dlatego drugi if siedzi w środku pierwszego, z podwójnym wcięciem.

elif używamy, gdy jedna wartość dzieli się na kilka przedziałów. Zagnieżdżenia, gdy drugie pytanie ma sens dopiero po odpowiedzi na pierwsze. To samo da się zapisać jako product == "buty" and color == "zielony".

Podręcznik Informatyka na czasie 2 (Nowa Era), s. 224 (dodatek 7, zagnieżdżone instrukcje warunkowe, przykład z rabatem)
Ćwiczenie · przy komputerze · 10 minut

Ćwiczenie: trzy programy z elif

Każdy program zapisz w osobnym pliku i uruchom dla wszystkich podanych liczb. Sprawdź, czy wynik zgadza się z tym, co sam policzyłeś.

  1. Plik grade.py: wczytaj punkty i wypisz ocenę. Progi: od 90 ocena 5, od 75 ocena 4, od 50 ocena 3, niżej ocena 1. Sprawdź dla 95, 80, 60 i 20.
  2. Plik ticket.py: wczytaj wiek i wypisz cenę biletu. Poniżej 7 lat 0 zł, poniżej 18 lat 10 zł, od 65 lat 12 zł, w pozostałych przypadkach 20 zł. Sprawdź dla 5, 15, 30 i 70.
  3. Plik temp.py: wczytaj temperaturę i użyj and. Dla wartości od 0 do 25 włącznie wypisz „W normie”, w przeciwnym razie „Poza zakresem”. Sprawdź dla -3, 15 i 30.
Jak to sprawdzić

Uruchom plik i wpisz liczbę, a potem wciśnij Enter. Jeden program, jedno uruchomienie, jedna liczba: żeby sprawdzić cztery wartości, uruchamiasz go cztery razy.

Sprawdzenie

Trzy pytania na koniec

  1. Ile części elif wolno dopisać do jednego if i ile bloków wykona program?
  2. Czy kolejność warunków w ciągu elif jest dowolna?
  3. Jak zapisać warunek „temperatura jest z przedziału od 0 do 25 włącznie”?
Podsumowanie

A jak to wygląda w produkcji?

Na lekcjiW produkcjiStatus
Ciąg elif z progamiWysokość rabatu, taryfa za przesyłkę, próg darmowej dostawy: firmowe reguły to najczęściej właśnie ciąg progówcodziennie
Progi wpisane w kodProgi trzyma się w ustawieniach albo w bazie, bo zmieniają się częściej niż sam programzmienione
and i or w jednym warunkuWarunek dłuższy niż dwa człony przenosi się do osobnej funkcji z nazwą, żeby dało się go przeczytaćrozszerzane
Kolejność warunkówNieosiągalna gałąź to typowy błąd zgłaszany przez narzędzia sprawdzające kod przed wysłaniem go do zespołunarzędzia

W praktyce: wiele języków ma osobną instrukcję switch albo case do wyboru jednej z wielu dróg. Tutorial Pythona podaje, że ciąg if, elif, elif zastępuje w Pythonie tamtą instrukcję.

docs.python.org, The Python Tutorial, rozdz. 4.1 (if Statements)