Casting in Python: Convertire tra Tipi di Dati
Impara il casting in Python con esempi chiari: converti tra int, float, str, bool e collezioni. Include casting implicito, esplicito ed errori comuni.
Il casting (detto anche conversione di tipo) è il processo che trasforma un valore da un tipo di dato a un altro. Python supporta questa operazione tramite un insieme di funzioni costruttore predefinite — int(), float(), str(), bool(), list(), tuple(), set() e altre ancora. Sapere quando e come eseguire il casting è fondamentale per scrivere programmi Python corretti e flessibili.
Questo capitolo tratta:
- La differenza tra casting implicito ed esplicito
- Tutte le principali funzioni di casting predefinite con esempi funzionanti
- Le conversioni di base numerica (
hex,oct,bine viceversa) - Le conversioni tra tipi di collezione (
list,tuple,set) - Le regole truthy/falsy dei boolean e le relative insidie nel casting
- Gli errori comuni (
TypeError,ValueError) e come evitarli
Casting Implicito vs Esplicito
Python distingue due tipi di conversione di tipo.
Casting Implicito
Il casting implicito avviene automaticamente quando Python deve riconciliare due tipi compatibili in un'espressione. Non è necessaria alcuna chiamata di funzione — Python promuove il tipo "più ristretto" per evitare la perdita di dati.
Il caso più comune riguarda la combinazione di interi e float in operazioni aritmetiche. Python converte sempre l'intero in float affinché il risultato preservi la parte decimale:
Python non converte implicitamente tipi non correlati come string e numeri. Il tentativo di eseguire "10" + 5 genera un TypeError. In questi casi è necessario il casting esplicito.
Casting Esplicito
Il casting esplicito consiste nel chiamare direttamente una funzione costruttore per convertire un valore:
Il resto di questo capitolo tratta in dettaglio ogni importante funzione di casting esplicito.
Casting Numerico: int(), float(), complex()
int() — Conversione in Intero
int() accetta interi, float, boolean e string numeriche. Nella conversione di un float, tronca (elimina la parte decimale) anziché arrotondare:
# float → int (truncates, does NOT round)
print(int(10.9)) # 10
print(int(-10.9)) # -10
# string → int
print(int("42")) # 42
# bool → int
print(int(True)) # 1
print(int(False)) # 0Si noti che int(-10.9) restituisce -10, non -11. Python tronca verso lo zero, non verso meno infinito (per questo si userebbe math.floor()).
float() — Conversione in Float
float() accetta interi, boolean e string numeriche (incluse "inf" e "nan"):
print(float(10)) # 10.0
print(float("3.14")) # 3.14
print(float(True)) # 1.0
print(float("inf")) # infcomplex() — Conversione in Numero Complesso
complex() costruisce un numero complesso dalla parte reale e da quella immaginaria, oppure da una string:
print(complex(3, 4)) # (3+4j)
print(complex("3+4j")) # (3+4j)Casting di String: str()
str() converte quasi qualsiasi oggetto Python nella sua rappresentazione come string. È utile per la concatenazione e per costruire output:
age = 30
message = "I am " + str(age) + " years old."
print(message) # I am 30 years old.
print(str(3.14)) # '3.14'
print(str(True)) # 'True'
print(str(None)) # 'None'Per formattare numeri all'interno di string, consulta il capitolo sulle f-string di Python per un approccio più ergonomico.
Casting Boolean: bool() e Valori Truthy/Falsy
bool() converte qualsiasi valore in True o False seguendo le regole truthy/falsy di Python. Memorizzare quali valori sono falsy è importante perché le condizioni nelle istruzioni if e nei cicli while si basano implicitamente sulle stesse regole.
Valori falsy — questi vengono tutti valutati come False:
print(bool(0)) # False — zero integer
print(bool(0.0)) # False — zero float
print(bool("")) # False — empty string
print(bool([])) # False — empty list
print(bool(None)) # False — NoneValori truthy — tutto il resto viene valutato come True:
print(bool(1)) # True
print(bool(-1)) # True — any non-zero number
print(bool("a")) # True
print(bool([0])) # True — a list with one elementInsidia comune: il casting di una string in bool restituisce sempre True a meno che la string non sia vuota — persino bool("False") è True. Per verificare se una string rappresenta un boolean falsy, è necessario confrontarla esplicitamente:
# This is WRONG — bool("False") is True!
user_input = "False"
print(bool(user_input)) # True (non-empty string)
# Correct approach: compare the string
print(user_input.lower() == "true") # FalseConversioni di Base Numerica
Analisi di Interi in Altre Basi con int()
int() accetta un secondo argomento opzionale che specifica la base della string sorgente. Questo permette di analizzare letterali binari, ottali ed esadecimali:
print(int("1010", 2)) # 10 — binary string
print(int("17", 8)) # 15 — octal string
print(int("ff", 16)) # 255 — hexadecimal string
# Pass 0 to auto-detect Python prefix notation
print(int("0b1010", 0)) # 10
print(int("0o17", 0)) # 15
print(int("0xFF", 0)) # 255Conversione di Interi in String di Base
Python dispone di tre funzioni predefinite che formattano un intero come string con prefisso di base:
print(bin(10)) # '0b1010'
print(oct(8)) # '0o10'
print(hex(255)) # '0xff'Queste restituiscono string, non interi. Se hai bisogno della string senza il prefisso, utilizza lo slicing: bin(10)[2:] restituisce '1010'.
Conversioni tra Tipi di Collezione
È possibile convertire tra list, tuple e set utilizzando le rispettive funzioni costruttore. La conversione in set rimuove i duplicati e perde l'ordine:
# list → tuple
coords = [10, 20, 30]
print(tuple(coords)) # (10, 20, 30)
# tuple → list
point = (4, 5, 6)
mutable = list(point)
mutable.append(7)
print(mutable) # [4, 5, 6, 7]
# list → set (removes duplicates)
numbers = [1, 2, 2, 3, 3, 3]
unique = set(numbers)
print(unique) # {1, 2, 3}La conversione di una string in list la divide nei singoli caratteri:
print(list("hello")) # ['h', 'e', 'l', 'l', 'o']Tutte le Conversioni Numeriche e di String: Riferimento Rapido
Gli esempi seguenti mostrano in un unico posto l'intera gamma del casting numerico e di string:
Python casting numeric
# Converting an integer to a floating-point number
x = 10
y = float(x)
print(y)
# Converting a floating-point number to an integer
x = 10.5
y = int(x)
print(y)
# Converting a string to an integer
x = "10"
y = int(x)
print(y)
# Converting a string to a floating-point number
x = "10.5"
y = float(x)
print(y)
# Converting an integer to a string
x = 10
y = str(x)
print(y)
# Converting a floating-point number to a string
x = 10.5
y = str(x)
print(y)
# Converting a number to a boolean
x = 0
y = bool(x)
print(y)
x = 10
y = bool(x)
print(y)Errori Comuni
TypeError
Un TypeError viene generato quando si passa un tipo che la funzione non è in grado di convertire — ad esempio, passando una list a int():
Python casting unsupported type to int
Output:
TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'ValueError
Un ValueError viene generato quando il tipo è corretto (ad esempio una string) ma il valore non può essere convertito — ad esempio, una parola passata a float():
Python casting string to float
Output:
ValueError: could not convert string to float: 'hello'Perdita di Precisione nella Conversione da Float a Int
La conversione da float a int tronca silenziosamente la parte decimale. Non viene emesso alcun avviso — e per i numeri negativi il comportamento può essere sorprendente:
Python casting float to int
Output:
10Se hai bisogno dell'arrotondamento, usa round() prima del casting, oppure math.floor() / math.ceil() per controllare esplicitamente la direzione.
Casting Sicuro con try/except
Quando il programma riceve dati dall'input dell'utente, da file o da API esterne, non è possibile sapere in anticipo se un valore sarà convertibile con successo. Utilizza un blocco try/except per gestire i fallimenti senza che il programma vada in crash:
Python safe casting with try/except
Output:
Conversion failed: invalid literal for int() with base 10: 'hello'
10Questo schema è particolarmente utile nell'elaborazione di campi di form o righe CSV, dove qualsiasi colonna potrebbe contenere dati imprevisti.