4. Instrukcje warunkowe

4.1. ifelifelse

Instrukcje warunkowe pozwalają kierować wykonywanymi instrukcjami pod pewnym warunkiem. Jeżeli kod wpisany po słowie kluczowym if wykona się jako wartość prawdziwa (niezerowa, nie-None, itp.), wykonany zostanie kod pod tym słowem kluczowym.

if True :
     print('this is true')

Do instrukcji warunkowej można dodać słowo kluczowe else. Wtedy, jeżeli wartość przy słowie kluczowym if ewaluuje się jako fałsz, wykonany zostanie kod pod słowem kluczowym else.

if True :
    print('this is true')
else:
    print('this is false')
if name != 'José Jiménez':
     print('this is false')
 else:
     print('this is true')

Możliwe jest także sprawdzenie kilku warunków przed przejściem do else. Do sprawdzenia drugiego i kolejnych warunków służy słowo kluczowe elif (w wielu innych językach rozwijane jako else if).

if name == 'José Jiménez':
     print('My name José Jiménez')
elif name == 'Max Peck':
    print('Your name is Max Peck')
else:
     print('Your name is neither José Jiménez nor Max Peck')
if not 0 <= k <= n:
    raise ValueError('Sample larger than population')

4.2. not, in, is

Słowo kluczowe in pozwala na sprawdzenie czy dana wartość zawiera się w zbiorze (iteratorze).

if name in {'José Jiménez', 'Max Peck'}:
    print('Your name is José Jiménez or Max Peck')
else:
     print('Your name is neither José Jiménez nor Max Peck')

not pozwala zanegować warunek.

if not name == 'José Jiménez':
     print('Not José')
 else:
     print('My name José Jiménez')
if not name:
     print('Name is not set')
 else:
     print('You have set your name')

is porównuje czy dwa obiekty są tożsame.

if name is None:
     print('Name is not set')
 else:
     print('You have set your name')

Bardzo kuszący jest następujący przykład:

if name is 'Max Peck':
     print('You are Max!')
 else:
     print('You are not Max!')

Nie jest on jednak do końca poprawny. Słowo kluczowe ``is`` porównuje czy dwa obiekty są tym samym obiektem, nie czy mają taką samą wartość. Poniższy przykład ilustruje, że pomimo że dwa obiekty przechowują takiego samego stringa to nie są sobie tożsame, mimo że są sobie równe.

a = 'hello'
b = 'hello'

print(f'a is {a}, b is {b}')
print(f'a == b returns: {a==b}')
print(f'a is b returns: {a is b}')

a = 'hello'
b = ''.join('hello')

print(f'a is {a}, b is {b}')
print(f'a == b returns: {a==b}')
print(f'a is b returns: {a is b}')

4.3. Inline if

if '.' in ip:
    protocol = 'ipv4'
else:
    protocol = 'ipv6'

# alternatywnie
protocol = 'ipv4' if '.' in ip else 'ipv6',

4.4. switch statement?!

  • Why switch is bad practise?

    “You can do this easily enough with a sequence of if... elif... elif... else. There have been some proposals for switch statement syntax, but there is no consensus (yet) on whether and how to do range tests. See PEP 275 for complete details and the current status. “

if name == 'José Jiménez':
    print('My name José Jiménez')
elif name == 'Ivan Ivanovic':
    print('Your name is Ivan Ivanovic')
elif name == 'Max Peck':
    print('Your name is Max Peck')
else:
     print('Your name is other')
switch = {
    'a': 1,
    'b': 2,
}

switch['a']
choices = {'a': 1, 'b': 2}
key = 'a'

result = choices.get(key, 'default value when key is not found')
def switch(key):
    return {
        'a': 1,
        'b': 2,
    }.get(key, 'default value')

switch('a')  # 1
switch('x')  # 'default value'

4.5. Zadania kontrolne

4.5.1. Zmienne i wczytywanie ciągu od użytkownika

  1. Napisz program, który poprosi użytkownika o wiek i wyświetli wartość.
  2. Następnie sprawdzi pełnoletność i wyświetli informację czy osoba jest “dorosła” czy “niepełnoletnia”.
Co zadanie sprawdza?:
 
  • Wczytywanie ciągu znaków od użytkownika
  • Rzutowanie i konwersja typów
  • Instrukcje warunkowe
  • Sprawdzanie przypadków brzegowych (niekompatybilne argumenty)
  • Definiowanie zmiennych i stałych w programie