Perché i tipi contano
Un tipo è semplicemente una categoria che dice a Python come deve comportarsi un valore. Sommare due interi significa fare aritmetica; sommare due stringhe significa unirle; sommare una stringa a un intero è un errore. Il tipo di un valore determina quali operazioni hanno senso su di esso.
Python ha un insieme piccolo e amichevole di tipi integrati. Quattro di questi (int, float, str, bool) li userai in quasi ogni programma che scrivi. Gli altri compaiono quando inizi a organizzare i dati in collezioni.
Numeri: int e float
Due tipi di numeri, e Python sceglie quale ottieni in base a come l'hai scritto:
Niente punto decimale? Ottieni un int. Con il punto decimale? Ottieni un float. L'aritmetica li mescola liberamente: qualsiasi operazione che coinvolge un float produce un float:
In Python gli interi possono essere grandi quanto la memoria permette: nessun overflow, nessun tetto fisso a 32 o 64 bit. Puoi calcolare 2 ** 1000 e Python ti restituisce ogni singola cifra.
I float seguono le solite regole IEEE 754, il che significa qualche sorpresa classica:
Stampa 0.30000000000000004, non 0.3. Non è un bug di Python: è così che funziona la virgola mobile binaria in ogni linguaggio. Quando ti servono decimali esatti (per esempio con i soldi), usa invece il modulo decimal. Per tutto il resto, di solito basta arrotondare al momento di mostrare il valore.
Stringhe: str
Le stringhe sono sequenze di caratteri. Racchiudile tra apici singoli o doppi: a Python non importa quali, basta che la virgoletta di apertura e quella di chiusura coincidano:
Le stringhe con virgolette triple (""" ... """) si estendono su più righe:
Le stringhe hanno un'API enorme che imparerai col tempo: slicing, metodi come .upper(), .split(), .replace(), e la formattazione con le f-string che ti dà f"Hello, {name}". Subito dopo c'è una pagina dedicata alle stringhe.
Booleani: bool
Due valori, scritti esattamente così: True e False, con la maiuscola iniziale. I confronti producono booleani:
Dietro le quinte, True e False sono letteralmente 1 e 0, quindi puoi sommare booleani se ti serve contare quante condizioni erano vere:
None: l'assenza di un valore
None è il modo in cui Python dice "nessun valore". Le funzioni che non restituiscono esplicitamente qualcosa restituiscono None. Lo userai anche come segnaposto:
Per convenzione si controlla con is None e is not None, non con == None. is verifica l'identità, che è proprio quello che intendi qui.
Liste, tuple, set, dizionari
Questi sono i quattro tipi di collezione integrati. Ognuno ha una pagina dedicata, ma ecco uno schizzo veloce per riconoscerli:
Regole pratiche:
- List: una sequenza che ti aspetti cambi. Aggiungere, rimuovere, ordinare: tutto a posto.
- Tuple: una sequenza che vuoi proteggere dalle modifiche. Spesso usata per record di forma fissa come le coordinate
(x, y). - Set: un contenitore di elementi unici, quando i duplicati sarebbero un bug.
- Dict: ricerche per chiave. La struttura con la forma di un JSON.
Convertire tra tipi
Python non converte i tipi in automatico quando sarebbe rischioso. Trasformare un intero in stringa, o una stringa in numero, è qualcosa che devi chiedere tu:
Se una conversione non ha senso, per esempio int("hello"), Python solleva ValueError e ti dice cosa gli hai passato. Errore spiegato: correggi e vai avanti.
Controllare un tipo
Due strumenti da conoscere:
type() è ottimo per un'occhiata veloce nel REPL. isinstance() è quello che usi nel codice vero, perché funziona bene con l'ereditarietà e può controllare più tipi in una volta.
Un piccolo esercizio di ricognizione
Prova a eseguire il blocco qui sotto così com'è, poi cambia qualche valore e guarda in quali tipi si trasforma:
Non serve ancora capire il for (ci arriveremo), ma così ti fai un'idea dei tipi integrati con un solo colpo d'occhio.
Scegli il tipo adatto ai dati
Non devi memorizzare subito ogni tipo. Devi però saperne riconoscere uno quando lo vedi e scegliere quello giusto quando crei dei dati. "È fisso o cambia? Elementi unici o no? Lo cerco per chiave o per posizione?" Queste quattro domande scelgono il tipo di collezione nove volte su dieci.
Prossimo argomento: le stringhe nel dettaglio, perché sono il tipo di dato che toccherai in quasi ogni programma.
Domande frequenti
Quali sono i principali tipi di dati in Python?
Numeri (int e float), stringhe (str), booleani (bool), None e quattro tipi di collezione: list, tuple, set e dict. Tutto il resto che vedi nel codice Python è costruito a partire da questi più pochi altri (bytes, complex, frozenset).
Come controllo il tipo di un valore in Python?
Passalo a type(): type(42) restituisce <class 'int'>, type('hi') restituisce <class 'str'>. Per un controllo vero/falso usa isinstance(value, int): è più flessibile perché gestisce anche le sottoclassi.
Python ha una tipizzazione statica o dinamica?
Dinamica. Una variabile può puntare a un valore di qualsiasi tipo, e la stessa variabile può cambiare tipo nel corso della sua vita. È diverso da linguaggi come Java o C++, dove dichiari il tipo di una variabile una volta sola e non può cambiare.