Nie rozumiem priorytetów "not" oraz "and"/"or"

Nie rozumiem priorytetów "not" oraz "and"/"or"
CZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 17
0

Mam problem ze zrozumieniem tej instrukcji if not.

Kopiuj
if not True or False:
    print("ok1")

if not False or True:
    print("ok2")

Dlaczego pierwsza instrukcja się nie wyświetla? Czy or nie powinien spowodować że jedna strona zwróci wartość false czyli taką, która zadowoli instrukcję. Jest to dla mnie nowa instrukcja nie moge jej logicznie ogarnać.

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5549
9

Not pewnie neguje tylko najbliższą wartość więc masz napisany odpowiednik:

Kopiuj
if (not True) or False:
    print("ok1")

if (not False) or True:
    print("ok2")

jak chcesz zanegować całość to musisz dodać nawiasy

Kopiuj
if not (True or False):
    print("ok1")

if not (False or True):
    print("ok2")

ogólnie poleca się używanie nawiasów w długich wyrażeniach dla czytelności

CZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 17
0

Dodanie nawiasów nie zmienia nic.

Kopiuj
if not (False and True):
    print("ok1")

if not False and True:
    print("ok2")

Efekt jest dokładnie taki sam. To prawda if not neguje tylko pierwsze wyrażenie ale nawiasy nie zmieniają nic czyli nie wpływają na drugie wyrażenie w ogóle.

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5549
4
czerwonymoskit napisał(a):

Dodanie nawiasów nie zmienia nic.

Kopiuj
if not (False and True):
    print("ok1")

if not False and True:
    print("ok2")

Efekt jest dokładnie taki sam. To prawda if not neguje tylko pierwsze wyrażenie ale nawiasy nie zmieniają nic czyli nie wpływają na drugie wyrażenie w ogóle.

Ale teraz zmieniłeś or na and. jaki jest efekt? Że w obu się wyświetla? No przypadkowo not (False and True) zwraca True i (not False) and True też zwraca True

SA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1452
0

Zmieniles tez OR na AND i wyciagasz zle wnioski. Prawda i fałsz to fałsz.

CZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 17
0

Ok już załapałem. W nawiasach jest wyrażenie jako jedno i jedną wartość logiczną zwraca, a bez nawiasów dwie wartości.

opiszon
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 832
1

Co?
Wyrażenie logiczne zawsze zwraca jedną wartość. Tylko chodzi o kolejność operatorów

CZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 17
0

No może źle się wyraziłem. Chodzi o moment odwrócenia w nawiasach na końcu jest odwrócona wartość całego wyrażenia, a bez nawiasów najpierw wartości są odwracane osobno lub nie i rozpatrywany jest warunek końcowy.

AK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3561
1

Kompilatory niedobre i złośliwe, okazuje się interpretery też

Poczytaj o podstawach logiki jako takiej i w pythonie

CZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 17
0

Nigdzie nie napisałem, że interpretery są nie dobre. Na kompilatory tez nie narzekam tylko na szajs c++. Poczytam.

ledi12
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
1

!= porównuje wartość a is not adres w pamięci (id), to tak w gwoli ścisłości :D

Kopiuj
if not True or False:
    print("ok1")

if not False or True:
    print("ok2")

if True zawsze jest prawdą. To samo działa poprzez negacje if not False. Stąd drugi warunek się printuj, bo spełnione są kryteria (2x true)

AK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3561
0
czerwonymoskit napisał(a):

Nigdzie nie napisałem, że interpretery są nie dobre. Na kompilatory tez nie narzekam tylko na szajs c++.

Na tym etapie - a wyrażnie dałeś pokaz zkresu w jakim sie poruszasz - twoja opinia o jakości designu języków ma dla nas "duze znaczenie"

Poczytam.

Milej lektury i pozytywnego rozwoju

AK
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3561
1

BTW już sam tytuł wątku
Nie ma instrukcji if not
Jest instrukcja if a not jest początkiem wyrażenia logicznego (boolowskiego)

CZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 17
0

Pisząc tytuł tak to błędnie rozumiałem, że jest taka instrukcja i dlatego nie mogłem tego zrozumieć. Teraz wiem, że not przynależy do wyrażenia bool tak jak piszesz i je neguje. Poćwiczyłem i mam to opanowane.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.