Tipi di dati e conversione dei tipi
Ultimo aggiornamento il 2025-11-06 | Modifica questa pagina
Panoramica
Domande
- Quali tipi di dati memorizzano i programmi?
- Come posso convertire un tipo in un altro?
Obiettivi
- Spiegare le principali differenze tra numeri interi e numeri con la virgola.
- Spiegare le principali differenze tra numeri e stringhe.
- Utilizzare le funzioni integrate per convertire numeri interi, numeri con la virgola mobile e stringhe.
Ogni valore ha un tipo.
- Ogni valore in un programma ha un tipo specifico.
- Numero intero (
int): rappresenta numeri interi positivi o negativi come 3 o -512. - Numero con la virgola (
float): rappresenta numeri reali come 3,14159 o -2,5. - Stringa di caratteri (solitamente chiamata “stringa”,
str): testo.- Scritto tra apici singoli o doppi (purché corrispondano).
- Le virgolette non vengono stampate quando la stringa viene visualizzata.
Usare la funzione integrata type per trovare il tipo di
un valore.
- Usare la funzione integrata
typeper scoprire il tipo di un valore. - Funziona anche con le variabili.
- Ma ricordate: il valore ha il tipo — la variabile è solo un’etichetta.
OUTPUT
<class 'int'>
OUTPUT
<class 'str'>
I tipi controllano quali operazioni (o metodi) possono essere eseguite su un dato valore.
- Il tipo di un valore determina quali operazioni il programma può eseguire su di esso
OUTPUT
2
ERRORE
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-67f5626a1e07> in <module>()
----> 1 print('hello' - 'h')
TypeError: unsupported operand type(s) for -: 'str' and 'str'
Si possono usare gli operatori “+” e “*” sulle stringhe.
- “Aggiungendo” stringhe di caratteri le concatena.
OUTPUT
Ahmed Walsh
- Moltiplicando una stringa di caratteri per un numero intero
N si crea una nuova stringa che consiste in quella stringa di
caratteri ripetuta N volte.
- Poiché la moltiplicazione è un’addizione ripetuta.
OUTPUT
==========
Le stringhe hanno una lunghezza (ma i numeri no).
- La funzione integrata
lenconta il numero di caratteri di una stringa.
OUTPUT
11
- Ma i numeri non hanno una lunghezza (nemmeno zero).
ERRORE
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-f769e8e8097d> in <module>()
----> 1 print(len(52))
TypeError: object of type 'int' has no len()
Deve convertire i numeri in stringhe o viceversa quando opera su di essi.
- Non si possono sommare numeri e stringhe.
ERRORE
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-fe4f54a023c6> in <module>()
----> 1 print(1 + '2')
TypeError: unsupported operand type(s) for +: 'int' and 'str'
- Non è consentito perché è ambiguo:
1 + '2'dovrebbe essere3o'12'? - Alcuni tipi possono essere convertiti in altri tipi utilizzando il nome del tipo come funzione.
OUTPUT
3
12
Può mischiare liberamente interi e numeri con la virgola (float) nelle operazioni.
- Gli interi e i numeri con la virgola possono essere usati insieme in
aritmetica.
- Python 3 converte automaticamente gli interi in float quando necessario.
OUTPUT
half is 0.5
three squared is 9.0
Le variabili cambiano valore solo quando viene loro assegnato qualcosa.
- Se una cella di un foglio di calcolo dipende da un’altra e si aggiorna quest’ultima, la prima si aggiorna automaticamente.
- Questo non avviene nei linguaggi di programmazione.
PYTHON
variable_one = 1
variable_two = 5 * variable_one
variable_one = 2
print('first is', variable_one, 'and second is', variable_two)
OUTPUT
first is 2 and second is 5
- Il computer legge il valore di
variable_onequando esegue la moltiplicazione, crea un nuovo valore e lo assegna avariable_two. - In seguito, il valore di
variable_twoè impostato sul nuovo valore e non dipende davariable_one, quindi il suo valore non cambia automaticamente quando cambiavariable_one.
Frazioni
Che tipo di valore è 3,4? Come si fa a scoprirlo?
Conversione automatica di tipo
Che tipo di numero è 3,25 + 4?
Scegliere un tipo
Quale tipo di valore (intero, numero con la virgola o stringa di caratteri) usereste per rappresentare ciascuno dei seguenti elementi? Cercate di dare più di una risposta valida per ogni problema. Per esempio, nel punto 1, quando avrebbe più senso contare i giorni con una variabile float piuttosto che con un numero intero?
- Numero di giorni dall’inizio dell’anno.
- Tempo trascorso dall’inizio dell’anno a oggi in giorni.
- Numero di serie di un pezzo di attrezzatura da laboratorio.
- Età di un campione di laboratorio
- Popolazione attuale di una città.
- Popolazione media di una città nel tempo.
Le risposte alle domande sono:
- Intero, poiché il numero di giorni è compreso tra 1 e 365.
- Virgola (float), poiché sono richiesti giorni frazionati
- Stringa se il numero di serie contiene lettere e numeri, altrimenti numero intero se il numero di serie è composto solo da numeri
- Questo varia! Come si definisce l’età di un campione? Giorni interi dalla raccolta (intero)? Data e ora (stringa)?
- Scegliere float per rappresentare la popolazione in grandi aggregati (ad esempio, milioni) o i numeri interi per rappresentare la popolazione in unità di individui.
- Numeri con la virgola, poiché è probabile che una media abbia una parte frazionaria.
Tipi di divisione
In Python 3, l’operatore // esegue la divisione intera
(numeri interi), l’operatore / esegue la divisione con la
virgola e l’operatore % (o modulo) calcola e
restituisce il resto della divisione intera:
OUTPUT
5 // 3: 1
5 / 3: 1.6666666666666667
5 % 3: 2
Se num_subjects è il numero di soggetti che partecipano
a uno studio e num_per_survey è il numero di soggetti che
possono partecipare a un singolo sondaggio, scrivere un’espressione che
calcoli il numero di sondaggi necessari per raggiungere tutti una
volta.
Vogliamo il numero minimo di sondaggi che raggiunge tutti una volta,
che è il valore arrotondato per eccesso di
num_subjects/ num_per_survey. Ciò equivale a eseguire una
divisione per piani con // e aggiungere 1. Prima della
divisione è necessario sottrarre 1 dal numero di soggetti per gestire il
caso in cui num_subjects sia uniformemente divisibile per
num_per_survey.
PYTHON
num_subjects = 600
num_per_survey = 42
num_surveys = (num_subjects - 1) // num_per_survey + 1
print(num_subjects, 'subjects,', num_per_survey, 'per survey:', num_surveys)
OUTPUT
600 subjects, 42 per survey: 15
Stringhe a numeri
Se possibile, float() convertirà una stringa in un
numero float e int() convertirà float in un intero:
OUTPUT
string to float: 3.4
float to int: 3
Se la conversione non ha senso, viene visualizzato un messaggio di errore.
ERRORE
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-5-df3b790bf0a2> in <module>
----> 1 print("string to float:", float("Hello world!"))
ValueError: could not convert string to float: 'Hello world!'
Date queste informazioni, cosa ci si aspetta che faccia il seguente programma?
Cosa fa in realtà?
Perché pensate che lo faccia?
Cosa ci si aspetta che faccia questo programma? Ci si potrebbe
aspettare che il comando int di Python 3 converta la
stringa “3.4” in 3.4 e un’ulteriore conversione di tipo in 3. Dopotutto,
Python 3 compie molte altre magie: non è forse parte del suo
fascino?
OUTPUT
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-2-ec6729dfccdc> in <module>
----> 1 int("3.4")
ValueError: invalid literal for int() with base 10: '3.4'
Tuttavia, Python 3 lancia un errore. Perché? Forse per coerenza. Se si chiede a Python di eseguire due typecast consecutivi, è necessario convertirli esplicitamente nel codice.
OUTPUT
3
Aritmetica con tipi diversi
Risposta: 1 e 4
Numeri complessi
Python fornisce numeri complessi, che si scrivono come
1.0+2.0j. Se val è un numero complesso, si può
accedere alle sue parti reali e immaginarie usando la notazione a
punti come val.real e val.imag.
OUTPUT
6.0
2.0
- Perché pensate che Python usi
jinvece diiper la parte immaginaria? - Cosa ci si aspetta che produca
1 + 2j + 3? - Cosa ci si aspetta che sia
4j? E4 jo4 + j?
- I trattamenti matematici standard di solito usano
iper indicare un numero immaginario. Tuttavia, stando a quanto riportato dai media, si trattava di una convenzione nata in precedenza nell’ambito dell’ingegneria elettrica, che ora rappresenta un’area tecnicamente costosa da modificare. [Stack Overflow fornisce ulteriori spiegazioni e discussioni] (https://stackoverflow.com/questions/24812444/why-are-complex-numbers-in-python-denoted-with-j-instead-of-i) (4+2j)-
4jeSyntax Error: invalid syntax. In questi ultimi casi,jè considerata una variabile e la dichiarazione dipende dal fatto chejsia definito e, in tal caso, dal valore che gli è stato assegnato.
- Ogni valore ha un tipo.
- Usare la funzione integrata
typeper trovare il tipo di un valore. - I tipi controllano le operazioni che possono essere eseguite sui valori.
- Le stringhe possono essere sommate e moltiplicate.
- Le stringhe hanno una lunghezza (ma i numeri no).
- Deve convertire i numeri in stringhe o viceversa quando opera su di essi.
- Può mescolare liberamente numeri interi e float nelle operazioni.
- Le variabili cambiano valore solo quando viene loro assegnato qualcosa.