Operatori Python: aritmetica, divisione // e %, confronto, and/or/not e python round
L'operatore / in Python restituisce sempre un float, // dà la parte intera con arrotondamento verso il basso, % il resto, ** la potenza. La funzione round(x, n) arrotonda a n cifre con il metodo bancario: round(2.5) dà 2, round(3.5) dà 4; per arrotondare verso l'alto o il basso a un intero si usano math.ceil e math.floor, il valore assoluto si ottiene con abs.
Gli operatori Python sono simboli che trasformano valori in nuovi valori: + somma, // esegue la divisione intera, and combina condizioni. Qui sotto trovate l'elenco completo degli operatori con esempi, la differenza tra / e //, la logica di and, or, not e le funzioni di arrotondamento: python round, math.ceil, math.floor e abs. Tutti gli esempi si possono incollare nella REPL e verificare.
Elenco degli operatori Python
Gli operatori si dividono in gruppi in base allo scopo. Non serve memorizzare l'intera tabella: nel codice reale si incontrano più spesso l'aritmetica, i confronti e i connettivi logici.
| Gruppo | Operatori | Esempio |
|---|---|---|
| Aritmetici | + - * / // % ** | 7 // 2 → 3 |
| Confronto | == != < > <= >= | 3 < 5 → True |
| Logici | and or not | not True → False |
| Identità | is, is not | x is None |
| Appartenenza | in, not in | "ca" in "caffè" → True |
| Assegnazione | = += -= *= /= //= %= **= | total += 250 |
| Walrus | := | if (n := len(s)) > 10: |
| Bit a bit | & | ^ ~ << >> | 5 & 3 → 1 |
Operatori aritmetici
Addizione, sottrazione e moltiplicazione funzionano come a scuola. Se nell'espressione compare almeno un float, anche il risultato sarà float: 2 + 1.0 dà 3.0. I numeri interi in Python non vanno in overflow — 2 ** 100 viene calcolato con precisione, qualunque sia il numero di cifre.
>>> 250 + 120
370
>>> 12.5 * 3
37.5
>>> 2 ** 10
1024
>>> 2 ** 0.5
1.4142135623730951
Potenza in Python: l'operatore **
L'elevamento a potenza si scrive con due asterischi, non con ^: in Python il simbolo ^ è lo XOR bit a bit, quindi 2 ^ 3 restituisce 1, non 8. Una potenza frazionaria dà la radice: 9 ** 0.5 è 3.0. Esiste anche la funzione pow(x, y), uguale all'operatore, con un terzo argomento per il resto: pow(2, 10, 1000) restituisce 24.
Attenzione alla precedenza: ** viene eseguito prima del meno unario, quindi -2 ** 2 è -4. Se serve il quadrato di un numero negativo, usate le parentesi: (-2) ** 2.
Divisione in Python: /, // e %
In Python ci sono due tipi di divisione, ed è la fonte principale di sorprese per i principianti. La divisione normale / restituisce sempre un float, anche quando la divisione è esatta. La divisione intera // scarta la parte decimale, mentre % restituisce il resto.
>>> 7 / 2
3.5
>>> 8 / 2
4.0
>>> 7 // 2
3
>>> 7 % 2
1
Divisione intera // e resto %: esempi pratici
La coppia // e % risolve i problemi del tipo «quante unità intere e quanto avanza». Nel corso il tracker delle spese conserva il denaro in centesimi per non perdere precisione e scompone l'importo in euro e centesimi:
cents = 125050 # conserviamo il denaro in centesimi
eur = cents // 100 # 1250 — euro interi
cent = cents % 100 # 50 — resto
print(eur, cent) # 1250 50
print(40 // 7, "settimane e", 40 % 7, "giorni") # 5 settimane e 5 giorni
Entrambe le operazioni insieme le restituisce la funzione integrata divmod: divmod(125050, 100) dà la tupla (1250, 50). Il resto serve anche per verificare la parità: n % 2 == 0 è vero per i numeri pari.
Numeri negativi: // arrotonda verso il basso
L'operatore // non si limita a scartare la parte decimale, ma arrotonda verso il basso, cioè verso meno infinito. Per i numeri positivi non c'è differenza, per i negativi sì. Il segno del resto % in Python coincide con il segno del divisore, quindi vale sempre l'uguaglianza a == (a // b) * b + a % b.
>>> -7 // 2
-4
>>> -7 % 2
1
>>> int(-7 / 2) # scarta la parte decimale, non arrotonda verso il basso
-3
Divisione per zero: quale errore
La divisione per zero con uno qualsiasi dei tre operatori genera l'eccezione ZeroDivisionError. Vale sia per i numeri interi sia per quelli decimali. Si può intercettarla con try/except oppure controllare prima il divisore.
>>> 10 / 0
Traceback (most recent call last):
...
ZeroDivisionError: division by zero
>>> count = 0
>>> avg = 1500 / count if count else 0
>>> avg
0
Operatori di confronto
I confronti restituiscono True oppure False. L'uguaglianza si verifica con due segni ==, mentre un singolo = è un'assegnazione. Le stringhe si confrontano carattere per carattere in base ai codici dei simboli, quindi "B" < "a" è vero: le maiuscole vengono prima delle minuscole.
>>> 250 == 250.0
True
>>> 3 != 4
True
>>> 1 < 5 <= 10 # catena: 1 < 5 and 5 <= 10
True
>>> 0.1 + 0.2 == 0.3
False
Le catene di confronto come 0 <= x < 100 sono una comodità di Python: non serve scrivere and. L'ultima riga ricorda l'errore di precisione dei numeri decimali: 0.1 + 0.2 dà 0.30000000000000004. I numeri decimali si confrontano con math.isclose(a, b), mentre il denaro va conservato in centesimi o in Decimal.
Operatori logici and, or, not
Gli operatori logici in Python si scrivono con parole, non con i simboli && e || degli altri linguaggi. and è vero quando sono veri entrambi gli operandi, or quando è vero almeno uno, not inverte il valore.
| a | b | a and b | a or b | not a |
|---|---|---|---|---|
| True | True | True | True | False |
| True | False | False | True | False |
| False | True | False | True | True |
| False | False | False | False | True |
Precedenza: prima not, poi and, poi or. L'espressione True or False and False è True, perché and viene valutato per primo. Nelle condizioni complesse usate le parentesi: così è più chiaro sia a voi sia ai colleghi.
Che cosa restituiscono davvero and e or
and e or non restituiscono necessariamente True o False, ma uno dei due operandi. or dà il primo valore vero (o l'ultimo, se non ce ne sono), and il primo falso (o l'ultimo). Sono considerati falsi 0, 0.0, la stringa vuota, le collezioni vuote, None e False.
>>> name = ""
>>> name or "Ospite"
'Ospite'
>>> 5 and 0
0
>>> not ""
True
La valutazione è pigra: se il risultato è chiaro dalla parte sinistra, quella destra non viene calcolata. Per questo count and total / count non genera un errore di divisione per zero quando count == 0. L'operatore not, a differenza degli altri due, restituisce sempre un bool.
Operatori is e in
== confronta i valori, mentre is verifica che due nomi puntino allo stesso oggetto. Due carrelli vuoti diversi sono uguali, ma non sono lo stesso oggetto. L'unico uso in cui is serve sempre è il controllo di None: if x is None.
>>> a = [250, 120]
>>> b = [250, 120]
>>> a == b, a is b
(True, False)
>>> c = a
>>> c is a
True
Non confrontate numeri e stringhe con is: a volte «funziona» grazie alla cache interna degli oggetti, ma il risultato dipende dall'implementazione, e Python segnala con SyntaxWarning costrutti come x is 5.
L'operatore in verifica l'appartenenza: una sottostringa in una stringa, un elemento in una lista, una chiave in un dizionario. not in è la verifica inversa.
>>> "caffè" in "caffè con latte"
True
>>> "cibo" in {"cibo": 450, "taxi": 300}
True
>>> 5 not in [1, 2, 3]
True
Operatori di assegnazione e operatore walrus :=
Gli operatori composti +=, -=, *=, //= e gli altri sono una scorciatoia: total += 250 significa total = total + 250. In Python non esistono gli operatori ++ e --: x++ provoca un errore di sintassi.
L'operatore walrus := (chiamato così per la somiglianza con il muso e le zanne del tricheco) assegna un valore direttamente dentro un'espressione. È utile quando il valore serve sia per la verifica sia per l'uso successivo:
items = ["caffè", "taxi", "pranzo", "cinema"]
if (n := len(items)) > 3:
print(f"Troppe spese: {n}")
while (line := input("Importo: ")) != "":
print(int(line) * 2)
Senza il walrus bisognerebbe chiamare len due volte oppure mettere l'assegnazione su una riga separata. Non abusatene: se la riga diventa illeggibile, meglio una normale assegnazione.
Arrotondamento in Python: round, ceil, floor
Per arrotondare in Python ci sono la funzione integrata round e le funzioni del modulo math. Risolvono compiti diversi, e confonderle è un errore frequente.
| Funzione | Che cosa fa | 2.5 | -2.5 | 2.7 |
|---|---|---|---|---|
round(x) | al più vicino, la metà va al pari | 2 | -2 | 3 |
math.floor(x) | verso il basso, verso meno infinito | 2 | -3 | 2 |
math.ceil(x) | verso l'alto, verso più infinito | 3 | -2 | 3 |
math.trunc(x), int(x) | scarta la parte decimale, verso lo zero | 2 | -2 | 2 |
La funzione round in Python e l'arrotondamento bancario
La funzione round(x, n) arrotonda a n cifre dopo la virgola; senza il secondo argomento restituisce un int. La trappola principale: python round arrotonda con il metodo «bancario», cioè la metà va al pari più vicino. Per questo round(2.5) dà 2, mentre round(3.5) dà 4. Così, nei calcoli su grandi quantità, gli errori di arrotondamento non si accumulano in un'unica direzione.
>>> round(2.5), round(3.5)
(2, 4)
>>> round(3.14159, 2)
3.14
>>> round(1250, -2) # alle centinaia
1200
>>> round(2.675, 2) # non 2.68: in binario è 2.67499...
2.67
Se serve l'arrotondamento scolastico «la metà verso l'alto», per esempio in uno scontrino, usate Decimal con la modalità ROUND_HALF_UP. Passate il numero come stringa, per non ereditare l'errore del float:
>>> from decimal import Decimal, ROUND_HALF_UP
>>> Decimal("2.5").quantize(Decimal("1"), ROUND_HALF_UP)
Decimal('3')
>>> Decimal("2.675").quantize(Decimal("0.01"), ROUND_HALF_UP)
Decimal('2.68')
E ancora una regola dal corso: arrotondate solo in fase di output. Per la stampa elegante non serve round — basta una f-string: f"{amount:.2f}" mostra due cifre, mentre il valore resta esatto.
math.ceil e math.floor: arrotondamento verso l'alto e verso il basso
math.ceil serve quando arrotondare per difetto non è ammesso: quanti autobus ordinare, quante pagine di risultati. math.floor serve quando si contano solo le unità complete. Entrambe restituiscono un int.
import math
guests = 47
seats = 20
print(math.ceil(guests / seats)) # 3 autobus
print(math.floor(9.99)) # 9
print(-(-guests // seats)) # 3 — ceil senza math, trucco con //
Nel modulo math ci sono altre funzioni utili: math.sqrt (radice), math.isclose (confronto di decimali), math.pi, math.gcd. In Python 3.15 è comparso il sottomodulo math.integer (PEP 791) per la matematica intera: contiene comb, factorial, gcd, isqrt, lcm, perm, mentre le vecchie math.gcd e le altre continuano a funzionare.
Funzione abs: valore assoluto
abs(x) restituisce il valore assoluto — la distanza dallo zero senza segno. Non serve importare nulla, la funzione è integrata. Funziona con interi, decimali e perfino con numeri complessi: per 3+4j restituisce la lunghezza del vettore, cioè 5.0.
>>> abs(-250)
250
>>> abs(-12.5)
12.5
>>> budget, spent = 5000, 5320
>>> abs(budget - spent) # di quanto abbiamo sforato
320
L'uso tipico è la differenza senza considerare la direzione e il confronto con una tolleranza: abs(a - b) < 0.001. Per i decimali è più affidabile math.isclose, perché tiene conto della scala dei numeri.
Precedenza degli operatori
Quando in un'espressione ci sono più operatori, Python li esegue in base alla precedenza, dalla più alta alla più bassa:
**- unari
-x,+x,~x * / // %+ -- shift e operazioni bit a bit
- confronti,
in,is notandor:=
Quindi 2 + 3 * 4 vale 14, mentre (2 + 3) * 4 vale 20. Nel dubbio mettete le parentesi: quelle in più non costano nulla, mentre un errore di precedenza si cerca a lungo.
Errori frequenti con gli operatori
| Errore | Che cosa succede | Come va scritto |
|---|---|---|
if x = 5: | SyntaxError: è un'assegnazione | if x == 5: |
2 ^ 3 al posto della potenza | XOR bit a bit, risultato 1 | 2 ** 3 |
si aspetta un intero da 8 / 2 | ottiene 4.0 | 8 // 2 |
x == 1 or 2 | sempre vero: or 2 | x in (1, 2) |
si aspetta 3 da round(2.5) | l'arrotondamento bancario dà 2 | Decimal con ROUND_HALF_UP |
"5" + 5 | TypeError | int("5") + 5 |
Riepilogo
Ricordate l'essenziale: / dà sempre un float, // arrotonda verso il basso, % restituisce il resto con il segno del divisore, e la potenza è **. I logici and, or, not si scrivono come parole e si valutano in modo pigro, is serve per il controllo di None. La funzione python round arrotonda al pari, per l'arrotondamento verso l'alto e verso il basso ci sono math.ceil e math.floor, il valore assoluto si ottiene con abs. Nel corso questi operatori si esercitano sul campo, nel tracker delle spese dove il denaro è conservato in centesimi.
Domande frequenti
Come arrotondare un numero a due cifre decimali in Python?
Usate round(x, 2); se vi serve solo stampare il numero in modo leggibile, usate la f-string f"{x:.2f}", che non modifica il valore.
Perché round(0.5) in Python restituisce 0?
Perché round arrotonda la metà al numero pari più vicino, e 0 è pari; allo stesso modo round(1.5) e round(2.5) danno 2.
Come ottenere la parte intera di una divisione in Python?
Con l'operatore //: 17 // 5 restituisce 3. Con i numeri negativi arrotonda verso il basso, quindi -17 // 5 dà -4; se volete scartare la parte decimale verso lo zero, usate int(-17 / 5).
Python ha l'operatore ternario?
Sì, è l'espressione condizionale: valore_se_vero if condizione else valore_se_falso, per esempio "pari" if n % 2 == 0 else "dispari".
Qual è la differenza tra & e and in Python?
and è un operatore logico con valutazione pigra, mentre & è l'AND bit a bit per i numeri e l'intersezione per gli insiemi; nelle condizioni if usate and.
Questo argomento è trattato in modo approfondito, con pratica, nel corso «Python 3.15: от новичка до профи».
Vai al corso