Lezione 5: Operatori aritmetici, logici e di confronto

Avanzamento corso: Lezione 5

Benvenuto/a! In questa lezione impari gli operatori aritmetici, logici e di confronto in Python, fondamentali per scrivere espressioni, calcolare risultati e prendere decisioni nel codice. Useremo esempi chiari, best practice e mini-esercizi per fissare i concetti 🎯


Indice del corso

  1. Introduzione a Python e primo script (ripasso)
  2. Variabili e tipi di dato (ripasso)
  3. Input da tastiera e output (ripasso)

🔗 Ripassi consigliati:
• Lezione 2 – Primo script Python: Hello, Python! → https://www.saperesemplice.com/primo-script-python-hello/
• Lezione 3 – Variabili e tipi di dato → https://www.saperesemplice.com/variabili-tipi-dato-python/
• Lezione 4 – Input e output in Python → https://www.saperesemplice.com/lezione-3-input-output-python/


Dettagli lezione

⏱️ Tempo stimato: 20–25 minuti
🧩 Difficoltà: Facile
🎯 Obiettivi specifici

  • Riconoscere e usare correttamente + – * / // %.
  • Comprendere == != > < <= >= e i confronti concatenati.
  • Applicare and / or / not con short-circuit e concetto di truthiness.
  • Evitare errori comuni (divisione intera vs reale, confronto tra float, uso improprio di is).

🔢 Operatori aritmetici in Python

Gli operatori aritmetici più usati sono:

  • + addizione
  • - sottrazione
  • * moltiplicazione
  • / divisione reale (ritorna sempre float)
  • // divisione intera (floor division)
  • % modulo (resto)

ℹ️ Nota: In Python, / produce un float anche se dividend e divisore sono interi, mentre // applica la floor division al risultato (arrotonda verso il basso il quoziente). Approfondimento ufficiale → https://docs.python.org/3/reference/expressions.html#binary-arithmetic-operations

Esempi veloci

print(7 + 3)       # 10
print(7 - 3)       # 4
print(7 * 3)       # 21
print(7 / 3)       # 2.3333333333333335 (float)
print(7 // 3)      # 2 (floor division)
print(7 % 3)       # 1 (remainder)

🔶 Esempio pratico 1 — Scontrino semplice

price = 5.5
qty = 3
subtotal = price * qty
vat = 0.22
print(f"Subtotal: {subtotal}")
print(f"VAT: {subtotal * vat}")
print(f"Total: {subtotal * (1 + vat)}")

🔶 Esempio pratico 2 — Suddivisione in gruppi

people = 29
group_size = 6
full_groups = people // group_size
leftover = people % group_size
print(f"Full groups: {full_groups}")
print(f"Leftover people: {leftover}")

💡 Suggerimento: x == (x // y) * y + (x % y) (identità tra divisione intera e modulo). Fonte ufficiale → https://docs.python.org/3/reference/expressions.html#binary-arithmetic-operations

🧠 Precedenza e parentesi

*, /, //, % hanno precedenza più alta di + e -. Usa sempre le parentesi per rendere le intenzioni chiare. Tabella di riferimento → https://www.programiz.com/python-programming/precedence-associativity

print(10 - 4 * 2)   # 2 (prima 4*2 → 8; poi 10-8)
print((10 - 4) * 2) # 12 (parentesi cambiano l'ordine)

⚠️ Errore comune da evitare
Confondere / con //. La prima è divisione reale (ritorna float), la seconda floor division (taglia la parte decimale, tenendo conto del segno). Con numeri negativi, // arrotonda verso -∞.

print(-7 // 3)  # -3 (non -2)
print(-7 % 3)   # 2  (il resto ha lo stesso segno del divisore)

Riferimento: documentazione Python su divisione e modulo → https://docs.python.org/3/reference/expressions.html#binary-arithmetic-operations

Domanda per te: in quali casi preferiresti // rispetto a / in un programma “reale” (ad es. paginazione, turni, lotti)?


🔍 Operatori di confronto in Python

Gli operatori di confronto valutano relazioni tra valori e ritornano un booleano (True/False):

  • == uguale a
  • != diverso da
  • > maggiore di
  • < minore di
  • >= maggiore o uguale
  • <= minore o uguale
print(5 == 5)   # True
print(5 != 3)   # True
print(7 > 10)   # False
print(2 <= 2)   # True

Confronti concatenati

In Python puoi concatenare i confronti per leggibilità:

x = 7
print(5 < x < 10)       # True (equivale a 5 < x and x < 10)
print(5 < x <= 7)       # True

Uguaglianza vs identità

  • == confronta i valori.
  • is confronta l’identità dell’oggetto (stesso oggetto in memoria).
a = [1, 2]
b = [1, 2]
print(a == b)  # True (stesso contenuto)
print(a is b)  # False (oggetti diversi)

ℹ️ Approfondimenti ufficiali: comparisons, membership e identity → https://docs.python.org/3/reference/expressions.html#comparisons

⚠️ Attenzione ai float

Con i numeri in virgola mobile, == può essere inaffidabile per via dell’aritmetica in base 2. Meglio confrontare con una tolleranza:

x = 0.1 + 0.2
print(x == 0.3)                 # False in molti casi
import math
print(math.isclose(x, 0.3, rel_tol=1e-9, abs_tol=1e-12))  # True

Domanda per te: quando ha senso usare is al posto di == (pensa a None)? Scrivi un esempio.


🧠 Operatori logici in Python: and, or, not

Truthiness: in contesti booleani, sono considerati falsy: False, None, zeri numerici e contenitori vuoti ("", [], {}, set(), range(0)). Tutto il resto è truthy.
Short-circuit:

  • x and y valuta x; se falsy ritorna x, altrimenti valuta e ritorna y.
  • x or y valuta x; se truthy ritorna x, altrimenti valuta e ritorna y.
  • not x ritorna un vero booleano.

Fonte ufficiale (boolean operations e truth value testing) → https://docs.python.org/3/reference/expressions.html#boolean-operations e https://docs.python.org/3/library/stdtypes.html#truth

# Short-circuit examples
user_input = ""
name = user_input or "Anonymous"   # returns "Anonymous" if empty
print(name)

is_member = True
has_coupon = False
discount = 0.2 if (is_member and not has_coupon) else 0.1
print(discount)

🔶 Esempio pratico 3 — Validazione semplice

age = 21
has_id = True
print(age >= 18 and has_id)  # True → can enter

email = ""
print(email or "[email protected]")  # fallback if empty

Domanda per te: spiega con parole tue perché "" or "default" restituisce sempre "default", mentre "name" or "default" restituisce "name".


📖 Sezione teorica

  • Aritmetici: + - * / // %
  • Confronto: == != > < <= >= (confronti concatenati supportati)
  • Logici: and or not con short-circuit e ritorno dell’operando valutato (non sempre True/False per and/or).
  • Precedenza: aritmetici > confronto > logici (usa parentesi!).
  • Best practice: attenzione a float con ==, preferisci math.isclose quando serve.

🔗 Riferimenti utili e affidabili:
• Espressioni, aritmetica, confronto, logica → https://docs.python.org/3/reference/expressions.html
• Truthiness e valori falsy/truthy → https://docs.python.org/3/library/stdtypes.html#truth
• Approfondimenti didattici → https://www.programiz.com/python-programming/operators


🔶 Esempi pratici guidati

1) Calcolatrice tascabile (solo +, -, *, /)

a = 12
b = 5
print(f"Add: {a + b}")
print(f"Sub: {a - b}")
print(f"Mul: {a * b}")
print(f"Div: {a / b}")

2) Paginazione risultati

total_items = 53
per_page = 10
pages = total_items // per_page
has_remainder = (total_items % per_page) != 0
print(f"Pages: {pages + (1 if has_remainder else 0)}")

3) Sconto con condizioni logiche

is_member = True
cart_total = 85
extra_coupon = False
apply_discount = (is_member and cart_total >= 50) or extra_coupon
print(f"Discount applied? {apply_discount}")

4) Confronto concatenato

score = 72
print(60 <= score < 90)  # True → within range

📚 Glossario tecnico

  • Floor division (//): divisione con arrotondamento per difetto (verso −∞).
  • Modulo (%): resto della divisione; ha lo stesso segno del divisore.
  • Short-circuit: valutazione interrotta appena l’esito è determinato.
  • Truthiness/Falsiness: regole con cui oggetti vengono interpretati come veri/falsi in contesto booleano.
  • Confronti concatenati: forma compatta es. a < b < c.

📝 Esercizio finale

Scrivi uno script che chieda (puoi simulare con variabili) il totale carrello e lo stato utente, poi calcoli il prezzo finale.

Requisiti:

  1. Se l’utente è membro e il carrello è >= 100, applica 20%; se >= 50, 10%; altrimenti 0%.
  2. Se l’utente non è membro ma ha codice promo, applica 5%.
  3. Stampa ricevuta con subtotal, discount, final total.

Schema d’aiuto (esempio):

is_member = True
cart = 75.0
has_coupon = False

# Your code here...

Extra: assicurati che qualsiasi stringa vuota per il codice sconto venga sostituita con un valore di fallback usando or.


🧠 Quiz finale

Non guardare le risposte subito! Sono più sotto 👇

  1. Cosa restituisce 7 / 2?
    A) 3 · B) 3.0 · C) 3.5
  2. Qual è il risultato di -7 // 3?
    A) -2 · B) -3 · C) 2
  3. Quale espressione è equivalente a 5 < x < 10?
    A) (5 < x) and (x < 10) · B) (5 < x) or (x < 10) · C) x > 5 or x < 10
  4. Cosa fa not True?
    A) True · B) False · C) None
  5. Cosa ritorna "" or "default"?
    A) "" · B) False · C) "default"
  6. Per confrontare float in modo affidabile cosa useresti?
    A) == diretto · B) math.isclose · C) is
  7. Qual è la differenza tra == e is?
    A) Nessuna · B) Valore vs identità oggetto · C) Tipo vs valore
  8. Con and/or Python restituisce sempre True/False?
    A) Sì · B) No, può restituire un operando · C) Solo con and

❓ FAQ

1) and/or restituiscono booleani?
Non necessariamente: con short-circuit possono restituire l’ultimo operando valutato (es. s or "foo").

2) Meglio == o is per None?
Usa is/is not per None (identità), es. if x is None:.

3) Perché 7 / 2 → 3.5?
Perché / fa divisione reale e ritorna float.

4) Come funziona il resto con numeri negativi?
Il risultato di x % y ha lo stesso segno di y (divisore).

5) Posso concatenare più di due confronti?
Sì, a < b < c < d è valido e leggibile.



Esterni autorevoli
• Espressioni (aritmetici, confronto, logici) – Documentazione Python: https://docs.python.org/3/reference/expressions.html
• Truth value testing – Tipi built-in: https://docs.python.org/3/library/stdtypes.html#truth
• Panoramica su operatori e precedenza (guida didattica): https://www.programiz.com/python-programming/operators

Interni SapereSemplice
• Lezione 2 – Primo script Python: https://www.saperesemplice.com/primo-script-python-hello/
• Lezione 3 – Variabili e Tipi di Dato: https://www.saperesemplice.com/variabili-tipi-dato-python/
• Lezione 4 – Input e Output: https://www.saperesemplice.com/lezione-3-input-output-python/
• Percorso “Corsi Python – Programmare da zero”: https://www.saperesemplice.com/corsi-informatica/corsi-di-informatica-python/



🔁 Collegamento alla lezione successiva

➡️ Prosegui alla Lezione 6: Condizioni con if, else e elif
(Il link verrà inserito non appena l’articolo sarà online.)


🗨️ Hai dubbi? Lascia un commento!
📩 Vuoi il PDF della lezione? Scrivici!
🔗 Condividi con un compagno di corso.


🧪 Risposte del quiz (mostra solo dopo aver provato)

  1. C
  2. B
  3. A
  4. B
  5. C
  6. B
  7. B
  8. B

🗓️ Changelog

📅 Aggiornato il 19/08/2025 –

Lascia un commento