Instrukcja if w Pythonie jest narzędziem do sterowania działaniem programu – sterowanie odbywa się na podstawie wyników testu, najczęściej testu logicznego lub testu prawdziwości. Instrukcje if należą do instrukcji złożonych, a więc takich, które zawierają inne instrukcje.

Instrukcja if służy do tworzenia logiki programu napisanego w Pythonie. Używamy jej do wybierania działania, jakie ma wykonać program. Instrukcje w programie są domyślnie wykonywane jedna po drugiej, lecz instrukcja if pozwala na wybór działania, które ma być wykonane.

Jak zbudowana jest instrukcja if?

Instrukcja warunkowa składa się z następujących elementów: testu if, jednego lub więcej testów elif oraz bloku else będącego blokiem końcowym. W tym zestawieniu jedynie test if nie jest opcjonalny, umieszczenie w instrukcji pozostałych elementów jest opcjonalne. Testy if oraz blok else składają się z zagnieżdżonych bloków instrukcji, które zawierają odpowiednią ilość wcięć w stosunku do poprzedzającego je wiersza. Jak działa instrukcja if „pod spodem”? Python wykona blok kodu, dla którego test if lub elif będzie prawdą, a jeśli wszystkie są fałszem, wówczas wykona blok else. Ogólny format wygląda następująco:

if test1:

  instrukcja1

elif test2:

  instrukcja2

else:

  instrukcja3

Proste przykłady:

>>> if True:

... print('prawda')

...

prawda

>>> 

>>> if False:

... print('fałsz')

... elif True:

... print('prawda')

...

prawda

Przykład pełnej instrukcji z if, elif oraz else, gdzie 0 zostanie zinterpretowane jako fałsz dla elif, a w instrukcji else nie wykorzystujemy żadnego warunku:

>>> if False:

... print('fałsz')

... elif 0:

... print('również fałsz')

... else:

... print('A to się wykona')

...

A to się wykona

Python wykonuje instrukcje znajdujące się pod pierwszym wierszem, który będzie prawdą, a jeśli żaden z nich nie jest prawdą, wówczas wykonuje instrukcje przypisane do else. W ten sposób konstrukcja-instrukcja if/elif zastępuje instrukcje switch lub case dostępną w innych językach programowania 😉

Tego typu instrukcję można zapisać w kodzie wykorzystującym wszystkie nagłówki typowe dla instrukcji wyboru, a więc if/elif/else:

>>> choice = 1

>>> if choice == 0:

... print('wybór to 0')

... elif choice == 1:

... print('wybór to 1')

... else:

... print('liczba inna niż 0 i 1')

...

wybór to 1

lub za pomocą indeksowania po kluczu w słowniku:

>>> print({1: 'wybór to jeden', 0: 'wybór to 0'}[choice])

wybór to jeden

Jeśli chcemy odzwierciedlić zachowanie klauzuli else za pomocą indeksowania słownika, można skorzystać z metody get(), która podaje wartość domyślną, gdy żaden kluczy ze słownika nie pasuje:

>>> my_dict = {1: 'wybór to jeden', 0: 'wybór to 0'}

>>> print(my_dict.get(choice, 'liczba inna niż 0 i 1'))

wybór to jeden

Testy prawdziwości i testy logiczne w Pythonie – jak ich używać?

Instrukcja if jest instrukcją, która w największej mierze wykorzystuje testy logiczne oraz testy prawdziwości. Żeby poprawnie ich używać, należy zapoznać się z zasadami tego, jak interpretowana jest prawda i fałsz w Pythonie. Reguły są następujące:

  • wszystkie obiekty mają przypisaną wartość logiczną będącą prawdą lub fałszem,
  • wszystkie liczby oprócz zera, a także obiekty, które nie są puste, są uznawane za prawdę,
  • wartość logiczna zera, pustego obiektu oraz None to fałsz,
  • porównania oraz testy wartości zwracają wartości True i False, których odpowiedniki to liczby 1 i 0,
  • dla struktur danych porównania i testów równości są wykonywane za pomocą rekurencji,
  • operatory logiczne and i or zwracają obiekty interpretowane jako prawda lub fałsz.

Ze względu na to, że każdy obiekt w Pythonie jest interpretowany jako fałsz lub prawda, możemy testować je bezpośrednio, a więc w formie if x: …, a nie if x = True: …

Analiza skrótowa obiektów

Dotychczas do sprawdzania prawdziwości danego warunku wykorzystywaliśmy jedynie instrukcję if. Python oferuje jednak bardziej złożone narzędzia, czyli operatory typu boolean: and, or, not. Wyniki działań wykorzystujących operatory logiczne są zakańczone od razu wtedy, gdy znany jest wynik wyrażenia.

X and Y

Wyrażenie jest prawdziwe, gdy oba elementy są prawdziwe.

X or Y

Wyrażenie jest prawdziwe, kiedy przynajmniej jeden element jest prawdziwy.

not X

Wyrażenie jest prawdziwe, gdy X jest fałszem.

Przykład w kodzie:

>>> bool(1 and 0)

False

>>> bool(1 or 0)

True

>>> bool(not 0)

True

X oraz Y mogą mieć przypisaną wartość logiczną lub być wyrażeniem, które taką wartość logiczną zwraca:

>>> (2 < 3) < (3 < 2)

False

Należy jednak pamiętać, że w przypadku porównywania wartości logicznych, a nie wyrażeń, operator nie zwraca wartości True lub False, ale jeden z obiektów. W przypadku operatora or zwracany jest pierwszy element będący prawdą.

>>> 1 or 2

1

>>> 2 or 1

2

Jeśli oba elementy są interpretowane jako fałsz, wówczas zwracany jest drugi obiekt:

>>> 0 or []

[]

Dzieje się tak ponieważ w przypadku instrukcji or ustalenie wyniku jest możliwe już po tym, gdy pierwszy wynik jest prawdą. Odwrotnie jest z kolei w przypadku instrukcji and, gdzie zwracany jest drugi wynik w przypadku operacji zwracającej prawdę lub pierwszy wynik, gdy operacja zwraca fałsz.

>>> 1 and 2, 2 and 1

(2, 1)

>>> 0 and ()

0

Operacjae ogiczne w Pythonie zwracają zatem obiekty, a nie liczbową reprezentacją prawdy lub fałszu. Wyrażenia logiczne są oczywiście stosowane w instrukcji if, ale również while.

Wyrażenie trójargumentowe if/else

Wyrażenia trójargumentowe można skrócić do formy if/else, jeśli instrukcja jest na tyle prosta. Przypatrzmy się poniższemu przykładowi:

>>> if a:

... x = 10

... else:

... x = 5

...

>>> x

5

Instrukcja if jest w tym przypadku na tyle prosta, że można zapisać ją za pomocą jednego wiersza:

>>> x = 10 if a else 5

>>> x

5

Jest to często stosowany skrót, jednak należy wykorzystywać go tylko wtedy, gdy instrukcja if nie jest zagnieżdżona. Trójargumentowe polecenie if przyjmuje zatem następującą formę:

A = Y if X else Z

Zwracanie pierwszego niepustego elementu – analiza skrótowa obiektów 

Operatory logiczne są wykorzystywane również do wykonywania takich czynności jak wybór pierwszego niepustego, a więc będącego prawdą elementu w danym zbiorze. Ogólna postać taki instrukcji wygląda następująco:

X = A or B or C or None

Instrukcja zwraca pierwszy obiekt, który zostanie zinterpretowany jako prawda, jeśli nie znajdzie takiego obiektu, wówczas zwraca None.

>>> A = 0

>>> B = []

>>> C = 1

>>> X = A or B or C or None

>>> X

1

Należy być świadomym tego zachowania zwłaszcza wtedy, gdy w nagłówku instrukcji if wykorzystuje się wyniki zwracane przez funkcję. W poniższym przykładzie, jeśli pierwsza funkcja zwraca wynik interpretowany jako prawda (czyli True, niepusty obiekt lub liczbę inną niż 0 – jeśli funkcja kończy się użyciem funkcji print, to zwraca None), wówczas nie dojdzie do wykonania drugiej funkcji.

if func1() or func2(): pass

W następnym wpisie zajmiemy się pętlami w Pythonie 🙂