Podstawowa różnica między statement, a expression bierze sie z definicji tych obiektów:
– statement – coś robi i niekoniecznie cokolwiek zwraca. Przykładem statement jest pass i przypisanie wartości do zmiennych
– expression – to jest jedna lub więcej instrukcji, które coś zwracają. Przykładem expression jest np dowolny napis, dowolne obliczenie, ale też np. polecenie print (!!!)
Rozważmy taki kod:
1 2 3 |
price = 10 bonus = 1 bonus_granted = True |
Jak sprawdzić czy coś jest expression? Prosto. Do zmiennej przypisz wynik wykonania polecenia, np.:
1 2 |
x = print('Hello') print("x = {}".format(x)) |
zwracany wynik to
1 2 |
Hello x = None |
Widać więc, że print (chociaż głównie kojarzy nam się z robieniem czegoś – wyświetlaniem napisu) jest też expression, bo ma wartość None.
Trochę inaczej jest tu:
1 2 |
x = pass print("x = {}".format(x)) |
oto wynik:
1 2 3 4 |
File "C:/temp/tests.py", line 18 x = pass ^ SyntaxError: invalid syntax |
Niestety – pass tylko coś robi (dokładniej rzecz biorąc „robi nic”), kompletnie nic nie zwraca, nawet None (!!!!)
Podobnie jest z przypisaniem:
1 2 |
x = (y=6) print("x = {}".format(x)) |
też błąd:
1 2 3 4 |
File "C:/temp/tests.py", line 21 x = (y=6) ^ SyntaxError: invalid syntax |
Przypisanie się wykonuje, ale podobnie jak poprzednio kompletnie nic nie zwraca.
No i po tym wstępie mogę tłumaczyć dlaczego nie zadziałało if 🙂
Wyrażenie if zapisane w postaci jednolinijkowca musi być wyrażeniem. Pierwsze polecenie:
1 |
print(price-bonus) if bonus_granted else price = 200 |
nie jest wyrażeniem, bo o ile jeszcze print coś zwraca (None), o tyle druga część z przypisaniem nic nie zwraca. Stąd błąd
Podobnie będzie tu:
1 |
print(price-bonus) if bonus_granted else pass |
Ale za to tutaj już tego problemu nie ma, bo tu zawsze uzyskasz wyrażenie:
1 |
print(price-bonus) if bonus_granted else print(price) |
Co ciekawe, jeśli wynik tego wyrażenia chcesz zapisać w zmiennej:
1 2 |
x = print(price-bonus) if bonus_granted else print(price) print("x = {}".format(x)) |
to okaże się, że jej wartość to None:
1 2 |
9 x = None |
Więcej na ten temat można poczytać też tu (j.ang):
Mam nadzieję, że udało mi się rozwiać wątpliwości!