Variabili e tipi — come un programma ricorda
Salvare valori in variabili, le regole per nominarle e i quattro tipi base — int, float, str, bool — oltre all'errore che i principianti incontrano più spesso.
Come vuoi imparare?
Il problema che stiamo risolvendo
Finora i nostri programmi non potevano ricordare nulla. Tutto ciò che veniva stampato spariva.
Il lavoro vero non funziona così. In un programma di fatturazione un prezzo si calcola una volta sola e serve in tre punti. In un report un totale va prima calcolato e poi riutilizzato. Il programma deve ricordare.
E c'è un secondo problema insieme a quello. Nell'ultimo capitolo "2" + "3" dava 23 mentre 2 + 3 dava 5 — lo stesso simbolo, due comportamenti. Questo perché agli occhi di Python quelle due cose sono di tipi diversi. Quella categoria si chiama tipo, e la parte maggiore degli errori dei principianti nasce proprio da qui.
Alla fine di questo capitolo sarai in grado di
- Salvare un valore in una variabile e cambiarlo in seguito
- Scegliere nomi che Python accetta e che un essere umano sa leggere
- Riconoscere i quattro tipi base:
int,float,str,bool - Ispezionare il tipo di qualsiasi valore con
type() - Leggere un
TypeErrore capire esattamente di cosa si lamenta
Prerequisiti: Vedere con print, spiegare con i commenti.
Una variabile è un nome
city_count = 4Leggi quella riga da destra a sinistra: il valore 4 è venuto in esistenza, e l'etichetta city_count è stata attaccata ad esso. Da ora in poi, scrivere city_count ti dà quel valore.
city_count = 4
print("Cities:", city_count)
print("Double:", city_count * 2)Cities: 4
Double: 8=non significa uguale. In matematicax = 4è un'affermazione: x e 4 sono la stessa cosa. In Python=è un'istruzione: "conserva questo valore sotto quel nome." Ecco perchétotal = total + 5— impossibile come matematica — è Python perfettamente ordinario. Significa "prendi ciò chetotalcontiene adesso, aggiungi 5 e rimetti il risultato intotal." Verificare se due cose sono uguali ha un simbolo tutto suo,==, che incontreremo più avanti.
Cambiare un valore
Assegnare un nuovo valore a una variabile non lascia nulla di quello vecchio:
stock = 20
print("Before:", stock)
stock = stock - 3
print("After:", stock)Before: 20
After: 17Vedi cosa succede quando due nomi puntano allo stesso valore:
a = 10
b = a
a = 99
print(a, b)99 10La riga b = a significa: metti l'etichetta b sullo stesso valore a cui è attaccata a. Ora entrambi i nomi indicano lo stesso 10. Poi a = 99 stacca l'etichetta a e la mette sul nuovo valore 99 — b resta dov'era, sul 10. Assegnare un nuovo valore a un nome sposta solo quel nome, non l'altro.
Tieni a mente questo quadro: due nomi possono indicare lo stesso valore. Con numeri e stringhe non crea problemi, ma più avanti, quando imparerai le liste — i cui contenuti si possono modificare in place — questo punto diventa molto importante.
Le regole dei nomi
Ciò che Python non accetta:
- Iniziare con una cifra:
2nd_priceè escluso,price_2va benissimo - Un trattino in mezzo:
total-priceè escluso, Python lo legge come sottrazione - Uno spazio in mezzo:
total priceè escluso - Le parole chiave di Python:
class,for,if,import,return,Nonenon possono essere usate come nomi
Ciò che Python accetta ma che tu non dovresti scrivere:
x1 = 4500 # clear today, meaningless in three weeks
Total_Price = 4500 # legal Python, but not the Python convention
l = 4500 # lowercase L and the digit one look almost identicalLa convenzione professionale di Python è snake_case — minuscolo, con trattini bassi tra le parole:
total_price = 4500
customer_name = "Rafi"
items_in_cart = 3Scervellarsi sui nomi può sembrare tempo sprecato, ma il codice si scrive una o due volte e si legge venti volte. Un nome che si spiega da solo fa il lavoro di un commento.
I quattro tipi base
items = 7 # int — a whole number
price = 249.50 # float — a number with a decimal point
name = "Rafi" # str — text, inside quotes
is_paid = True # bool — only True or False
print(type(items))
print(type(price))
print(type(name))
print(type(is_paid))<class 'int'>
<class 'float'>
<class 'str'>
<class 'bool'>type() è lo strumento che scioglie i dubbi. Quando una variabile si comporta in modo strano, la prima mossa è stamparne il tipo. Quasi sempre la risposta è già lì.
Due note piccole ma importanti:
True e False iniziano con la lettera maiuscola. Se scrivi true, Python lo tratta come nome di variabile e ti dice che non lo conosce.
"7" e 7 non sono la stessa cosa. Il primo è una stringa, il secondo è un numero. Sembrano uguali e per Python sono completamente distinti:
a = 7
b = "7"
print(type(a), type(b))
print(a * 3)
print(b * 3)<class 'int'> <class 'str'>
21
777L'errore che tutti incontrano
age = "22"
print(age + 1)Traceback (most recent call last):
File "C:\Users\Rafi\python-lab\lesson-04\demo.py", line 2, in <module>
print(age + 1)
~~~~^~~
TypeError: can only concatenate str (not "int") to strIl messaggio sembra spaventoso ed è in realtà preciso: solo una str può essere unita a una str, non un int. Python non può capire se volevi sommare o unire — quindi, invece di indovinare, si è fermato.
La riga File mostra il percorso completo del tuo file, quindi sul tuo computer sarà diversa. Le altre righe restano uguali.
Leggi i messaggi di errore dal basso verso l'alto. L'ultima riga dice cosa non va; la riga sopra dice dove. I principianti spesso si spaventano alla vista di un traceback e lo saltano del tutto, ma i messaggi di errore di Python sono il testo più utile sullo schermo.
La correzione è fare in modo che il numero sia un numero:
age = "22"
print(int(age) + 1)23int() converte una stringa in un numero intero. Quando funziona e quando fallisce viene affrontato per bene in un capitolo successivo su input(), perché lì questo problema si presenta ogni singola volta.
Un esempio completo
invoice.py:
# Invoice for a single order, all figures in one place
customer_name = "Rafi"
unit_price = 249.50
quantity = 3
is_member = True
subtotal = unit_price * quantity
discount = 50.0
total = subtotal - discount
print("Customer :", customer_name)
print("Quantity :", quantity)
print("Subtotal :", subtotal)
print("Discount :", discount)
print("Total :", total)
print("Member :", is_member)Customer : Rafi
Quantity : 3
Subtotal : 748.5
Discount : 50.0
Total : 698.5
Member : TrueNota dove sta il vero vantaggio: per cambiare il prezzo modifichi solo la riga unit_price, e ogni calcolo sotto si corregge da solo. Se i numeri fossero stati scritti direttamente nelle chiamate a print, dovresti ogni volta andare a caccia di ogni occorrenza — e dimenticarne una rende il report sbagliato.
Quando qualcosa va storto
NameError: name 'total' is not defined Il nome che hai usato non ha ancora ricevuto un valore, oppure è scritto male. Python tratta total e totl come due nomi diversi. Attenzione: anche le maiuscole contano: Total non è total.
TypeError: can only concatenate str (not "int") to str Hai provato a unire un numero a una stringa. O converti con int(), oppure usa una virgola — print("Age:", age) — perché print gestisce da solo i tipi misti.
SyntaxError: cannot assign to expression here. Maybe you meant '==' instead of '='? Un trattino in un nome produce questo errore. Sulla riga total-price = 5, Python vede un calcolo che sottrae price da total e non puoi salvare un valore dentro un calcolo. Usa un trattino basso: total_price.
SyntaxError: invalid syntax Hai provato a usare una delle parole chiave di Python come nome, ad esempio class = 10. Il messaggio non nomina le parole chiave; mette solo un ^ sotto il =, quindi tocca a te controllare se il nome è una parola chiave. Scegline un altro: class_name, grade.
NameError: name 'true' is not defined. Did you mean: 'True'? True e False iniziano con la lettera maiuscola.
Passo 4 di 6 — Prevedi
Verifica cosa hai capito
Cosa stampa questo?
a = 10
b = a
a = 99
print(a, b)- A10 99
- B10 10
- C99 99
- D99 10
Quale di questi è un nome di variabile Python valido?
- Aclass
- Bitem-2
- C2nd_item
- Ditem_2
Questo programma lancia un TypeError. Cosa non va esattamente, e come si corregge?
age = "22"
next_year = age + 1
print("Next year:", next_year)- A`next_year` è stato usato senza essere prima definito
- B`age` contiene una stringa, non un numero — scrivi `age = 22`, oppure usa `int(age) + 1`
- CScrivere `age + "1"` invece di `age + 1` darebbe 23
- DAl `print` serve un `+` invece di una virgola
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 shipping.py che contenga:
- Quattro variabili — una
int, unafloat, unastr, unabool— tutte con nomi significativi in snake_case - Almeno un calcolo che ne usa due per produrre una terza variabile
- Il tipo di tutte e quattro le variabili, stampato con
type() - Una variabile a cui viene dato un valore e poi riassegnato — stampando il valore in entrambi i passaggi
Poi rompilo di proposito: prendi una variabile str, scrivi + 1 dopo di essa ed esegui il file. Leggi l'errore per intero, soprattutto l'ultima riga. Quel messaggio lo incontrerai molte volte; evocarlo deliberatamente oggi lo renderà familiare più avanti.
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