W3docs

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, bin e 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— editable, runs on the server

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:

python— editable, runs on the server

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))  # 0

Si 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"))   # inf

complex() — 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  — None

Valori 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 element

Insidia 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")  # False

Conversioni 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))   # 255

Conversione 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

python— editable, runs on the server

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

python— editable, runs on the server

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

python— editable, runs on the server

Output:

10

Se 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

python— editable, runs on the server

Output:

Conversion failed: invalid literal for int() with base 10: 'hello'
10

Questo schema è particolarmente utile nell'elaborazione di campi di form o righe CSV, dove qualsiasi colonna potrebbe contenere dati imprevisti.

Esercitati

Pratica
In Python, how does casting take place and what are its functions?
In Python, how does casting take place and what are its functions?
Was this page helpful?