Tipi di dati

Tipi numerici

I tipi numerici sono int, float, decimal.Decimal e fractions.Fraction. Esiste anche il supporto per i numeri complessi.

I valori interi non sono limitati dalle caratteristiche del processore, per cui si ottiene una precisione che dipende solo dalla memoria:

>>> n=2**172
>>> print(n)
5986310706507378352962293074805895248510699696029696

In Python anche i semplici numeri interi sono oggetti, per i quali la memoria è allocata dinamicamente (oltre un certo valore, la quantità di memoria occupata dipende in maniera proporzionale dal numero di cifre).

Il tipo decimal.Decimal può essere utile per gli importi con decimali, che non possono essere approssimati come normalmente si fa per i valori in virgola mobile.

Booleani

I valori booleani sono di tipo bool. Le variabili possono essere impostate a True o False, ed esistono gli operatori and, or e not. Python usa una valutazione "di corto circuito" (ad esempio, se in un and il primo operando è falso, non viene valutato il secondo).

Stringhe

Le stringhe sono memorizzate in formato Unicode, per cui le conversioni minuscolo/maiuscolo funzionano anche con le lettere non US-ASCII e si ottengono codici numerici multi-byte:

>>> s="perché"
>>> s.upper()
'PERCHÉ'
>>> print(ord("€"))
8364
>>> print(chr(8364))
€

Sono a disposizione molte funzioni per operare sulle stringhe, troppe per elencarle qui.

Molto utile è la possibilità di analizzare parti di stringa (il cosiddetto slicing):

>>> name="Mario Rossi"
>>> print(name[0])
M
>>> print(name[1])
a
>>> print(name[0:4])
Mari
>>> print(name[-3])
s
>>> print(name[-3:])
ssi

È molto utile la possibilità di consultare una guida in linea direttamente nell'interprete di Python. Ad esempio, supponiamo di avere una variabile name con il valore "Pippo":

name="Pippo"

Digitando nell'interprete

name.

e attendendo qualche secondo, comparirà una lista di funzioni (metodi) associati all'oggetto name (capitalize, center, count, encode, ecc.).

Un elenco delle funzioni disponibili si può ottenere anche con il comando

dir(name)

oppure, se sappiamo che name è di tipo str, con

dir(str)

Se vogliamo avere informazioni su come usare una di queste funzioni, nell'esempio la funzione find, possiamo semplicemente digitare

help(name.find)

per ottenere informazioni sulla funzione stessa:

Help on built-in function find:

find(...)
    S.find(sub[, start[, end]]) -> int

    Return the lowest index in S where substring sub is found,
    such that sub is contained within s[start:end].  Optional
    arguments start and end are interpreted as in slice notation.

    Return -1 on failure.

Sequenze

Le sequenze sono tipi di dati avanzati con i quali è possibile iterare e usare l'operatore di appartenenza in. Inoltre, con esse si può usare la funzione len() e lo slicing ("affettatura", come con le stringhe, quando si estraggono i caratteri).

Tra le sequenze ricordiamo, oltre alle stringhe:

  • le tuple (sequenze immutabili)
  • le liste (sequenze modificabili)
  • i byte
  • gli array di byte

Parleremo delle ultime due in occasione delle lezioni sui file binari.

I valori delle sequenze sono riferimenti a oggetti, e gli oggetti possono essere di tipo diverso. Quindi, è possibile che in una sequenza siano compresi, mescolati tra loro, numeri interi, numeri in virgola mobile, stringhe, tuple, liste, ecc.

Tuple

Le tuple sono insiemi di dati (o, meglio, di riferimenti ad oggetti). Una volta create, non sono modificabili.

>>> mynumbers=(2, 10, 12, 17, 18)
>>> 2 in mynumbers
True
>>> 3 in mynumbers
False
>>> mynumbers[0]
2
>>> mynumbers[-1]
18
>>> mynumbers[3:5]
(17, 18)

ma...

>>> mynumbers[0]=3
Traceback (most recent call last):
  File "<pyshell#41>", line 1, in <module>
    mynumbers[0]=3
TypeError: 'tuple' object does not support item assignment

Le tuple possono essere usate anche a sinistra per assegnare più valori in un colpo solo:

a,b,c = mynumbers[0:3]   # si estraggono tre valori e li si assegna
a,b,c,*others = mynumbers # tutti i valori sono considerati, ma i rimanenti vengono messi in una lista

Per far sì che una tupla contenga un solo elemento, è necessario mettere una virgola dopo il valore:

>>> a=(1234,)
>>> a
(1234,)
>>> len(a)
1

Diverse sintassi per la creazione di una tupla

Per creare una tupla si possono usare diverse notazioni. Queste due sono equivalenti (ma la seconda è raccomandabile per chiarezza):
>>> a=12,32,44,67
>>> a=(12,32,44,67)

Per creare una tupla a partire da un'altra sequenza, si può usare forzare la conversione:

>>> c=[12,34,45] # questa è una lista
>>> b=tuple(c) # la tupla b viene creata con i dati di c

Liste

Le liste sono insiemi di riferimenti come le tuple, ma a differenza di queste possono essere modificate (si possono cambiare i valori degli elementi, aggiungerne, toglierli, ecc.).

>>> mycats=['Birillo', 'Fuffi', 'Silvestro']
>>> mycats.append('Billy')
>>> mycats
['Birillo', 'Fuffi', 'Silvestro', 'Billy']
>>> print(mycats)
['Birillo', 'Fuffi', 'Silvestro', 'Billy']
>>> mycats[0]='Ribillo'
>>> mycats[0]='Ribillo'
>>> lastcat=mycats.pop()
>>> print(lastcat)
Billy

Ad una lista possono essere aggiunti elementi in coda (prendendoli da un'altra lista o uno a uno). Gli elementi possono anche essere inseriti nella posizione desiderata:

>>> mydogs=['Fido', 'Bobbie', 'Charlie']
>>> mydogs
['Fido', 'Bobbie', 'Charlie']
>>> lostdogs=['Dunnie', 'Bah']
>>> mydogs.extend(lostdogs)   # aggiunge in coda un'intera lista
>>> mydogs
['Fido', 'Bobbie', 'Charlie', 'Dunnie', 'Bah']
>>> mydogs.insert(1, 'Birillo')   # inserisce un elemento nella posizione prima di quella indicata
>>> mydogs
['Fido', 'Birillo', 'Bobbie', 'Charlie', 'Dunnie', 'Bah']

Ordinamento

Una lista può essere ordinata con il metodo sort():

>>> print(mycats)
['Fuffi', 'Ribillo', 'Silvestro', 'Billy']
>>> mycats.sort()
>>> print(mycats)
['Billy', 'Fuffi', 'Ribillo', 'Silvestro']

L'ordinamento può avvenire solo a patto che gli oggetti della lista siano comparabili. Ad esempio, una lista contenente tuple e numeri interi non può essere ordinata direttamente:

>>> mynumbers=[ (12, 34), 13 ]
>>> mynumbers.sort()
TypeError: unorderable types: int() < tuple()

È però possibile definire una funzione da richiamare per riportare a un tipo comune gli oggetti della lista (ad esempio, potremmo decidere di estrarre il primo valore di una tupla e considerarlo per la comparazione), e poi usare la funzione come argomento del metodo sort:

def FirstItem(a):
   if isinstance(a, tuple):
       return a[0]
   return a

mynumbers=[ (12, 34), 13 ]
mynumbers.sort(key=FirstItem)
print(mynumbers)

mynumbers=[ (12, 34), 11 ]
mynumbers.sort(key=FirstItem)
print(mynumbers)

[(12, 34), 13]
[11, (12, 34)]

Diverse sintassi per la creazione di una lista

Per creare una lista si usano, come visto negli esempi, le parentesi quadre

>>> a=[12,32,44,67]

Per creare una lista a partire da un'altra sequenza, si può usare forzare la conversione:

>>> m=(12,34,45) # questa è una tupla
>>> n=list(m) # la lista n viene creata con i dati di m

results matching ""

    No results matching ""