Aritmetica — divisioni, resti e la trappola del decimale
I sette operatori aritmetici, quale viene prima, dove sono utili la divisione intera e il resto, e perché a volte i decimali rispondono in modo strano.
Come vuoi imparare?
Il problema che stiamo risolvendo
Ci sono 17 libri e una scatola ne contiene 5. Quante scatole, e quanti libri restano fuori?
La risposta non è 17 / 5. Quello dà 3.4, e 3.4 scatole non esistono. Servono due risposte separate: quante intere e quanto resta. Python ha un operatore per ciascuna, e quei due si rivelano tra i più utili che imparerai — la paginazione, dividere i secondi in ore e minuti, verificare se un numero è pari: tutto nasce da qui.
C'è una seconda cosa che ferma tutti la prima volta che la vedono: in Python 0.1 + 0.2 non dà 0.3. Perché accade e come ovviare al problema è spiegato in questo capitolo.
Alla fine di questo capitolo sarai in grado di
- Usare i sette operatori aritmetici
- Dire quale calcolo viene prima e quando servono le parentesi
- Riconoscere dove
//e%sono lo strumento giusto - Spiegare perché
/produce sempre un decimale, anche quando la divisione è esatta - Scrivere calcoli che rispettino i limiti di precisione dei numeri decimali
Prerequisiti: Variabili e tipi.
I sette operatori
print(10 + 3)
print(10 - 3)
print(10 * 3)
print(10 / 3)
print(10 // 3)
print(10 % 3)
print(10 ** 3)13
7
30
3.3333333333333335
3
1
1000Gli ultimi tre meritano una parola:
//— divisione intera. Divide e tiene la parte intera, scartando il resto%— modulo, il resto. Ciò che resta dopo la divisione**— potenza.10 ** 3è dieci al cubo
/produce sempre un decimale. Anche10 / 5restituisce2.0, non2. Se il tipo dipendesse dal fatto che la divisione risulti esatta, il comportamento di un programma sarebbe imprevedibile, quindi Python mantiene una regola sola:/significafloat. Quando ti serve un numero intero, usa//.
Risolvere il problema delle scatole
books = 17
per_box = 5
full_boxes = books // per_box
left_over = books % per_box
print("Full boxes:", full_boxes)
print("Left over :", left_over)Full boxes: 3
Left over : 2Tre scatole si riempiono e 2 libri restano fuori. // e % vanno insieme: il primo indica quante scatole piene, il secondo indica quanti libri restano.
La stessa coppia compare in molti altri posti:
total_seconds = 500
minutes = total_seconds // 60
seconds = total_seconds % 60
print(minutes, "min", seconds, "sec")8 min 20 secE % è il modo per verificare pari e dispari. Dividi un numero qualunque per 2 e il resto è 0 (pari) oppure 1 (dispari):
print(14 % 2)
print(15 % 2)0
1Quel resto è proprio quello su cui si baserà un capitolo successivo sulle condizioni (if).
Quale calcolo viene prima
Python segue le regole ordinarie dell'aritmetica — moltiplicazione e divisione prima di addizione e sottrazione:
print(10 + 5 * 2)
print((10 + 5) * 2)20
30Nella prima riga 5 * 2 è avvenuto per primo, poi è stato sommato 10. Nella seconda le parentesi hanno cambiato l'ordine.
Da più alta a più bassa:
***,/,//,%+,-
print(2 + 3 * 4 ** 2)504 ** 2 fa 16, poi 3 * 16 fa 48, poi 2 + 48 fa 50.
In caso di dubbio, usa le parentesi. Anche conoscendo le regole,(a + b) / 2è meglio scritto così chea + b / 2— chi leggerà dopo non dovrà ricordarsi nessuna regola. Parentesi in più non rallentano il codice; lo rendono solo più chiaro.
È l'errore dei principianti più comune in assoluto, e compare quando si calcola una media:
a = 10
b = 20
c = 30
wrong = a + b + c / 3
right = (a + b + c) / 3
print("Wrong:", wrong)
print("Right:", right)Wrong: 40.0
Right: 20.0Il programma non ha lanciato alcun errore. Niente di rosso, niente rotto — solo una risposta sbagliata. È la classe di bug più pericolosa che ci sia, perché Python non ti avvisa. Solo controllando tu stesso l'aritmetica la scopri.
La trappola del decimale
print(0.1 + 0.2)0.30000000000000004Non è colpa di Python. I computer memorizzano i numeri in base due, e 0.1 non si può scrivere esattamente in base due — proprio come 1/3 non si può scrivere esattamente in decimale, dove 0.3333... va avanti per sempre. Quindi il computer salva qualcosa di estremamente vicino, e sommarne due rende visibile la minuscola differenza. JavaScript, Java e C si comportano tutti nello stesso modo.
Due conseguenze pratiche:
Una — arrotonda quando mostri:
total = 0.1 + 0.2
print(round(total, 2))0.3round(total, 2) significa mantenere due cifre dopo il punto decimale.
Due — non confrontare mai due decimali con ==:
print(0.1 + 0.2 == 0.3)FalseQuesta è la trappola che produce risposte sbagliate nei calcoli finanziari. I progetti seri non tengono i soldi in un float — memorizzano l'unità più piccola come numero intero (49.99 diventa 4999), oppure usano il modulo a parte decimal. Per ora sappi solo dove sta il limite; i moduli arrivano più avanti.
Un esempio completo
packing.py:
# Work out packing and shipping for one order
total_items = 47
items_per_box = 6
box_cost = 35.5
full_boxes = total_items // items_per_box
loose_items = total_items % items_per_box
# A partly filled box still costs a full box
boxes_needed = full_boxes
if loose_items > 0:
boxes_needed = full_boxes + 1
shipping = boxes_needed * box_cost
print("Items :", total_items)
print("Full boxes :", full_boxes)
print("Loose items :", loose_items)
print("Boxes needed :", boxes_needed)
print("Shipping :", round(shipping, 2))Items : 47
Full boxes : 7
Loose items : 5
Boxes needed : 8
Shipping : 284.0La riga if non è ancora stata spiegata — è a quello che servono i prossimi pochi capitoli. Per ora leggila e basta: se restano oggetti sfusi, serve una scatola in più.
Quando qualcosa va storto
ZeroDivisionError: division by zero Qualcosa è stato diviso per zero. Anche in matematica è indefinito, quindi Python si ferma. Devi controllare il divisore prima di dividere — il che diventa facile quando saprai usare le condizioni.
10 / 5 ha dato 2.0 e a me serve 2 Usa //, oppure scrivi int(10 / 5). Il primo è meglio: l'intento si vede nel codice.
// si comporta diversamente con i numeri negativi -7 // 2 dà -4, non -3. Python arrotonda verso il basso, non verso lo zero. Vale la pena ricordarlo se lavori con i numeri negativi.
Il calcolo sembra giusto ma la risposta è sbagliata Conta le parentesi, e spezza ogni passaggio su una riga a parte stampandolo. L'errore è quasi sempre la precedenza degli operatori.
Una lunga coda di cifre dopo il punto decimale Non è un errore, è così che si comportano i decimali. Accorciala con round() quando la mostri.
Passo 4 di 6 — Prevedi
Verifica cosa hai capito
Tutte e tre le righe lavorano sugli stessi due numeri, con un operatore diverso ogni volta. Qual è l'output?
print(7 / 2)
print(7 // 2)
print(7 % 2)- A3 3 1
- B3.5 4 1
- C3.5 3.5 1
- D3.5 3 1
Il programma funziona senza alcun errore ma riporta la media come 40.0. Perché?
a = 10
b = 20
c = 30
average = a + b + c / 3
print("Average:", average)- A`average` è una parola chiave di Python, quindi il valore non è stato salvato correttamente
- BLe medie devono usare `//`, non `/`
- C`/` viene eseguita per prima, quindi è stato diviso solo `c` — dovrebbe essere `(a + b + c) / 3`
- DI tre numeri sono `int`, il che rende sbagliato il risultato
Qual è l'output di queste due righe?
print(0.1 + 0.2)
print(0.1 + 0.2 == 0.3)- A0.3 True
- B0.3 False
- C0.30000000000000004 False
- D0.30000000000000004 True
Per rispondere serve un account
Accedi per verificare le tue risposte
Le domande sono qui sopra, e ragionarci a mente è la parte che conta. Accedi per vedere le risposte, le spiegazioni e i suggerimenti a tre livelli.
Tocca a te
Scrivi un file chiamato time_split.py che divide un numero di secondi in ore, minuti e secondi.
Parti da total_seconds = 7385, e l'output dovrebbe essere:
2 h 3 m 5 sTre condizioni:
- Usa solo
//e%— non digitare a mano nessuno dei risultati - Tieni i tre valori in tre variabili separate, con nomi significativi
- Poi cambia
total_secondsin59,60,3600ed86399ed esegui ciascuno — verifica che tutti e quattro escano giusti
Non saltare quell'ultimo passaggio. Un programma che funziona solo per un caso specifico non basta: deve funzionare anche nei casi limite.
In questa missione c’è di più
Quello che hai letto sopra è la missione completa: non è stato tagliato nulla. Pro aggiunge:
- Cosa succede davvero dietro le quinte: come Python lo esegue
- La soluzione completa dell’esercizio, svolta passo per passo
- Esercizi extra più difficili
- La domanda da colloquio su questo argomento, con una risposta modello
Passo 6 di 6
Sfida — il quiz del capitolo
Dieci domande dalla più facile alla più difficile. Le ultime sono difficili di proposito.
Accedi per fare il quiz