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.
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.
Podstawowym słowem kluczowym do decydowania jest angielskie słowo if (jeśli).
Składnia instrukcji warunkowej w Pythonie wymaga dwóch bardzo ważnych elementów, bez których wyskoczy błąd "SyntaxError".
:. Tłumaczy on Pythonowi, że tu kończy się pytanie, a na dole zaczyna się odpowiedź na nie.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.
:, 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.
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 i wyciąga 140.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).
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".
Często programiści stosują mały skrót myślowy w pisaniu. Zamiast pisać if zmienna == True: piszemy po prostu if zmienna:.
bool(), dla której puste wartości (zero, pusty tekst "") to False, a inne to True? 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!
Możemy korzystać z operatora not (negacji) aby zapytać czy czegoś NIE MA, lub czy coś jest fałszem.
not odwraca Fałsz w Prawdę. Skoro wyszła Prawda (True) - instrukcja `if` wykonuje kod pod spodem!
Przeczytaj poniższy kod. Sprawdź uważnie wiek oraz stan wejściówki. Czy gość zostanie wpuszczony, czy zablokowany?
Zastanów się nad rozwiązaniem w oparciu o poznane słowo or.
Linia analizowana: if wiek >= 18 or ma_wejsciowke_vip:
Wynik na ekranie: "Wchodzisz do klubu."
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).
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.
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.
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.
Gdy `x = 10`, wypisze tylko A. Drabinka kończy się po 1 sukcesie.
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.
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?
Zastanów się jak to naprawić!
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.
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).
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.
Możemy łączyć wiele pytań w jednej linijce, używając operatorów z poprzedniego działu:
and (i zarazem) - Wymaga, by OBIE strony były Prawdą. (Idealne do łączenia wymagań)or (lub) - Wymaga, by PRZYNAJMNIEJ JEDNA strona była Prawdą. (Alternatywa)not (nie) - Odwraca prawdę w fałsz.and, by sprawdzić wszystko za jednym zamachem i ułatwić czytanie kodu!
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!
Python widzi False przed `and`. Wie, że wynik to False. Przerywa działanie i nie uruchomi Funkcji!
Python widzi True przed `or`. Ma już swojego zwycięzcę! Nie musi dalej szukać.
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.
Spróbuj przekleić powyższy kod w środowisku PyCharm, albo w repl.it by zobaczyć, jak fajnie się to odpala!
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"`).
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.Mając poznane zmienne, operator konwersji, inputy oraz łańcuchy if/elif/else... potrafimy stworzyć prostą grę decyzyjną!
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)?
Profesjonalni programiści lubią zapisywać proste warunki w ułamku sekundy i w zaledwie jednej linijce! Poznajcie tak zwany Ternary Operator.
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.
Napisz w środowisku PyCharm następujący skrypt używając input i if / elif / else.
int()!).* Uważaj na pułapkę odpowiedniej kolejności drabinki (Złota Zasada)!
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! 🚀