Mamy już z głowy takie podstawowe operatory do porównywania wartości, więc teraz nadszedł czas na jedną z ważniejszych instrukcji. Jest to mianowicie instrukcja warunkowa if co z angielskiego tłumaczymy jako jeżeli – jeżeli warunek jest spełniony, jeżeli dane wyrażenie ma wartość True, to wykonaj pewną czynność. Podstawa koncepcji kontroli przepływu. Podstawa koncepcji podejmowania decyzji – jeśli coś to coś.
Składnia instrukcji warunkowej, w przypadku języka Python, jest bardzo prosta, nawet można powiedzieć banalna (zwłaszcza jeśli miało się kiedyś do czynienia z instrukcją warunkową w innych językach progrmowania). Pokażmy to sobie na przykładzie. Zapisujemy na początku:
Powyższe oznaczać będzie „Jeśli 1 == 1 jest prawdą, to”, na końcu musimy dodać dwukropek, po którym będziemy wymieniać instrukcje i wyrażenia, które mają zostać wykonane, gdy warunek się spełni, czyli 1 == 1 będzie prawdą. Jak wiemy 1 == 1 zawsze będzie prawdę, bo właśnie 1 jest równe 1, czyli warunek zwróci (jak wiemy z poprzedniego wpisu) wartość True. Czyli jak powinna wyglądać cała taka kompletna linijka?
Właśnie tak jak powyżej na obrazku, a schemat jest taki If warunek_do_spełnienia : poniżej robimy 4 spacje wcięcia, by zacząć pisać w zagnieżdżonym bloku kodu instrukcji warunkowej – wymieniając to co ma zostać wykonane w przypadku zwrócenia True przez warunek. Większość edytorów oczywiście doda za nas te 4 spacje, jeśli wciśniemy klawisz Tab. Poniżej mamy kompletny blok kodu.
Który oznacza: jeśli 1 == 1 to prawda, wyświetl ciąg znaków 'To jest prawda’. – Proste prawda? Jeśli się to zrozumie to już tak, ale rzeczywiście wydaje się to intuicyjne, bo podobne do tego jak my, ludzie, podejmujemy decyzje.
Jeśli natomiast 1 warunek, czyli to co jest po słówku kluczowym if, zwróciłby False – to co jest w linii drugiej, nigdy by się nie wykonało, ponieważ zagnieżdżony pod ifem blok wykona się tylko wtedy gdy warunek zwraca True.
Wcięcie
Powyżej mamy do czynienia z koncepcją wcięcia, która jest bardzo ważna w Pythonie, bo oznacza zagnieżdżenie bloku. Jest to zmiana w porównaniu z większością języków programowania, gdzie zwykle do oznaczania zagnieżdżonych bloków kodu stosuje się nawiasy klamrowe. Tak więc wcięcie w Pythonie definiuje zawartość bloku kodu, który jest niejako 'podrzędny’ w stosunku do instrukcji if, w tym wypadku.
Jeśli przykładowo opuścimy blok wciętego kodu i napiszemy coś dalej, na tym samym poziomie co instrukcja warunkowa, to nie będzie to już jej częścią. Będzie to następna, całkowicie odrębna, instrukcja w kodzie.
Tak więc, linia numer cztery, zostanie wykonana niezależnie czy warunek w instrukcji warunkowej jest prawdą czy fałszem.
Trochę więcej o instrukcji warunkowej
Jeśli oczywiście wartość wyrażenia umieszczonego w warunku instrukcji warunkowej if zwróci False, to blok zagnieżdżony pod nią nigdy nie zostanie wykonany, a interpreter przejdzie do dalszych instrukcji, jak w poniższym przypadku.
W takim wypadku wykonana zostanie tylko instrukcja w linii czwartej, czyli naszym oczom ukaże się tylko napis 'Koniec programu’. I dlatego if jest podstawą sterowania przepływem programu, podstawą bardzo ważnej koncepcji podejmowania decyzji. – 'Wykonaj linię numer dwa, tylko i wyłącznie jeśli warunek zwróci True’.
W praktyce, możemy oczywiście w warunku instrukcji warunkowej umieszczać różne wartości, możemy przykładowo sprawdzać czy jakaś zmienna jest równa zero i w zależności od jej wartości wykonywać jakiś kod lub nie.
Teraz oczywiście wartość zmiennej a (w zasadzie obiektu typu int, na który wskazuje zmienna a, jak oczywiście pamiętamy), jest równa zero, czyli linia trzecia, zostanie wykonana, a zaraz po niej także linia piąta.
False z warunku
No i właśnie, co zrobić gdy warunek zwróci nam False? Wtedy kod zawarty w naszej instrukcji warunkowej nie zostanie wykonany. I co poniektórzy mogliby wpaść na wspaniały pomysł – wystarczy napisać następną instrukcję, sprawdzającą kolejny warunek. Tak, to jest jakieś rozwiązanie, natomiast kolejny warunek też może nie zwrócić wartości True, a co ważniejsze, wymaga znowu sprawdzania warunku, a my przecież już jeden sprawdzaliśmy.
No bo jeśli pojawi się False, to kończymy wykonywanie instrukcji warunkowej i idziemy z programem dalej, wykonując jego kolejne instrukcje, już poza naszym ifem. Natomiast co gdybyśmy mieli tak jakby dwie ścieżki wykonywania do wybrou? Tzn. na podstawie jednej wartości chcemy pójść jedną ścieżką, albo drugą. Oczywiście mamy taką możliwość. taką drugą ścieżkę zdefiniujemy za pomocą słówka kluczowego ’else’, po którym oczywiście postawimy dwukropek. Nasze nowe słówko, będzie oznaczać 'w przeciwnym wypadku’ czyli to co zostanie wykonane gdy warunek się nie spełni i zwróci właśnie False.
Czyli mamy już pewien komplet – instrukcję warunkową i jej pierwszy blok, który zostanie wykonany jeśli warunek tej instrukcji (to co po słowie if) zwróci True, czyli będzie prawdą. Mamy także słówko else i instrukcje zagnieżdżone pod nim, które zostaną wykonane w każdym innym wypadku, czyli najczęściej gdy warunek zwróci False. No i linijkę numer 7, która zostanie wykonana niezależnie od wyniku instrukcji warunkowej – czyli zawsze.
W aktualnej sytuacji (jak na screenie powyżej) mamy oczywiście tylko jeden wynik warunku – True. Jest tak ponieważ zmienna a jest równa zero, więc warunek zostaje spełniony. Możemy jednak zmienić tą sytuację, zmieniając wartość zmiennej a.
W zależności od wartości zmiennej (tym samym warunku), program może pójść dwiema ścieżkami. Dlatego właśnie mówimy o sterowaniu przepływem, mamy jedną lub drugą ścieżkę wykonywania programu do wyboru i w zależności od wyniku, którąś z nich pójdzie program. Dodatkowo, ta która nie będzie tą którą program 'wybierze’ nie zwróci nawet błędu, jeśli coś jest w niej nie tak, ponieważ nie zostanie wykonana (w innych językach bywa inaczej).
Przykładowe wykorzystanie ifa
Teraz wreszcie zastosujmy poznane koncepcje w praktyce. Powiedzmy sobie, że damy użyszkodnikowi możliwość wpisywania swojego imienia, natomiast, gdy wpisane imię będzie krótsze niż trzy znaki, zwrócimy komunikat 'podałeś za krótkie imię’, a w przeciwnym wypadku wyświetlimy komunikat powitalny, personalizując go i dodając podane imię.
Użyjemy oczywiście instrukcji input, a wartości przekazanej przez nią nie będziemy musieli konwertować, bo input, jak wiemy, zwraca typ tekstowy string. My właśnie chcemy typu tekstowego, czyli mamy już 'na gotowe’. Będzie nam potrzebna natomiast funkcja sprawdzająca długość kolekcji (string to typ kolekcji), mamy taką funkcje wbudowaną w język Python, a jest to len() – zwraca ona liczbę reprezentującą długość kolekcji (u nas, napisu).
Zatem najpierw pobierzemy imię od użytkownika, sprawdzimy jego długość i zapiszemy w zmiennej, a później zdecydujemy co mu wyświetlić, na podstawie warunku sprawdzającego czy długość imienia jest odpowiednia.
Tak oto prezentuje się finalny kod, który na podstawie ilości znaków w ciągu znaków, znajdującym się, w obiekcie typu str, na który wskazuje zmienna imie – decyduje jaki komunikat wyświetlić użytkownikowi, po czym go wyświetla.
Natomiast to jeszcze nie wszystko o instrukcjach warunkowych…