🚦 Po co nam instrukcje warunkowe?

Do tej pory nasz kod działał bardzo prosto – wykonywał się linijka po linijce, od góry do dołu. Każda linijka była czytana przez interpreter i natychmiast realizowana.

W grach komputerowych tak się nie da!
👩‍🏫
Skrzynia nie może się otworzyć, zanim nie znajdę klucza!
🧑‍💻

Zaczynamy wchodzić w najważniejszą część programowania (i tworzenia sztucznej inteligencji). Nauczymy komputer podejmować decyzje na podstawie aktualnych warunków. Będzie do tego potrzebna logika (True/False), której nauczyliśmy się w poprzednim dziale.

🛡️ Instrukcja 'if' (Jeśli)

Podstawowym słowem kluczowym do decydowania jest angielskie słowo if (jeśli).

klucz = True

if klucz == True:
    print("Otwierasz skrzynię!")
Instrukcja if sprawdza, czy warunek znajdujący się po niej (aż do znaku dwukropka) oddaje logiczną wartość Prawdy (True).
  • Jeśli jest Prawdą (True): kod, który znajduje się poniżej (wciśnięty w prawo) zostanie wykonany.
  • Jeśli jest Fałszem (False): komputer "przeskoczy" ten kod i go zignoruje!

🧱 Zrozumieć składnię 'if'

Składnia instrukcji warunkowej w Pythonie wymaga dwóch bardzo ważnych elementów, bez których wyskoczy błąd "SyntaxError".

  1. Na końcu warunku MUSI znaleźć się dwukropek :. Tłumaczy on Pythonowi, że tu kończy się pytanie, a na dole zaczyna się odpowiedź na nie.
  2. Linie kodu pod spodem MUSZĄ być wcięte (zrobione wcięcie np. klawiszem Tab). Python rozpoznaje bloki kodu nie po nawiasach klamrowych {} jak inne języki, ale właśnie po wcięciach!
# DOBRZE:
if 10 > 5:
    print("10 to więcej")
    print("niż 5!")
# ŹLE (Brak dwukropka, brak wcięcia):
if 10 > 5
print("Błąd!")

📏 Wcięcia to rzecz święta!

Wcięcie (Indentation) to znak dla komputera, że "ten kod należy do tego 'ifa'". Zobaczmy, co się stanie, gdy wcięcie się kończy.

x = 1

if x == 10:
    print("Wykona się TYLKO gdy X to 10")  # Ignorujemy to!

print("Wykona się ZAWSZE")                  # To się zawsze wydrukuje
Edytory takie jak PyCharm dbają o wcięcia za Ciebie. Gdy wciśniesz Enter po dwukropku :, kursor automatycznie "przeskoczy" w prawo (o 4 spacje lub jeden tabulator). Gdy chcesz zakończyć pisanie warunku, po prostu użyj klawisza Backspace, aby wrócić do lewej krawędzi.

🤔 Jak komputer czyta warunki?

Za słowem `if` nie musimy pisać dosłownie `True` albo `False`. Python sam przeliczy nasze zapytanie (np. z operatorami `>`, `<`, `==`) i oceni czy to Prawda.

szybkosc = 140

if szybkosc > 120:
    print("Zwolnij! Przekraczasz prędkość na autostradzie.")
Proces myślowy:
  1. Otwiera pudełko szybkosc i wyciąga 140.
  2. Ocenia warunek: czy 140 jest większe od 120? Tak (True).
  3. Skoro to True, wchodzi do "wciętego" bloku kodu poniżej i drukuje mandat.

🎭 'Else' (W przeciwnym wypadku)

Sam `if` to jedno rozwiązanie. Omija kod, gdy warunek nie jest spełniony. Co jednak, jeśli chcemy, aby komputer zrobił "coś innego" w przypadku fałszu?

Do gry wkracza instrukcja else: (w przeciwnym wypadku).

haslo_uzytkownika = "złe_haslo"

if haslo_uzytkownika == "sekret123":
    print("Zalogowano pomyślnie.")
else:
    print("Błędne hasło. Odmowa dostępu.")
Else wykonuje się ZAWSZE, gdy warunek przypisany do if okazał się fałszywy (False). Zauważ, że `else` również kończy się dwukropkiem i wymaga wcięć poniżej! W `else` nie podajemy żadnego równania do sprawdzania, on po prostu czeka jako "plan zapasowy".

🧬 Skrócone sprawdzanie Prawdy

Często programiści stosują mały skrót myślowy w pisaniu. Zamiast pisać if zmienna == True: piszemy po prostu if zmienna:.

# Opcja dla początkujących:
czy_pada = True
if czy_pada == True:
    print("Weź parasol.")
# Opcja dla Pro:
czy_pada = True
if czy_pada:
    print("Weź parasol.")
Pamiętasz z poprzednich lekcji funkcję bool(), dla której puste wartości (zero, pusty tekst "") to False, a inne to True?
Zwykły if pod maską potajemnie robi dokładnie to samo! Jeśli użyjemy kodu: if "Tomek": to warunek się spełni, bo słowo "Tomek" zamieni się na True!

🤔 Używanie operatora 'not' w ifach

Możemy korzystać z operatora not (negacji) aby zapytać czy czegoś NIE MA, lub czy coś jest fałszem.

czy_mamy_bilet = False

if not czy_mamy_bilet:
    print("Proszę kupić bilet w kasie.")
Dla mózgu brzmi to naturalnie: "Jeśli nie czy_mamy_bilet to...".
Dla komputera działa to tak: Zmienna była Fałszem. Słowo not odwraca Fałsz w Prawdę. Skoro wyszła Prawda (True) - instrukcja `if` wykonuje kod pod spodem!

🎯 Ćwiczenie: Logiczny Ochroniarz

+100 XP

Kto wejdzie do klubu?

Przeczytaj poniższy kod. Sprawdź uważnie wiek oraz stan wejściówki. Czy gość zostanie wpuszczony, czy zablokowany?

wiek = 17
ma_wejsciowke_vip = True

if wiek >= 18 or ma_wejsciowke_vip:
    print("Wchodzisz do klubu.")
else:
    print("Przykro mi, nie wejdziesz.")

Zastanów się nad rozwiązaniem w oparciu o poznane słowo or.

✅ Rozwiązanie: Logiczny Ochroniarz

Linia analizowana: if wiek >= 18 or ma_wejsciowke_vip:

  1. Komputer podstawia wiek: `17 >= 18`. To jest Fałsz (False).
  2. Słowo `or` oznacza, że wciąż jest nadzieja. Przechodzi do drugiej części.
  3. Zmienna `ma_wejsciowke_vip` wynosi Prawda (True).
  4. False OR True = True.
  5. Skoro ostateczny wynik to True, program wchodzi do bloku wciętego pod `if` i ignoruje `else`.

Wynik na ekranie: "Wchodzisz do klubu."

📉 'Elif' (Więcej niż dwie drogi)

Czasem świat nie jest czarno-biały i `if / else` to za mało, bo mamy więcej niż 2 opcje. Np. w grze możemy mieć wynik "Zwycięstwo", "Remis", lub "Przegrana".

W Pythonie korzystamy ze słowa elif (skrót od "else if" - w przeciwnym razie jeśli).

punkty = 50

if punkty > 80:
    print("Złoty puchar!")
elif punkty > 40:
    print("Srebrny puchar!")
else:
    print("Brak nagrody.")
Zwróć uwagę, że elif także posiada warunek logiczny i wymaga dwukropka na końcu! Możesz napisać tyle elifów pod rząd, ile tylko zapragniesz. Zawsze znajdują się między if a else.

🧐 Jak działa łańcuch if-elif?

Bardzo ważna zasada działania drabinki `if-elif-else`: Komputer czyta ją od góry do dołu. Gdy tylko znajdzie PIERWSZĄ prawdziwą odpowiedź (True), wykonuje jej kod, po czym PRZERYWA SPRAWDZANIE CAŁEJ RESZTY.

wiek = 25

if wiek > 10:
    print("Jesteś starszy niż 10 lat.")
elif wiek > 20:
    print("Jesteś starszy niż 20 lat.")  # TO SIĘ NIGDY NIE WYKONA!
Mimo że 25 jest większe niż 20, komputer nigdy tam nie dotrze! Pierwszy warunek (25 > 10) okazał się prawdziwy, wydrukował "Jesteś starszy niż 10 lat" i zadowolony uciekł z całej drabinki.
Dlatego w drabinkach zawsze sprawdzajmy najbardziej unikalne/największe warunki jako pierwsze!

🪜 Różnica między 'If-Elif' a wieloma 'If'ami

Możesz pomyśleć: "Po co mi `elif`, skoro mogę napisać dużo `if`ów jeden pod drugim?". To dwie zupełnie różne instrukcje dla komputera.

# Łańcuch powiązany (1 decyzja)
if x > 5:
    print("A")
elif x > 0:
    print("B")

Gdy `x = 10`, wypisze tylko A. Drabinka kończy się po 1 sukcesie.

# Niezależne pytania (kilka)
if x > 5:
    print("A")
if x > 0:
    print("B")

Gdy `x = 10`, wypisze A oraz B, ponieważ to są odrębne, niezależne od siebie zapytania.

Jeśli warunki się wykluczają (np. ocena w szkole: 1, 2, 3, 4, 5), zawsze używamy jednej drabinki `if-elif-else`, aby nie marnować mocy komputera.

🎯 Ćwiczenie: Zły Skrypt Ocen

+200 XP

Błąd logiczny w Ocenach

Nauczyciel napisał skrypt, który ma zamieniać punkty (0-100) na oceny (3, 4, 5). Uczeń zdobył 90 punktów. Zamiast piątki otrzymał trójkę! Dlaczego tak się stało?

punkty = 90

if punkty >= 50:
    print("Ocena 3")
elif punkty >= 70:
    print("Ocena 4")
elif punkty >= 90:
    print("Ocena 5")
else:
    print("Ocena niedostateczna")

Zastanów się jak to naprawić!

✅ Rozwiązanie: Odwróć drabinkę!

Dlaczego wystąpił błąd?
Komputer przeczytał `90 >= 50` i odpowiedział: True! Przyznał Trójkę, po czym szczęśliwy przestał sprawdzać resztę ocen. Uczeń dostał "trójkę", mimo że zasłużył na "piątkę".

Zasada Złotej Drabinki:
Zawsze sprawdzaj od NAJBARDZIEJ WYMAGAJĄCYCH warunków (najwęższego gardła) schodząc powoli na sam dół do najmniej wymagających.

# POPRAWNA WERSJA KODU:
if punkty >= 90:
    print("Ocena 5")
elif punkty >= 70:
    print("Ocena 4")
elif punkty >= 50:
    print("Ocena 3")

🪆 Zagnieżdżone warunki (If w Ifie)

Co jeśli wejście do budynku wymaga vipowskiego zaproszenia, a dopierto TAM sprawdzają dowód osobisty? Możemy wkładać if do środka innego ifa! Nazywamy to zagnieżdżaniem (Nesting).

jest_vip = True
wiek = 16

if jest_vip:
    print("Witaj w strefie VIP!")
    # Wymagane dodatkowe wcięcie w środku!
    if wiek >= 18:
        print("Proszę, oto piwo.")
    else:
        print("Proszę, oto sok jabłkowy.")
else:
    print("Zwykła strefa dla wszystkich.")

Pamiętaj o tym, aby po każdym otwarciu `if` przesunąć kolejny blok w prawo! Za głębokie zagłębianie kodu (tzw. Spaghetti Code) staje się jednak trudne do czytania i naprawy.

🧠 Przypomnienie operatorów: AND, OR, NOT

Możemy łączyć wiele pytań w jednej linijce, używając operatorów z poprzedniego działu:

if hp > 0 and mana > 10:
    print("Możesz rzucić zaklęcie!")
Zamiast pisać bardzo skomplikowane zagnieżdżone `if`y (jeden w drugim), często używa się po prostu operatora and, by sprawdzić wszystko za jednym zamachem i ułatwić czytanie kodu!

🛑 Leniwa Ewaluacja (Przypomnienie)

Pamiętaj, że w instrukcjach warunkowych Python oszczędza prąd. Jeśli pierwsza część wyrażenia przekreśla sens sprawdzania drugiej, odpuści ją całkowicie!

# Leniwy 'and'
if False and Super_Trudna_Funkcja():
    print("Nic")

Python widzi False przed `and`. Wie, że wynik to False. Przerywa działanie i nie uruchomi Funkcji!

# Leniwy 'or'
if True or Niewazne_Co():
    print("Zawsze!")

Python widzi True przed `or`. Ma już swojego zwycięzcę! Nie musi dalej szukać.

⚡ Funkcja input() - Ożywiamy kod!

Warunki `if` nie miałyby sensu, gdyby programista przed uruchomieniem kodu z góry znał wszystkie zmienne (np. `x=10`). Prawdziwe programy pobierają informacje od gracza (użytkownika) w trakcie trwania.

input("Wiadomość") zatrzymuje działanie programu i czeka, aż gracz coś wpisze na klawiaturze i naciśnie Enter. Tekst wpisany przez użytkownika jest ZAWSZE pobierany jako string (tekst).
imie = input("Podaj swoje imię wojowniku: ")
print("Gotów do walki, " + imie + "!")

Spróbuj przekleić powyższy kod w środowisku PyCharm, albo w repl.it by zobaczyć, jak fajnie się to odpala!

⚠️ Pułapka input() i liczb

Czeka na nas typowa pułapka związana z typami danych. Jeśli zapytasz gracza o wiek, `input` zwróci Ci to zawsze jako TEKST (np. string `"20"`).

# TO WYWALI BŁĄD LOGICZNY W IFIE:
wiek = input("Ile masz lat? ")
if wiek > 18:    # Błąd (TypeError)! Tekstu nie sprawdzisz dzióbkiem (>) dla liczb.

Rozwiązanie: Rzutowanie!
Zanim wpuścisz informację z klawiatury do instrukcji warunkowej, zamień ją natychmiast na liczbę całkowitą int().
Możesz to zrobić na dwa sposoby:

  • wiek = int( input("Wiek?") ) - Od razu zamykamy input w int.
  • wiek = int(wiek) - Zamiana w drugiej linijce, tuż po pobraniu.

🎮 Budujemy Minigrę Tekstową

Mając poznane zmienne, operator konwersji, inputy oraz łańcuchy if/elif/else... potrafimy stworzyć prostą grę decyzyjną!

print("Stoisz przed wielkimi wrotami lochu.")
wybor = input("Co robisz? (walcz/uciekaj): ")

if wybor == "walcz":
    sila = int(input("Podaj swoją siłę (1-10): "))
    if sila > 5:
        print("Pokonałeś orka. Wygrywasz grę!")
    else:
        print("Byłeś za słaby. Ork Cię miażdży. Game Over.")
elif wybor == "uciekaj":
    print("Uciekłeś w bezpieczne miejsce, żyjesz, ale wstydu się najadłeś.")
else:
    print("Nie znam takiej komendy, ork zaatakował Cię z zaskoczenia!")

Przeanalizujmy ten kod. Gdzie następuje rzutowanie? Jak działa "else" na samym końcu by wyłapywać błędy typu (literówki wpisane przez gracza)?

🪄 Skrócony IF (Operator Trójargumentowy)

Profesjonalni programiści lubią zapisywać proste warunki w ułamku sekundy i w zaledwie jednej linijce! Poznajcie tak zwany Ternary Operator.

# Normalnie (4 linijki)
if wiek >= 18:
    status = "Dorosły"
else:
    status = "Dziecko"
# Po hakersku (1 linijka)
status = "Dorosły" if wiek >= 18 else "Dziecko"
Brzmi to niemal jak naturalne zdanie: "Status to Dorosły jeśli wiek >= 18, w przeciwnym razie Dziecko". Zauważ, że brakuje tu dwukropków po `if` i `else`. Używamy tego TYLKO do przypisywania prostych zmiennych, unikamy w tym skomplikowanych obliczeń!

🤷‍♂️ A co jak nic nie robię? (Słowo 'pass')

Znasz już twardą zasadę - po instrukcji warunkowej (oraz pętli) MUST pojawić się wcięty blok kodu. Jeśli w ramach "budowania szkieletu gry" zrobisz puste miejsce, kod wywali SyntaxError.

if gracz_umarl == True:
    # Kiedyś napiszę tu animację śmierci, ale dziś mi się nie chce.
    pass           # Ratuje nas słowo PASS!
else:
    print("Gramy dalej!")
pass to oficjalny wypełniacz (placeholder) w Pythonie. Mówi interpreterowi: "Wiem, że musi tu być jakiś blok kodu po wcięciu. Zignoruj to po prostu, kodzie, idźmy dalej".

🎯 Ostateczne Starcie (Projekt Domowy)

+500 XP

Bramy ZSE (Zespół Szkół Energetycznych)

Napisz w środowisku PyCharm następujący skrypt używając input i if / elif / else.

  1. Zapytaj użytkownika o jego dzisiejszy wynik z testu (punkty z EduQuest) w formacie liczbowym (pamiętaj o int()!).
  2. Stwórz zasady oceniania w EduQuest:
    - Jeśli uczeń ma powyżej lub równo 100 punktów: "Otrzymujesz rangę: Cyber-Haker!".
    - Jeśli ma od 50 do 99 punktów: "Ranga: Uczeń ZSE."
    - Jeśli poniżej 50 punktów: "Ranga: Nowicjusz, musisz więcej poćwiczyć."

* Uważaj na pułapkę odpowiedniej kolejności drabinki (Złota Zasada)!

🏆 Podsumowanie Decyzji

Opanowaliśmy pełną kontrolę nad przebiegiem aplikacji. Bez tych elementów, skrypt byłby tyko bezmyślnie spływającym strumieniem tekstu.

Instrukcja Znaczenie Zasady
if Otwiera warunek (JEŚLI). Wymaga dwukropka : na końcu i wcięć poniżej.
elif Kolejny warunek (JEŚLI INACZEJ). Może być ich nieskończenie wiele. Sprawdzane, gdy górne zawiodą.
else Plan zapasowy (W PRZECIWNYM RAZIE). Odpala się ZAWSZE, gdy cała drabinka zawiedzie. Zawsze jest na końcu i nie ma zadanego warunku.
input() Pobiera wpis z klawiatury. Zawsze oddaje typ String! Zabezpiecz go funkcją rzutowania int() jeśli potrzebujesz obliczeń!

Czekam na Twoje polecenia odnośnie kolejnych materiałów! 🚀