Tipi di base

In Python i tipi di base sono suddivise in:

  • Numeri, come: 3 (intero), 15,57 (virgola mobile) o 7 + 5j (complesso)
  • Stringhe, come “Ciao Mondo”
  • Booleani: come True (vero) e False (falso).

Si creerà un paio di variabili a titolo di esempio. Una stringa e un intero:

		# questa è una stringa
		c = "Ciao Mondo"
		# e questo è un intero
		e = 23
		# possiamo verificarlo con la funzione type
		type(c)
		type(e)
Come potete vedere in Python, a differenza di molti altri linguaggi, non si dichiara il tipo di variabile quando si crea. In Java, ad esempio, scriveremo:
		String c = "Ciao Mondo";
		int e = 23;
Questo piccolo esempio ci ha aiutato a presentare i commenti in linea con Python: le stringhe di testo che iniziano con il carattere #, Python le ignora totalmente. Ci sono altri tipi di commenti, di cui si vedrà più avanti.
Numeri
Come accennato, in Python si possono rappresentare numeri interi, reali e complessi.
Interi
I numeri interi sono quei numeri positivi o negativi senza decimali (oltre allo zero). In Python si possono rappresentare attraverso il tipo int (da integer, intero) o il tipo long (lungo). L’unica differenza è che il tipo long permette di memorizzare numeri grandi. È consigliabile non utilizzare il tipo long (solo s’è necessario) per evitare di sprecare la memoria.
Il tipo int di Python s’implementa a basso livello usando un tipo long di C. E poiché Python utilizza il C di sotto, come C, e a differenza di Java, l’intervallo di valori che possono rappresentare dipende dalla piattaforma.
Nella maggior parte delle macchine il tipo long di C memorizza i dati utilizzando 32 bits, cioè utilizzando una variabile di tipo int di Python possiamo memorizzare numeri da -231 a 231 – 1, o lo stesso, da -2.147.483.648 a 2.147.483.647. In piattaforme a 64 bits, l’intervallo è da -9.223.372.036.854.775.808 a 9.223.372.036.854.775.807.
Il tipo long di Python permette di memorizzare numeri di qualsiasi precisione, limitato soltanto dalla memoria disponibile sul computer.
Assegnando un numero a una variabile questa avrà il tipo int, a meno che il numero sia così grande da richiedere l’uso del tipo long.
				# type(intero) ritornerrebe int
				intero = 23
Possiamo indicare anche a Python che un numero si memorizzi utilizzando il tipo long con l’aggiunta di una L alla fine:
				# type(intero) ritornerrebe long
				entero = 23L
Il letterale che si assegna alla variabile può anche essere espresso come un ottale, mettendo all’inizo uno zero:
				# 027 ottale = 23 base 10
				intero = 027
o in esadecimale, anteponendo uno 0x:
				# 0x17 essadecimale = 23 en base 10
				intero = 0×17
Reali
I numeri reali sono quelli che hanno i decimali. In Python sono espressi attarverso il tipo float. In altri linguaggi di programmazione come il C, abbiamo anche il tipo double, simile al float ma più precisa (double = doppia precisione). Python, invece implementa il suo tipo di float a basso livello tramite una variabile di tipo double in C, vale a dire, usando 64 bits Python usa sempre la doppia precisione, e in particolare segue lo standard IEEE 754: 1 bit per il segno, 11 per l’esponente, e 52 per la mantissa. Questo significa che siamo in grado di rappresentare valori che vanno da ± 2,2250738585072020 x 10-308 a ± 1,7976931348623157 × 10308.
Molti linguaggi di programmazione seguono lo stesso modello per la rappresentazione interna. Ma, come molti di voi sapete, questo ha i suoi limiti imposti dall’hardware. Così da Python 2.4 abbiamo anche un nuovo tipo Decimal, nel caso si ha bisogno di rappresentare le frazion in modoi più accurate. Tuttavia, questo tipo va oltre lo scopo di questo tutorial, ed è necessario solo nel campo della programmazione scientifica e connessi. Per le normali applicazioni è possibile utilizzare il float senza paura, come si fa’ da anni, tenendo presente che i numeri a virgola mobile non sono precisi (in questo e in altri linguaggi di programmazione).
Per rappresentare un numero realein Python si scrive prima la parte intera, seguito da un punto e infine la parte frazionaria.
				real = 0.2703
È inoltre possibile utilizzare la notazione scientifica aggiungendo una e (da esponente) per indicare un esponente in base 10. Ad esempio:
				real = 0.1e-3
sarebbe equivalente a 0.1 x 10-3 = 0.1 x 0.001 = 0.0001
Complessi
I numeri complessi sono quelli che hanno una parte immaginaria. Se non sapevate della sua esistenza, è probabile che non ne avrete bisogno, e potete saltare tanquillamente questa sezione. In realtà molti linguaggi di programmazione non hanno questo tipo, anche se ampiamente utilizzato da ingegneri e scienziati in generale.
Nel caso in cui potrebbe essere necessario usare i numeri complessi, o semplicemente per curiosità, si può dire che questo tipo, chiamato complex in Python, viene memorizzato utilizzando anche la virgola mobile, perché questi numeri sono un’estensione dei numeri reali. In particolare è memorizzato in una struttura di C, costituita da due variabili di tipo double, che serve per memorizzare, in una la parte reale, e nell’altra la parte immaginaria.
In Python i numeri complessi sono rappresentati come segue:
				complesso = 2.1 + 7.8j
Operatori
Ora vediamo cosa possiamo fare con i nostri numeri con gli operatori di default. Per le operazioni più complesse è possibile utilizzare il modulo matematico math.
Operatori aritmetici
Operatore Descrizione Esempio
+ Somma r = 3 + 2 # r è uguale a 5
Sottrazione r = 4 - 7 # r è uguale a -3
Negazione r = -7 # r è uguale a -7
* Prodotto r = 2 * 6 # r è uguale a 12
** Esponente r = 2 ** 6 # r è uguale a 64
/ Divisione r = 3.5 / 2 # r è uguale a 1.75
// Divisione intera r = 3.5 // 2 # r è uguale a 1.0
% Modulo r = 7 % 2 # r è uguale a 1

Si può avere qualche dubbio su come funziona l’operatore modulo e qual’è la differenza fra divisione e divisione intera.
L’operatore modulo non fa altro che restituire il resto della divisione tra i due operandi. Nell’esempio, 7/2 sarebbe 3, con 1 di resto, quindi il modulo (7%2) è uguale a 1.
La differenza tra divisione e divisione intera non è altro che come indica il suo nome. Nella divisione il risultato restituito è un numero reale, mentre la divisione intera il risultato restituito è solo la parte intera.
Occorre tuttavia tener presente che se si utilizza due operandi interi, Python determinerà che la variabile risultato sia anch’essa di tipo int e così il risultato di, per esempio, 3/2 e di 3//2 sarebbe lo stesso: 1
Se vogliamo ottenre i decimali è necessario che almeno uno degli operandi sia un numero reale, o indicando i decimali:

r = 3.0 / 2
o utilizzando la funzione di float (non c’è bisogno di sapere ora cosa significa il termine funzione, o ricordare questa forma, si vedrà un po’ più avanti):
r = float(3) / 2
Questo è così perché quando si mischiano i tipi di numero, Python converte tutti gli operandi del tipo più complesso tra i tipi degli operandi.
Operatori bitwise
Se non si conoscono questi operatori è poco probabile di avere bisogno di loro e si può saltare questa parte. Se avete curiosità si può dire che questi sono operatori che agiscono sulle rappresentazioni binarie degli operandi.
Ad esempio, se vedete un’operazione come 3 & 2, quello che state vedendo è un numero di bit per bit tra numeri binari 11 e 10 (rappresentazioni binarie di 3 e 2).
L’operatore and (&), dall’inglese “e” restituisce 1 se il primo bit operando è 1 e il secondo bit operando è 1. Restituisce 0 in caso contrario.
E applicando il risultato di bit a bit a 11 e 10 sarà allora il numero binario 10, o che è lo stesso, il decimale 2. La prima cifra è 1 per entrambe queste cifre, mentre il secondo è 1 solo per una di loro.
L’operatore or (|), dall’inglese “o” restituisce 1 se il primo operando è 1 o il secondo operando è 1. Per tutti gli altri casi restituisce 0.
L’operatore xor o or esclusivo (^) restituisce 1 se uno degli operandi è 1 e l’altro no.
L’operatore not (~), dall’inglese “no”, serve per negare ogni sequenza di bit, cioè, se l’operando è 0, cambia a 1 e se 1 cambia a 0.
Infine, gli operatori per lo shift (<< e >>) vengono utilizzati per spostare i bit di n posizioni a sinistra o a destra.

Operatore Descrizione Esempio
& and r = 3 & 2 # r es 2
| or r = 3 | 2 # r es 3
^ xor r = 3 ^ 2 # r es 1
~ not r = ~3 # r es -4
<< Spostamento a sinistra r = 3 << 1 # r es 6
>> Spostamento a destra r = 3 >> 1 # r es 1
Stringhe
Le stringhe o catene sono solo del testo racchiuso tra virgolette singole ('string') o doppie ("string"). All'interno delle virgolette è possibile aggiungere caratteri speciali di escape con \ come \n (il carattere di nuova riga) o \t (la tabulazione).
Una stringa può essere preceduta dal carattere u o dal carattere r; indicano, rispettivamente, che è una stringa che utilizza la codificazione Unicode o una stringa cruda (dall'inglese, crudo). Le stringhe raw si distinguono dalle normali, in quanto i caratteri di escape (backslash \) non vengono sostituiti. Ciò è particolarmente utile, per esempio, nelle espressioni regolari, come vedremo nel capitolo capitolo corrispondente.
			uni = u"äóè"
			raw = r"\n"
È anche possibile racchiudere una stringa tra virgolette triple (singole o doppie). In questo modo possiamo scrivere il testo su più righe; la stringa rispetterà le interruzioni di riga senza dover ricorrere a carattere \n, così come le virgolette al suo interno senza dover fare l'escape.
			triple = """Prima riga
                        questo sarà in un'altra linea"""
Le stringhe ammettono anche operatori come +, che funziona eseguendo una concatenazione tra stringhe utilizzate come operandi e *, che ripete la stringa tante volte quanto è indicato come numero nel secondo operando.
			a = "uno"
			b = "due"
			
			c = a + b # c diventa "unodue"
			c = a * 3 # c diventa "unounouno"
Booleani
Come accennato all'inizio del capitolo, una variabile booleana può avere solo due valori: True (vero) e False (falso). Questi valori sono particolarmente importanti per le espressioni condizionali e i loops (cicli), come vedremo di seguito.
In realtà il tipo bool (tipo booleano) è una sottoclasse del tipo int. Questo può non avere molto senso se non si conoscono i termini della programmzione ad oggetti; verranno discussi in seguito, ma non è niente di importante.
Questi sono i diversi tipi di operatori che possono lavorare con valori booleani, i cosiddetti operatori logici o condizionali:

Operatore Descrizione Esempio
and sono vere a e b? r = True and False # r è False
or sono vere a o b? r = True or False # r è True
not No a r = not True # r è False

I valori booleani sono anche il risultato di espressioni che usano operatori relazionali (confronto tra i valori):

Operatore Descrizione Esempio
== sono uguali a e b? r = 5 == 3 # r è False
!= sono diversi a e b? r = 5 != 3 # r è True
< è a minore di b? r = 5 < 3 # r è False
> è a maggiore di b? r = 5 > 3 # r è True
<= è a minore o uguale di b r = 5 <= 5 # r è True
>= è a maggiore o uguale di b r = 5 >= 3 # r è True


Similari
Overloading di metodi in Java
12% Java
Un metodo overload viene utilizzato per riutilizzare il nome di un metodo ma con argomenti diversi, opzionalmente con un differente tipo di ritorno. [expand title="Regole per overload" startwrap="" endwrap="" excerpt="⤽" s…
Modi di fare e di non fare in Python
11% Python
Questo documento può essere considerato un compagno del tutorial di Python. Viene illustrato come utilizzare Python, e quasi ancora più importante, come non usare Python. [expand title="Costrutti del linguaggio che non dov…
redirect 301 usando mod_alias
9% Server
mod_alias è fondamentalmente la versione più semplice di mod_rewrite. Non può fare le cose che fa mod_rewrite, ad esempio modificare la stringa di query. Per eseguire reindirizzamenti nel server web Apache è possibile di u…
Installare Python e Django su Windows
8% Django
Quando ci riferiamo allo sviluppo web con Python, la prima cosa che viene in mente è usare un qualche framework. Il più famoso e utilizzato da tutti è il Django, ma non è l'unico. Ci sono Pylons, Grok, TurboGears e Zope: t…
Metodi magici e costanti predefinite in PHP
8% Php
PHP fornisce un insieme di costanti predefinite e metodi magici per i nostri programmi. A differenza delle normali costanti i quali si impostano con define(), il valore delle costanti predefinite o speciali dipendono da do…