Salta al contenuto
Note per Studenti Logica booleana e istruzione if

Logica booleana e istruzione if

In questa pagina 4

Algebra booleana

Variabili con due valori (vero/falso) e tre operatori fondamentali:

AA BB ¬A\lnot A A∧BA \land B A∨BA \lor B A⊕BA \oplus B (xor)
F F V F F F
F V V F V V
V F F F V V
V V F V V F

Leggi di De Morgan: ¬(A∧B)=¬A∨¬B\lnot(A \land B) = \lnot A \lor \lnot B e ¬(A∨B)=¬A∧¬B\lnot(A \lor B) = \lnot A \land \lnot B. Servono per negare una condizione composta:

python
# "x NON è in [0, 10]"
not (0 <= x <= 10)
x < 0 or x > 10          # equivalente per De Morgan

In Python

  • Tipo bool: True, False.
  • Confronti: <, <=, >, >=, ==, !=, e in, not in, is, is not. I confronti si possono concatenare: 0 <= x < 10 significa 0 <= x and x < 10.
  • Logici: not, and, or (precedenza in quest'ordine).

Corto circuito

and e or valutano il secondo operando solo se serve:

  • A and B: se A è falso, B non viene valutato.
  • A or B: se A è vero, B non viene valutato.
python
if i < len(lista) and lista[i] > 0:   # niente IndexError: se i è fuori, il secondo test non parte
    ...
if d != 0 and n / d > 1:              # niente ZeroDivisionError
    ...

and/or restituiscono uno degli operandi, non necessariamente un bool: "" or "default" vale "default".

Truthiness

In un contesto booleano (if, while, and...) ogni oggetto ha un valore di verità. Sono falsi: False, None, 0, 0.0, "", [], (), {}, set(). Tutto il resto è vero.

python
if lista:            # equivale a: if len(lista) > 0
    ...

Istruzione if

python
if voto >= 18:
    esito = "promosso"
elif voto >= 15:
    esito = "orale di recupero"
else:
    esito = "respinto"
  • I rami elif sono controllati nell'ordine; si esegue solo il primo vero.
  • else e elif sono facoltativi.
  • Blocco vuoto: pass.

Espressione condizionale

python
segno = "pari" if n % 2 == 0 else "dispari"
massimo = a if a >= b else b

match (Python ≥ 3.10)

Confronta un valore con dei pattern; utile al posto di lunghe catene di elif sullo stesso valore.

python
match comando:
    case "su" | "w":
        y -= 1
    case "giù" | "s":
        y += 1
    case _:                 # qualunque altro valore
        print("comando sconosciuto")

Errori tipici

  • if x == 1 or 2: è sempre vero (2 è vero). Corretto: if x == 1 or x == 2: oppure if x in (1, 2):.
  • Sequenza di if indipendenti al posto di if/elif: più rami possono scattare.
  • Negare una condizione composta senza applicare De Morgan (negare ogni pezzo lasciando and).
  • Confrontare con == True: basta if cond:.