Dispensa Python
Dispensa Python
COMPUTER SCIENCE:
PYTHON
EDIZIONE A.A. 2018 - 2019
1
Sponsored by
Sponsored by
2
Questa dispensa è scritta da studenti senza alcuna intenzione di sostituire i materiali universitari. Essa costituisce
uno strumento utile allo studio della materia ma non garantisce una preparazione altrettanto esaustiva e completa
quanto il materiale consigliato dall’Università.
3
INTRODUZIONE A PYTHON
CHE COS’È PYTHON
Python è un linguaggio di programmazione interpretato, interattivo e orientato agli oggetti di alto livello.
Questo linguaggio è stato rilasciato nel 1991 e da allora sono state sviluppate diverse versioni, che hanno
contribuito ad accrescere progressivamente la sua popolarità, data anche dalla semplicità di utilizzo rispetto
ad altri linguaggi.
La diffusione di Python è, inoltre, dovuta al suo essere un linguaggio open source, ampliato continuamente
con librerie e al suo essere compatibile con tutti i sistemi operativi più diffusi.
Abbiamo detto che Python è un linguaggio interattivo, ciò significa che è possibile scrivere varie istruzioni nel
suo prompt di comandi (la cosiddetta shell); Python è inoltre orientato agli oggetti, in quanto la soluzione dei
problemi non avviene semplicemente come sequenza di istruzioni, piuttosto in termini di oggetti e di attributi
relativi ad essi (per comprendere meglio cosa si intende vedi ultimo capitolo della dispensa).
Infine, è fondamentale in Python la tipizzazione dinamica delle variabili: in questo linguaggio, infatti, uno degli
elementi fondamentali sono proprio le variabili che contengono dati o valori frutto dei calcoli e delle
operazioni eseguite dal programma.
Selezionando in alto nella scheda il pulsante Options à Configure IDLE si accede alle diverse opzioni di IDLE,
che possono essere modificate in qualsiasi momento e che contengono, tra le altre cose anche le Keys, cioè
le diverse combinazioni di tasti (shortcut), che permettono di lavorare più agevolmente. Una combinazione
importante è quella del history-previous (ALT+p), che richiama l’ultimo comando inserito che si vuole
riscrivere.
Nella scheda Highlights è possibile vedere a cosa corrisponde ogni colore utilizzato durante la
programmazione. Questo linguaggio, infatti, ha dei colori assegnati ai vari tipi di elemento (essi inseriti
automaticamente mentre si scrive):
• Viola: funzioni built-in (esempio: print);
• Verde: stringhe di testo (tra apici o virgolette) ma anche i commenti inseriti fuori dalle righe di codice.
• Blu: output dell’istruzione oppure nomi di funzione (dome funzioni user-defined e classi);
• Rosso: errore ma anche commenti inseriti nelle righe (i commenti sono preceduti dal #);
• Arancione: keywords, le parole chiave (esempio: if, else, ecc.);
4
SCRIVERE ED ESEGUIRE UN PROGRAMMA
Per scrivere un nuovo programma bisogna, come già accennato, aprire l’editor. È possibile mantenere aperta
sia la finestra della shell sia quella dell’editor. Una volta scritto il codice nell’editor bisogna salvare il file, tramite
il pulsante File à Save As, che permette il salvataggio di un file non ancora rinominato, oppure tramite File à
Save, che invece si utilizza per i file già rinominati ai quali sono state apportate delle modifiche.
Inoltre, è possibile salvare una copia del file mantenendo però aperto l’originale (File à Save Copy As).
Non appena salvato il file sarà possibile o eseguire il programma (Run à Run module), oppure effettuare un
controllo della sintassi, che rileverà e indicherà eventuali errori nel codice (Run à Check Module).
Se si decide di eseguire il programma senza aver fatto il check, qualora vi fosse un errore comparirà il
messaggio invalid syntax e la posizione dell’errore verrà segnalata in rosso nell’editor prima che il programma
venga eseguito nella shell.
Se si vuole aprire un file con estensione .py non bisogna fare doppio click sul file, sia che si voglia eseguire
sia che si voglia semplicemente aprire. Per aprire un file di questo tipo bisogna cliccare con il tasto destro e
selezionare Apri à Edit with IDLE.
Python è un programma che non è rigido per quanto riguarda gli spazi, infatti è possibile inserire o meno gli
spazi tra diversi elementi poiché il programma li riconoscerà a prescindere. Per esempio, è possibile scrivere
3+3 oppure 3 + 3 e la somma verrà comunque effettuata; è comunque preferibile lasciare gli spazi per una
migliore leggibilità o quantomeno mantenere una certa coerenza (mettere tutti gli spazi oppure nessuno).
Python è invece rigido per ciò che concerne la cosiddetta indentazione, cioè il rientro rispetto ad altre righe
di alcune stringhe di testo. L’indentazione è necessaria nella scrittura di alcune istruzioni: si pensi, per
esempio, alla parola chiave if, che richiede l’indentazione per tutti i comandi pertinenti ad essa.
A proposito di parole chiave, è bene ricordare che le keywords di Python hanno un significato ben preciso e
non possono essere utilizzate per altri scopi.
Le keywords di Python sono:
5
Oltre alle parole chiave, sono presenti in Python anche degli operatori matematici: +, -, *, /, //, %, ** (spiegati
successivamente.
In Python gli unici operatori matematici che possono essere utilizzati con delle stringhe di testo sono + (che
concatena le varie stringhe) e * (che ripete la stringa più volte). Non è possibile, invece, eseguire operazioni
tra stringhe anche se il loro contenuto sembra numerico.
Quando si utilizzano stringhe di testo, come nella funzione print, è bene che la stringa sia racchiusa tra apici
(‘ ‘) o virgolette (“ “), a seconda che nella stringa sia necessario utilizzare rispettivamente le virgolette o gli
apici; nel caso di stringhe che vanno su più righe bisognerà utilizzare tripli apici o triple virgolette.
Infine, a proposito di stringhe di testo, qualora stessimo scrivendo una stringa troppo lunga e volessimo
andare a capo, senza però che l’output finale vada a capo, è possibile farlo inserendo, prima di andare a capo
un backslash ( \ ).
TIPI DI ERRORE
Vi sono due tipi di errore che possono presentarsi:
• Errore di sintassi: in questo caso verrà mostrato il messaggio SyntaxError: invalid syntax, se non è
stata rispettata una regola di sintassi.
• Errore durante l’esecuzione del programma: quando la sintassi è corretta ma sorge un problema di
esecuzione. In questo caso viene mostrato un messaggio di questo tipo:
e l’ultima riga del messaggio contiene la spiegazione di ciò che è successo. Vi è, inoltre, l’indicazione
del tipo di errore (NameError, TypeError, ecc.)
CODICI DI ESCAPE
I codici di escape (sequenze di escape o caratteri di escape) sono dei comandi preceduti dal backslash ( \ ),
posizionati all’interno di una stringa. I codici di escape più comuni sono:
FUNZIONI BUILT-IN
Le funzioni sono parti di codice “preconfezionate” che eseguono determinate operazioni. In Python sono
presenti varie funzioni già integrate nel programma, esse sono perciò dette built-in.
Il nome di una funzione viene visualizzato in viola mentre la stringa di testo racchiusa tra virgolette o apici è
colorata in verde. Gli altri elementi della funzione (es. variabili) sono, invece, visualizzate in nero.
Quando si scrive il nome della funzione è necessario scriverlo tutto in minuscolo, in quanto Python fa
distinzione tra maiuscole e minuscole.
Ogni qualvolta scriviamo il nome della funzione e apriamo la parentesi ci viene mostrato in un riquadro giallo
il cosiddetto call tip contenente la sintassi della funzione, cioè i diversi parametri che possiamo inserire, tutti
separati dalla virgola. È possibile modificare le impostazioni dei call tip tramite il pulsante Edit à Show Call
Tip se questi non sono visibili.
Un esempio di funzione built-in è la funzione print, che permette di stampare sullo schermo una stringa di
testo. I parametri fondamentali della funzione print sono: value (stringhe o elementi che vogliamo stampare),
sep=’ ‘, che indica con cosa vogliamo separare i vari elementi, e end=\n.
6
interattiva e permette di cercare informazioni su un tipo di dato, su una funzione o su altri elementi di Python.
Possiamo anche utilizzare la funzione help su sé stessa cercando ‘help(help)’ e premendo invio.
Infine, se scriviamo solamente help() si entra in una modalità interattiva in cui è possibile visualizzare
informazioni su più elementi, uno dopo l’altro.
Altri tipi di supporti vengono messi a disposizione anche tramite il programma Python 3.x Manuals, che
include una versione navigabile della documentazione su Python. È poi possibile trovare altre informazioni
sul sito ufficiale www.python.org
N.B. con l’operazione divisione intera viene troncata la parte decimale non arrotondando se il numero è
positivo come nell’es. ma arrotondando per difetto se il risultato è negativo.
PRECEDENZE E FORMULE
La precedenza nello svolgere espressioni segue l’ordine comune dell’algebra quindi parentesi, elevamento
a potenza e poi tutti gli altri operatori. Es. (10 - 2) ** 7 ** 2 = (87)2 = 814.
In Python inoltre non è possibile omettere alcuna parentesi o segno, es. 2xy dovrà essere 2 * x * y.
FUNZIONE FORMAT
Per poter modificare come vengono visualizzati i numeri in Python si ricorre alla funzione format. Es. se
volessimo formattare 10/3 = 3.333333333 si proseguirebbe così: format(10/3,'.2f'), e quindi il nostro output
sarebbe 3.33. La funzione è composta da due argomenti: il primo è il valore da formattare e il secondo è
l’indicazione di formattazione, si indica tra apici e in tal caso si va a dire a Python di prendere fino alla seconda
cifra decimale, f = float (ossia decimale).
Vi sono altri stili di formattazione come ‘.%’ che va a moltiplicare per cento e quindi ad esprimere in
percentuale il risultato o ancora ‘,.2f’ dove oltre a prendere 2 cifre decimali si va anche a separare le migliaia
con una virgola.
7
ALTRE FUNZIONI MATEMATICHE
sum = somma elenco di elementi indicati tra parentesi >>>sum((4, 5, 6))
15
pow = elevamento a potenza >>>pow(4, 2)
16
abs = valore assoluto >>>abs(-8)
8
max e min = calcolano max e min di un elenco di elementi tra parentesi >>>max(1, 5, 7)
7
round = arrotonda un numero float alla cifra indicata come secondo elemento >>>round(1.55, 1)
1.6
N.B. Un elenco di elementi separati da virgole e tra parentesi tonde si dice tupla, mentre tra parentesi quadre
si dice lista.
Queste funzioni appena viste costituiscono le funzioni built-in di Python, oltre ad esse vi sono le funzioni della
libreria standard (già installate ma con necessità di esser richiamate quando le si vuole utilizzare in un nuovo
file) e le funzioni di librerie esterne.
Un esempio comune di funzione dalla libreria standard è la funzione random.randint(a,b), appartenente alla
libreria ‘random’, che va a dare come output un numero casuale compreso tra a e b
Le variabili sono molto importanti in quanto possono essere utilizzate all’interno delle funzioni (senza
bisogno di utilizzare gli apici o le virgolette) per facilitare la scrittura del programma.
Bisogna ricordare però che se si utilizza una variabile che non è stata inizializzata il programma restituisce un
errore (es. utilizzare la variabile “nome” senza averla inizializzata restituisce: NameError: name “nome” is not
defined).
8
>>> cognome_nome = ‘Rossi Mario’
oppure
>>> cognomeNome = ‘Rossi Mario’
Infine, è bene utilizzare lettere minuscole, ricordando che Python è un linguaggio case sensitive (che
distingue maiuscole e minuscole).
Bisogna anche fare attenzione a utilizzare come nomi di variabili dei nomi di funzioni: nel momento in cui, per
esempio, utilizziamo ‘print’ come nome di variabile, la funzione print perde la sua utilità e utilizzandola si avrà
un errore del tipo TypeError: ‘int’ object is not callable. Per far tornare la funzione alla propria funzionalità di
partenza bisogna riavviare la Shell.
RIASSEGNAZIONE
Nel corso della scrittura del programma è possibile riassegnare un valore a una variabile tramite il processo
di riassegnazione. Se per esempio abbiamo la variabile:
>>> a = 1
In seguito, potremo scrivere anche
>>> a = a +1
In questo modo il valore precedente viene eliminato dalla memoria
SPACCHETTAMENTO
Infine, è possibile effettuare il cosiddetto spacchettamento, o assegnamento multiplo, mediante in quale si
inizializzano più variabili in una sola volta.
TIPI DI DATI
La tipizzazione di Python è dinamica, nel senso che è il programma stesso a capire di che tipo di variabile si
tratta, senza che sia l’operatore a doverlo specificare (come invece avviene nella tipizzazione statica).
I tipi di dati elementari in Python sono:
Esistono anche le liste che sono un tipo di dati complesso (es. x = [1, 2, 3]).
Per riconoscere il tipo di dato con cui stiamo lavorando è possibile utilizzare la funzione type che ci restituisce
come risultato il tipo di dato del valore in questione.
>>> type(‘Python3’)
<class ‘str’>
Bisogna ricordare che non esiste un tipo di dato come “valuta” perciò, anche scrivendo ‘$100.90’ si ha come
tipo una stringa di testo. Se si desidera avere, come risultato di una funzione, un numero con la formattazione
della valuta bisogna utilizzare la funzione format:
N.B. Utilizzando il + al posto della virgola la funzione non restituisce lo spazio tra $ e il numero.
9
FUNZIONI DI CONVERSIONE TRA TIPI
A volte è necessario convertire un valore da un tipo di dato in un altro per poter eseguire determinate
operazione, magari perché una funzione restituisce uno str quando invece ci serve un int o float.
FUNZIONE INT
La funzione int prende un valore e lo converte, se possibile, in numero intero.
In questo modo abbiamo solo visualizzato il valore intero corrispondente ma non abbiamo convertito il tipo.
Se invece operiamo in questo modo possiamo convertire il tipo di dato da str a int:
Se la conversione non dovesse essere possibile comprare l’errore di tipo ValueError: invalid literal for int() with
base 10: ‘stringa inserita’
Se convertiamo un float in int allora i numeri dopo il punto verranno troncati e non arrotondati.
FUNZIONE FLOAT
La funzione float converte interi e stringhe (se possibile) in numeri a virgola mobile.
>>> float(10)
10.0
FUNZIONE STR
Essa converte il valore del suo argomento in una stringa di testo. Questa funzione è molto utile quando
vogliamo visualizzare risultati che siano composti sia da numeri che da stringhe (es. se vogliamo visualizzare
un formato in valuta:
>>> profit = 100
>>> ‘€’ + profit
Mostra un errore, in questo caso dobbiamo prima convertire il valore numerico in stringa.
LA FUNZIONE INPUT
La funzione input consente all’utente di immettere dei dati nella tastiera, che verranno poi utilizzati dal
programma.
È molto frequente che venga utilizzata insieme alle variabili, in modo che ciò che viene digitato possa essere
utilizzato in altre funzioni come variabile.
>>> variabile = input(prompt)
Dove prompt indica ciò che viene chiesto all’utente.
Il tipo restituito è sempre uno str anche se si tratta di un valore numerico, infatti se cercassimo di
incrementare la variabile il programma ci restituirebbe un errore:
10
STRUTTURE DECISIONALI E LOGICA
BOOLEANA
L’ISTRUZIONE IF
Finora abbiamo visto solo codici sequenziali ovvero dove si eseguono le istruzioni una dopo l’altra, questi
sono detti più propriamente strutture sequenziali. Vi sono però dei casi in cui il programma in base a una
condizione o al valore di un parametro deve applicare scelte diverse, in questi casi si usano strutture
decisionali.
In Python le strutture decisionali si implementano tramite l’uso di istruzioni condizionali.
L’if è un’istruzione condizionale e si utilizza come segue.
Subito dopo l’if è presente la condizione che se è vera allora si eseguono le istruzioni a, b ecc. se invece è
falsa allora si salta il blocco di istruzioni.
ESPRESSIONI BOOLEANE
Le condizioni dell’istruzione if sono espressioni booleane, ovvero che possono restituire (True o False, N.B.
la maiuscola è necessaria) a seconda che siano vere o false. Questi valori sono di tipo bool, non stringhe.
In tal caso se la condizione x >= 0 è vera si procede con l’istruzione print, se è falsa si salta il ramo e in questo
caso il programma termine non essendoci altro.
L’ISTRUZIONE IF-ELSE
Si analizza ora una struttura decisionale ad alternativa doppia, come segue
11
Con tale struttura si procede in modo duale, se la condizione dopo l’if è vera si procede con le istruzioni a e
b, se è falsa con le istruzioni dell’else, c e d.
Es.
L’ISTRUZIONE IF-ELIF-ELSE
Il funzionamento è come la struttura if-else ma con uno o più comando elif nel mezzo, il comando elif si può
vedere come un insieme di else-if; in tal modo si costruiscono delle strutture decisionali ad alternativa
multipla.
COSTRUTTI ITERATIVI
I CICLI
I cicli sono strutture di controllo iterative che vengono utilizzate per eseguire uno stesso blocca di codice più
volte.
Vi sono due principali tipi di cicli:
• I cicli controllati da una condizione
• I cicli controllati da un contatore
Essi differiscono nella modalità con cui viene stabilito per quante volte la stessa operazione deve ripetersi.
IL CICLO WHILE
L’istruzione while permette di creare un ciclo controllato da una condizione ed è composta da
• La clausola while, con una condizione che assume i valori booleani (vero/falso) e termina con i due
punti
• Un’istruzione o un blocco di istruzioni che risultano indentate
Ciò significa che, fino a quando la condizione di partenza sarà vera, il blocco di
istruzioni inserite verrà eseguito. Quando la condizione diventa falsa allora si
esce dal ciclo while e si passa all’esecuzione degli eventuali altri comandi.
Es. Risultato:
12
Se il ciclo non ha una fine facilmente definibile è possibile utilizzare non while ma while True, con il quale
non è necessario ribattezzare la variabile prima di inserirla nel ciclo.
In while True è necessario, tuttavia, utilizzare la keyword if, la cui istuzione deve essere la keyword break
(permette di uscire dal ciclo).
Es.
IL CICLO FOR
Il ciclo for, invece, è un ciclo controllato da un contatore, in quanto le istruzioni vengono ripetute per un
numero determinato di volte.
Esso è composto da:
• La clausola for con il nome di una variabile contatore, la parola in (ed eventualmente il range) e i due
punti di chiusura.
• Un’istruzione o un blocco di istruzioni che risultano indentate
Alla variabile contatore viene assegnato il primo valore della lista o del range (a seconda che vi sia in o in
range) e alle esecuzioni successive il valore della variabile viene incrementato, fino alla fine della lista o del
range. Il numero di esecuzioni è quindi limitato.
Es. oppure à
LA FUNZIONE RANGE
Vediamo più nello specifico cos’è la funzione range, che abbiamo utilizzato nel ciclo for.
Essa è una funzione built-in si Python e ha la seguente sintassi:
>>> range(start, stop, step)
Start indica il punto di partenza, il numero (necessariamente intero) da cui si parte, stop è, invece, il punto di
arrivo (anche questo un numero intero), infine, step indica gli eventuali intervalli tra un numero e l’altro che la
funzione può mostrare (di default è 1).
Se si omette lo start la funzione inizierà a contare da zero. È necessario ricordare che lo stop è escluso dal
conteggio, quindi se scriviamo: range(1,5) l’estremo 5 non è compreso.
Es. di comportamento della funzione:
range(1,5) à 1,2,3,4
range(5) à 0,1,2,3,4
range(1,5,2) à 1,3
range(5,1,-1) à 5,4,3,2
Se inseriamo un numero di tipo float all’interno di range il programma ci restituisce un errore di tipo
TypeError: ‘float’ object cannot be interpreted as an integer
CICLI NIDIFICATI
È possibile creare dei cicli nidificati, inserendo for e while all’interno di altri cicli.
Possiamo per esempio inserire un ciclo for in un altro ciclo for, oppure un ciclo for in un ciclo while, oppure,
ancora, un ciclo while all’interno di un altro ciclo while.
13
ISTRUZIONI BREAK E CONTINUE
Le istruzioni break e continue sono spesso inserite all’interno dei cicli.
L’istruzione break viene utilizzata quando si vuole interrompere l’esecuzione di un ciclo forzando
l’interruzione; continue viene invece utilizzata quando si attende di completare la scrittura delle istruzioni, ma
si vuole evitare un’interruzione del programma. Durante l’esecuzione, quindi, il programma andrà avanti al
posto di bloccarsi.
FUNZIONI
Oltre alle funzioni già presenti in Python è possibile andare a crearne di personalizzate, a cui si assegna un
nome nel programma stesso. L’uso di funzioni personalizzate consente di costruire programmi modulari, i
quali portano numerosi vantaggi: possibilità di riutilizzare il codice, maggiore semplicità del codice e
miglioramento della fase di test.
Vi possono essere però anche funzioni che non necessitano parametri, in tal caso si scrivono comunque le
parentesi ma si lasciano vuote.
Per chiamare (far partire) una funzione è sufficiente digitare nella shell il nome della funzione e i parametri se
necessari:
>>> nome_funzione(parametri)
I parametri sono divisi tra loro da virgole e si usano nel definire una funzione, ossia quando a e b avranno dei
valori (numerici nel nostro caso) allora saranno richiamati dalla funzione e diverranno argomenti della
funzione stessa. I parametri sono quindi dei segna posti degli argomenti:
>>> a = 9
>>> b = 4
>>> sottrai (a, b)
Il risultato della sottrazione è: 5
Vi possono essere parametri obbligatori e opzionali, i primi sono necessari mentre i secondi se non vengono
definiti hanno un valore predefinito da assumere:
14
In Python i parametri vengono normalmente presi in ordine:
>>>sottrai(7, 4)
In tal caso a = 7 e b = 4
È possibile comunque scegliere quale parametro, assumerà quale valore; in tal caso gli argomenti sono detti
argomenti denominati.
>>> sottrai(b = 7, a = 5)
-2
FUNZIONI PRODUTTIVE
Se in una funzione inseriamo l’istruzione return alla fine, allora il risultato della funzione rimane salvato in
memoria e lo si può richiamare, in tal caso la funzione è detta produttiva:
Se una funzione non è produttiva (es. tutte le precedenti a questo paragrafo) è detta funzione void, in quanto
non mantiene il risultato.
Ora mentre x è variabile globale, ‘c’ è invece locale. Se infatti provassimo a richiamare c si avrebbe un
messaggio di errore.
È inoltre possibile inserire una stringa di documentazione detta docstring, ossia un commento che spieghi o
dia informazioni sulla funzione. Tale docstring va inserita tra triple virgolette e subito dopo la definizione della
funzione:
Dalla shell verifichiamo come nel caso della x il valore si sia salvato grazie al “return” (sesta riga), mentre nel
caso della y no, poiché le altre funzioni sono void.
15
STRINGHE E LISTE
SEQUENZE
Una sequenza è un oggetto che contiene diversi dati. Le forme più comuni e semplici di sequenze sono le
stringhe e le liste. Esse presentano delle differenze, ma hanno anche delle affinità: per esempio, sia per le liste
che per le stringhe possono essere utilizzate varie funzioni e operazioni.
STRINGHE
Una stringa di testo è una sequenza alfanumerica di caratteri. Per indicare l’inizio e la fine di una stringa
bisogna utilizzare o gli apici ( ‘ ) oppure le virgolette ( “ ). La caratteristica delle stringhe è quella di essere
immutabili, infatti, per modificare il contenuto di una stringa assegnata a una variabile è necessario
assegnare alla variabile una nuova stringa corretta, oppure creare una nuova variabile, diversa dalla prima.
Operatore Operazione
+ Concatena più stringhe senza lasciare spazi. Non può concatenare tipi di dati diversi. Può
essere utilizzato nelle funzioni.
* Crea una stringa ripetendo n volte la stringa inziale.
in Restituisce True se la stringa è contenuta in un’altra, altrimenti False.
not in Funziona in maniera esattamente contraria alla funzione in.
is Restituisce True se una stringa è uguale all’altra, altrimenti False.
is not Funziona in maniera esattamente contraria alla funzione is.
Esempi:
>>> testo = ‘buon’ + ‘ giorno’ >>> ‘Python’*2 >>> x=’Roma è la capitale’
‘buongiorno’ ‘PythonPython’ >>> ‘capitale’ in x
True
LISTE
Una lista è una raccolta di diversi dati, ciascuno dei quali chiamato elemento. I vari elementi di una lista sono
racchiusi tra parentesi quadre e divisi da virgole. Le liste possono contenere, tipi di dati diversi, quindi non
devono necessariamente essere uniformi. Se volessimo visualizzare il contenuto di una lista possiamo
utilizzare la funzione print(lista).
Esiste anche una funzione list, che permette di creare una lista in questo modo:
Operatore Operazione
+ Unisce più liste, anche se si tratta di tipi di dati diversi.
* Crea una lista composta dalla ripetizione della lista iniziale.
in Restituisce True se l’elemento è contenuto nella lista, altrimenti False.
not in Funziona in maniera esattamente contraria alla funzione in.
16
INDICIZZAZIONE
L’indicizzazione (indexing) è un modo per accedere a singoli elementi di stringhe o liste. Ogni elemento
ha, infatti, una determinata posizione in una sequenza. È bene notare che se il conteggio parte da sinistra
allora si avranno numeri positivi (a partire da 0), se parte da destra invece i numeri saranno negativi (a partire
da -1).
L’indicizzazione avviene in questo modo:
>>>sequenza[indice]
Es.
N.B l’indice di ‘Roma’ è 0, quello di
‘Parigi’ è 1, quello di ‘Tokyo’ è 2.
SLICING
Lo slicing consente di selezionare una precisa parte di una stringa o lista, utilizzando gli indici.
Si utilizza in questo modo:
>>> sequenza[indice_iniziale:indice_finale]
Bisogna ricordare che, mentre l’indice inziale (lettera della stringa/elemento della lista) è incluso, l’indice
finale è escluso dalla selezione.
Se l’indice iniziale è omesso allora la selezione avviene a partire dalla posizione 0, se invece è omesso l’indice
finale la selezione avviene fino alla fine della sequenza.
Possiamo anche introdurre il cosiddetto step, nel caso volessimo selezionare delle posizioni equidistanti
(come lo step della funzione range).
È possibile anche effettuare lo slicing con indici negativi, ma in questo caso lo step deve essere anch’esso
negativo. Se, invece, volessimo utilizzare uno step negativo con indici positivi, in questo caso dovremmo
invertire l’indice iniziale con quello finale.
N.B poiché le liste sono mutabili è possibile utilizzare lo slicing per modificare uno o più elementi delle liste.
Es.
Funzione Descrizione
len() Restituisce la lunghezza di una stringa, contando i caratteri. È spesso usata nei cicli dentro
alla funzione range.
min() Restituisce il valore più piccolo, se si tratta di lettere la più piccola è la ‘a’. Distingue tra
maiuscole e minuscole
max() Restituisce il valore più grande, se si statta di lettere la più grande è la ‘z’. Distingue tra
maiuscole e minuscole.
17
I metodi sono delle funzioni legate ad un preciso oggetto e seguono questa forma:
stringa.metodo(argomenti).
Metodo Descrizione
.upper() Restituisce la stringa tutta in caratteri maiuscoli.
.lower() Restituisce la stringa tutta in caratteri minuscoli.
.capitalize() Restituisce la stringa con la prima lettera maiuscola e le altre minuscole.
.strip() Restituisce la stringa dove gli spazi iniziali e finali sono stati rimossi.
.find(sub) Cerca nella stringa la sottostringa specificata (sub) e restituisce l’indice della prima
occorrenza trovata. Se la sottostringa non viene trovata viene restituito -1.
.replace(old,new) Restituisce la stringa in cui tutte le occorrenze della sottostringa old sono state
sostituite dalla new.
.startswith(prefix) Restituisce True se viene trovato, all’inizio, il prefix, altrimenti viene restituito False.
.endswith(subfix) Restituisce True se viene trovato, alla fine, il subfix, altrimenti viene restituito False.
.count(sub) Restituisce il numero delle volte in cui compare nella stringa la sottostringa cercata.
.split(iterable) Divide le stringhe ad ogni spazio (predefinito) e restituisce una lista di stringhe. È
possibile inserire un separatore diverso come argomento. Può anche essere
aggiunto come argomento anche maxsplit che indica il numero massimo di divisioni
da effettuare (quello predefinito è -1 che indica di separare fino alla fine della
stringa).
.join(iterable) Concatena gli elementi di una lista contenente solo stringhe e crea una stringa
unica. Il metodo si applica al separatore (es. separatore_stringa = ‘/ ‘) mentre la lista è
l’argomento tra parentesi. Es. separatore_stringa.join(lista)
Funzione Descrizione
len() Restituisce la lunghezza di una lista, cioè il numero di elementi.
min() Restituisce l’elemento che inizia con il valore più piccolo. Nel caso di lista con
elementi misti la funzione restituisce errore. Distingue tra maiuscole e minuscole.
max() Restituisce l’elemento che inizia con il valore più grande. Nel caso di lista con
elementi misti la funzione restituisce errore. Distingue tra maiuscole e minuscole.
list() Converte un oggetto iterabile in una lista.
sorted() Restituisce una lista ordinata in maniera crescente. Nel caso di lista con elementi
misti la funzione restituisce errore.
sum() Restituisce la somma di tutti gli elementi della lista, solo nel caso siano tutti numeri.
Metodo Descrizione
.append(element) Accoda nuovi elementi alla lista. È possibile utilizzarla anche nelle istruzioni dei
cicli (ricordando di creare una lista vuota a cui verranno aggiunti dei valori. Vedi
esempio).
.insert(index,element) Inserisce l’elemento desiderato nella posizione specificata dal parametro index.
N.B l’elemento precedente presente in quella posizione non viene eliminato,
semplicemente si sposta.
.remove(element) Cerca l’elemento richiesto ed elimina la prima occorrenza.
.pop([index]) Cerca l’elemento corrispondente all’indice inserito e lo elimina, se si omette
l’indice viene eliminato l’ultimo elemento. Il metodo .pop restituisce l’elemento
eliminato, che può essere riutilizzato in altre operazioni.
.extend(list2) Accoda la lista indicata nell’argomento alla lista di partenza.
18
.index(element) Cerca l’elemento e restituisce l’indice corrispondente; se l’elemento compare
più volte restituisce solo la prima occorrenza.
.sort() Ordina in maniera crescente la lista, cambiando l’ordine degli elementi.
.reverse() Inverte gli elementi della lista.
NB. Se si vuole mantenere la lista originale bisogna prima copiarla e poi
modificare quest’ultima, lo stesso per il metodo .sort.
.clear() Rimuove tutti gli elementi di una lista.
.count(element) Conta quante volte compare un determinato elemento in una lista.
.copy() Restituisce una copia della lista.
Es.
Alla fine la lista conterrà i valori: [ 0, 15, 30, 45, 60, 75, 90 ]
Se invece volessimo sostituire o inserire dei determinati valori in una lista (es. elevare al quadrato solo i
numeri pari) potremmo fare così:
La prima è la lista iniziale, mentre la seconda è quella finale, con i soli numeri pari elevati al quadrato.
LISTE BIDIMENSIONALI
È possibile che gli elementi di una lista siano a loro volta liste; in questo caso si parla di liste bidimensionali.
Bisogna tener presente che ogni elemento/lista appartenente alla lista principale ha un determinato indice,
ma anche ogni sotto-lista contiene degli elementi, che a loro volta hanno un determinato indice. Per riferirsi
ai singoli elementi della sotto-lista quindi si scrive:
lista_principale[indice_principale][indice_sottolista]
Per facilitare la comprensione di questo tipo di liste spesso si utilizza la rappresentazione attraverso righe e
colonne.
Per esempio se noi avessimo una lista di questo tipo: clienti = [[‘Rossi’, 40, ‘OK’],[‘Verdi’, 25, ‘NO’]]
potremmo rappresentarla così:
19
[0] [1] [2] Quindi, l’indicizzazione avviene in questo modo:
[0] ‘Rossi’ 40 ‘OK’ lista_principale[indice_riga][indice_colonna].
[1] ‘Verdi’ 25 ‘NO’ Es. l’indice di ‘Verdi’ è clienti[1][0].
TUPLE E DIZIONARI
TUPLE
Una tupla è una sequenza di elementi racchiusi tra parentesi tonde e separati tra loro da una virgola (in
realtà potrebbero funzionare anche senza parentesi, ma con l’uso di funzioni Python potrebbe non capire più
dove inizia e dove finisce una tupla). Tutte le tipologie di elementi possono far parte di una tupla: numeri,
stringhe, altre tuple ecc.
Es.
Numeri = (10, 20, 30)
Le tuple a prima vista potrebbero sembrare uguali alle liste (e per lo più lo sono, infatti entrambi gli strumenti
accettano di essere argomento di funzioni, operazioni e rispondono correttamente a indicizzazione e slicing)
ma vi è un’importante differenza: le tuple sono immutabili, ciò le rende più sicure e più veloci.
È possibile comunque convertire una lista in tupla (col comando “list”) e una tupla in lista (col comando
“tuple”).
Es: lista_numeri = list(tupla_numeri)
numeri2 = (6, 24, 41, 90, 18, 37, 57, 5, 71)
Operatore Operazione
+ Unisce due tuple in una nuova tupla.
* Crea più copie di una tupla e le unisce.
in Restituisce True.
not in Seleziona gli elementi dal primo a quello con indice 3 (escluso).
Es. con “+” : nuova_tupla = numeri + città = (1, 2, 3, Milano, Palermo, Viareggio)
Es. con “*” : nuova_tupla = città*2 = (Milano, Palermo, Viareggio, Milano, Palermo, Viareggio)
20
min() Restituisce l’elemento più piccolo (se stringhe dal punto di vista alfabetico).
Distingue tra maiuscole e minuscole.
sorted() Restituisce una nuova lista con gli elementi della tupla in ordine crescente.
sum() Restituisce la somma degli elementi della tupla.
ATTRAVERSAMENTO DI TUPLE
Gli elementi di una tupla possono essere selezionati in sequenza, e si usano:
• Slicing e indicizzazione, se vogliamo selezionare un singolo elemento;
• Cicli, se vogliamo applicare le istruzioni a ogni elemento della tupla;
• Alcune funzioni e metodi per impostare combinazioni di cicli e istruzioni
Es:
DIZIONARI
Un dizionario è un oggetto che contiene una collezione di dati. Gli elementi di ogni dizionario sono composti
da:
• Una chiave, deve essere immutabile e univoca (per dizionario);
• Un valore, può essere sia mutabile che immutabile.
21
Si passa quindi a vedere le funzioni built-in utilizzabili con i dizionari:
Funzione Descrizione
len() Restituisce il numero di elementi (coppie chiave-valore) di un dizionario.
dict() Crea un dizionario vuoto, a meno che come argomento della funzione si abbiano
degli oggetti iterabili.
max() Restituisce la chiave più grande di un dizionario (se le chiavi sono stringhe, allora
restituisce la più grande dal punto di vista alfabetico). Distingue tra maiuscole e
minuscole
min() Restituisce la chiave più piccola di un dizionario (se le chiavi sono stringhe, allora
restituisce la più piccola dal punto di vista alfabetico). Distingue tra maiuscole e
minuscole
sorted() Restituisce una lista con le chiavi del dizionario ordinate in maniera crescente (se le
chiavi sono stringhe saranno messe in ordine alfabetico).
Precisazioni
• Il risultato del metodo get potrebbe essere ottenuto anche con la semplice indicizzazione
(nome_dizionario[nome_chiave]), ma in quest’ultima ipotesi se nome_chiave non facesse parte di
nome_dizionario si avrebbe un messaggio di errore. Usando il metodo get invece, si otterrebbe il
valore predefinito None.
• I metodi items, key e values restituiscono degli oggetti iterabili detti view object, essi non sono delle
copie dei dizionari ma bensì delle loro “immagini” che si aggiornano rispetto a cambiamenti del
22
dizionario e hanno inoltre il vantaggio di essere molto veloci da analizzare, ciò li rende adatti quando
si lavora con una grande mole di dati.
>>> nome_dizionario.items()
dict_items([(‘nome_chiave1’ , nome_valore1), (‘nome_chiave2’, nome_valore2)])
Applicando il ciclo for ad un ipotetico dizionario “rubrica” composto da nomi e numeri come, rispettivamente,
chiavi e valori si ha:
for k, v in rubrica.items():
print(“Nome: “, k , “\Numero: “ , v)
L’argomento mode, invece, è opzionale e stabilisce in che modo aprire il file (sola lettura, scrittura ecc.), di
default è impostato su sola lettura.
I modi in cui è possibile visualizzare il file sono:
Modalità Descrizione
‘r‘ Apre il file in modalità sola lettura, quindi non è possibile scrivere o modificare nulla.
All’apertura il programma si posiziona all’inizio della prima riga (posizione 0). Se il file non
esiste viene restituito errore.
‘w’ Apre il file in modalità scrittura. Se il file esiste già i dati preesistenti vengono eliminati,
altrimenti viene creato un nuovo file.
‘a’ Apre il file in modalità append (aggiunta), ciò vuol dire che è possibile scrivere alla fine dei dati
già esistenti, poiché Python si posiziona alla fine del testo preesistente. Se il file non esiste
viene creato.
‘r+’ Apre il file in modalità lettura e scrittura. Se il file esiste già i dati non vengono eliminati, se non
esiste viene restituito un errore.
‘w+’ Apre il file in modalità lettura e scrittura. Se il file esiste già i dati vengono eliminati, se non
esiste viene creato il nuovo file.
‘a+’ Apre il file in modalità aggiunta e lettura. Se il file esiste già Python si posiziona dopo il testo
esistente altrimenti il nuovo file viene creato.
23
Per poter scrivere e spostarsi in un file è necessario utilizzare dei metodi, mentre alla fine della modifica
bisogna chiudere il file con il metodo close à variabile. close().
Esistono anche i cosiddetti attributi, che vanno scritti dopo il nome che abbiamo assegnato al file, che ci
danno informazioni sul file:
• variabile.name: restituisce percorso e nome del file.
• variabile.mode : restituisce la modalità di apertura del file.
• variabile.closed : restituisce True o False a seconda che il file sia chiuso o aperto.
A differenza dei metodi, per gli attributi non ci sono argomenti e non si utilizzano parentesi.
Metodo Descrizione
.read(size) Legge il contenuto del file dalla posizione corrente fino alla fine. Se inseriamo
l’argomento size(opzionale), Python legge il numero di byte impostato. Es. se size=10 il
programma legge dalla posizione corrente fino a 10 battute in avanti.
.readline(size) Legge il contenuto di una riga di testo. Anche qui size è opzionale.
.readlines(size) Legge il contenuto di tutte le righe di testo fino alla fine del file e restituisce una lista
che ha per elementi le singole righe. L’argomento size è opzionale.
.seek(offset, Permette di spostare il puntatore alla posizione desiderata, specificando di quanti byte
[whence]) ci si deve muovere. L’argomento offset indica il numero di byte, mentre l’argomento
whence indica la posizione da cui partire: 0 = inizio file, 1 = posizione corrente, 2 = fine
file. (Es. se vogliamo spostarci alla fine del file scriveremo file.seek(0,2).
.tell Restituisce la posizione nel testo in termini di byte a partire dall’inizio. (tiene conto degli
spazi e dei codici di escape).
Metodo Descrizione
.writable() Restituisce True se è possibile scrivere sul file, altrimenti False.
.write(string) Scrive nel file il contenuto inserito come argomento string. Alla fine, Pyhon restituisce
il numero di caratteri scritti e il puntatore nel file si posiziona alla fine del testo. Bisogna
inserire nell’argomento string anche eventuali codici di escape.
.writelines(lines) Scrive nel file la sequenza di righe specificate nell’argomento lines. Bisogna inserire
anche i codici di escape.
24
TRY…EXCEPT
Qualora si prevede che una determinata istruzione possa dare un errore è possibile utilizzare le funzioni try
ed except per evitare il messaggio di errore. Questo processo è detto di exception handling.
Es. vogliamo dividere due numeri ma il secondo è zero, oppure i numeri inseriti sono di tipo stringa; per evitare
il messaggio ZeroDivisionError oppure ValueError possiamo scrivere:
TIPI DI ERRORE
Eccezione Descrizione
AttributeError Sollevato quando un metodo o un attributo vengono assegnati a un tipo di
dato/oggetto sbagliato.
IndexError Sollevato quando si utilizza, in una sequenza, un indice troppo grande.
NameError Sollevato quando una variabile non viene trovata.
SyntaxError Sollevato quando vi è un errore di sintassi.
TypeError Sollevato quando un’operazione o una funzione è applicata a un tipo di dato
sbagliato.
ValueError Sollevato quando una funzione o un metodo riceve un argomento del tipo corretto
ma con un valore non valido. Es. si cerca di convertire in int una stringa di testo:
int(‘gatto’).
ZeroDivisionError Sollevato quando si divide un numero per zero.
DEBUGGING
Il debugging consiste nella rimozione degli errori, di tutti i tipi, e anche nell’ottimizzazione del programma.
È un processo sperimentale che avviene sia durante la scrittura del codice, sia, soprattutto, dopo aver scritto
il codice. È possibile utilizzare vari strumenti per il debugging: si ha il modulo pdb che fa parte della libreria
standard di Python, che consente di analizzare il codice, oppure si possono installare pacchetti esterni, sia
gratuiti che a pagamento.
LE LIBRERIE DI PYTHON
Gli argomenti di questo capitolo potrebbero presentare una difficoltà più elevata per qualcuno, si consiglia di
provare a eseguire esercizi su gli argomenti trattati personalmente man mano che si legge.
DEFINIZIONE DI MODULO
Fondamentale nel coding è la ri-usabilità del codice, al fine di aumentare l’efficienza del tempo impiegato a
programmare, a tala fine si usano i moduli.
I moduli sono dei file script (con estensione .py) che contengono pezzi di codice con funzioni specifiche,
questi vengono organizzati per finalità di utilizzo e per contenuti omogenei.
Nei moduli possiamo trovare: funzioni, classi di oggetti (che sono tipi di dati speciali), metodi (funzioni
specifiche fatte per lavorare con attributi, es “.sort()”), docstring, commenti e dati di esempio (per funzioni
particolarmente complesse).
25
Esistono 3 tipologie di moduli:
• I moduli già installati in Python, racchiusi nella libreria standard;
• I moduli creati dall’utente, che vanno ricaricati ad ogni apertura di Python;
• I moduli sviluppati da altri programmatori, scaricabili da siti appositi (come GitHub e PyPI) utili per
risparmiare tempo.
Se dovessimo costruire dei programmi particolarmente complessi sarebbe sensato dare un’impostazione
gerarchica al codice di tipo top-down, si andranno ad utilizzare quindi, oltre ai moduli, anche librerie che
contengono moduli affini per finalità di utilizzo e contenuti omogenei (come già specificato poc’anzi). Se
necessario di potrebbero usare anche grandi librerie con al loro interno sotto-librerie (sempre ordinate
secondo i parametri già visti).
Una volta caricata la libreria è necessario dire a Python quale funzione (in quale modulo, in quale sotto-libreria
di quale libreria) dovrà utilizzare. Per evitare confusione si ricorre alla convenzione di scrittura dot notation,
in cui si parte sempre dalla voce generale per finire con la particolare, es un programma per caricare in Python
un’immagine si procederà:
>>> gestisciImmagini.leggere.tipoJPEG.apriFile(“C:\\percorso\\MyPhoto.jpg”)
Per importare in Python moduli e librerie si usa la funzione import, con cui è possibile importare anche più
moduli e librerie, es:
>>> import math, random
N.B moduli e librerie vengono importati nella RAM, quindi ad ogni riavvio del programma (nel nostro caso la
shell) si dovrà reimportare i moduli e librerie che ci servono.
Siccome talvolta potremmo aver bisogno solo di una funzione da una libreria (o modulo) possiamo ricorrere
alla funzione from che appunto importa solo determinate funzioni e non tutta la libreria (o modulo), es:
>>> from math import sqrt
N.B. in tal caso però la libreria math non verrebbe più riconosciuta dal programma e quindi sarebbe
inutilizzabile.
Vi sono inoltre altre funzioni utili per scoprire quali moduli sono presenti in Python mentre si lavora, queste
funzioni vanno utilizzate così come sono poiché di “supporto”:
• help, scopre quali moduli sono installati sull’hard disk (a prescindere dalla loro origine) e si scrive:
o >>> help(‘modules’)
• dir, scopre quali moduli sono attivi nella sessione di lavoro corrente e si scrive:
>>> dir()
Il modulo (così come le funzioni al suo interno) built-in di Python apparirà nella seguente forma
‘__builtins__’. Mentre i moduli da noi importati nella seguente ‘math’.
È possibile inoltre utilizzare la funzione dir() anche immettendo un modulo o libreria come suo
argomento, vedremo così tutto ciò che contiene, es:
>>> dir(math)
[‘sqrt’, ‘ceil’, ecc.]
LA LIBRERIA STANDARD DI PYTHON
La libreria standard di Python contiene oltre 180 moduli, più o meno complessi, analizziamo i più comuni
(N.B durante le lezioni sono stati utilizzate solo alcune funzioni dei primi 3):
IL MODULO MATH
Esso permette di lavorare con numeri reali e le sue funzioni più usate sono:
Funzioni Descrizione Esempio
math.ceil(x) Restituisce l’intero arrotondamento per eccesso di x 4.7 → 5
math.floor(x) Restituisce l’intero arrotondamento per difetto di x 4.7 → 4
26
math.sqrt(x) Restituisce la radice quadrata di x 6.25 → 2.5
math.pi Esprime il Pi greco con approssimazione secondo la potenza del pc 3.14…
math.exp(x) Restituisce e elevato alla potenza x (e = numero di Nepero)
math.factorial Restituisce il fattoriale del numero intero positivo x 4! → 4*3*2*1
math.gcd(a, b) Restituisce il massimo comun divisore tra a e b Tra 36 e 84 →
12
math.hypot(x, Applica il teorema di Pitagora per calcolare l’ipotenusa tra x e y rad(4*2+3*2)
y) →5
math.isfinite(x) Restituisce True se x è diverso da 0/n e da 0/0, altrimenti dà False
math.isnan(x) Restituisce True se x è uguale a 0/0, altrimenti dà False
math.log(x,[ Restituisce il logaritmo in base A di x, se baseA è omessa calcola il
baseA]) logaritmo in base 10
math.logq (x) Calcola il logaritmo in base q di x
math.pow(x, y) Eleva x alla y 3**4 → 81
IL MODULO RANDOM
Permette di utilizzare funzioni aleatorie per calcoli di probabilità:
Funzioni Descrizione
random.random() Restituisce un numero decimale compreso tra 0 (incluso) e 1 (escluso)
random.choice(sequenza) Restituisce un elemento a caso tra quelli indicati nella sequenza (che può
essere una lista, una tupla, una stringa ecc.)
random.randrange(stop) Restituisce un numero intero scelto tra start (incluso, e se omesso uguale
random.randrange(start, a 0) e stop andando di step in step (se omesso è uguale a 1); il
stop,[step]) funzionamento è identico alla funzione range.
random.randint(min, max) Restituisce un numero intero compreso tra min e max (entrambi inclusi)
random.seed(a = None) Inizializza il generatore di numeri casuali con il numero intero a dato; se
omesso o None utilizza il valore dell’orologio interno del computer nel
momento dell’esecuzione. Si usa se si vuole ottenere sempre la stessa
sequenza di valori casuali.
random.shuffle(x) Permuta casualmente l’ordine degli elementi della sequenza x.
random.sample(population, Restituisce una lista di k elementi dalla lista population (senza
k) reimmessa).
random.sample(population, Estrae una lista di k elementi dalla sequenza population facendo
weights = None, k = 1) campionamento (con reimmessa). È possibile rendere gli elementi
equiprobabili impostando a weights un valore uguale alla lunghezza di
population, il quale contiene le diverse probabilità degli elementi.
random.gauss(mu, sigma) Genera un numero casuale da una variabile casuale normale di media
mu e di scarto quadratico medio sigma.
IL MODULO TURTLE
Permette un uso grafico molto semplice:
Tartaruga: metodi Descrizione
bob = turtle.Turtle() Funzione per costruire un nuovo oggetto tartaruga di nome bob.
bob.forward(distanza) La tartaruga bob si muove in avanti di distanza pixel.
bob.backward(distanza) La tartaruga bob si muove indietro di distanza pixel.
bob.goto(x, y) La tartaruga bob va alla posizione x = ascissa, y = ordinata.
bob.left(gradi) La tartaruga bob ruota in senso antiorario di quanto indicato in gradi.
bob.right(gradi) La tartaruga bob ruota in senso orario di quanto indicato in gradi.
bob.setheading(gradi) La tartaruga bob si orienta rispetto alla posizione originale di tanto
quanto indicato in gradi.
27
bob.penup() Solleva la penna della tartaruga bob così che non scriva più.
bob.pendown() Abbassa la penna della tartaruga bob così che scriva.
bob.begin_fill() La tartaruga bob inizia a colora l’interno delle figure che disegna.
bob.end_fill() La tartaruga bob smette di colorare l’interno delle figure che disegna.
bob.pencolor(colore) Imposta il colore della penna della tartaruga bob.
bob.width(dimensione) Imposta la larghezza della penna della tartaruga bob.
bob.fillcolor(colore) Imposta il colore che la tartaruga bob utilizza per colorare l’interno delle
figure che disegna.
bob.shape(‘turtle’) Cambia l’aspetto della tartaruga bob (es. con ‘turtle’ si avrà l’aspetto di
una tartaruga).
bob.position() Indica l’attuale posizione della tartaruga bob, i valori delle coordinate
vengono restituiti in una tupla (x, y).
bob.heading() Indica l’orientamento dei gradi della tartaruga bob.
canvas = turtle.Screen() Costruisce un nuovo oggetto di nome canvas.
canvas.bgcolor(colore) Imposta il colore della finestra background.
canvas.addshape(“ninja.gif”) Aggiunge alla finestra l’immagine come nuova forma per il cursore.
IL MODULO OS E OS.PATH
Permettono di interagire con la gestione file e cartelle del sistema operativo:
Funzioni Descrizione
os.listdir([path]) Restituisce la lista dei nomi dei file e delle directory presenti nella cartella
identificata dal percorso path.
os.getcwd() Restituisce una stringa che rappresenta il percorso dell’attuale working
directory directory.
os.chdir(path) Fa diventare il percorso path la nuova working directory.
os.rename(oldName, Rinomina il file o la directory.
newName)
os.remove(file) Cancella il file.
os.rmdir(path) Cancella la directory se vuota.
os.path.join(path, filename) Restituisce una stringa concatenando path e filename, secondo la
sintassi del computer.
os.path.isfile(path) Restituisce True se il percorso path termina con il nome di un file.
os.path.isdir(path) Restituisce True se il percorso path termina con una directory, altrimenti
False.
IL MODULO DATETIME
Fornisce dati speciali connessi alle date:
Principali tipi di dati Descrizione
x = datetime.date(year, Crea un valore di tipo date con attributi: year, month, day.
month, day)
y = datetime.time(hour, Crea un valore di tipo time con attributi: hour, minute, second.
minute, second)
z= Crea un valore durata duration ottenuto dalla differenza tra due valori di
datetime.timedelta([days,[ tipo date o time.
seconds,[minutes,[hours,[
weeks]]]]])
x.weekday() Restituisce il giorno della settimana come numero intero 0 – 6, dove il
lunedì vale 0 e la domenica vale 6.
x.isoformat() Restituisce una stringa che rappresentala data in formato: YYYY – MM -
DD.
28
CLASSI, ATTRIBUTI E METODI
PROGRAMMAZIONE A OGGETTI
Python è un linguaggio di programmazione multi-paradigma, nel senso che utilizza diversi stili di
programmazione e approcci tra cui:
• Approccio procedurale, che prevede di scomporre il programma in blocchi di codice
(sottoprogrammi o subroutine), identificati da un nome e racchiudi da delimitatori, in modo da creare
una sorta di gerarchia a piramide.
• Approccio funzionale, in cui il programma assume la forma di una sequenza di funzioni da eseguire
in maniera concatenata.
• Approccio di programmazione orientata agli oggetti (OOP), che è il metodo con cui Python stesso
è stato sviluppato.
IL LINGUAGGIO A OGGETTI
In Python, ogni cosa è di fatto un oggetto e, come nella vita reale, ogni oggetto può essere utilizzato in uno o
più modi, a seconda del tipo di oggetto che utilizziamo.
Vi sono due tipi di azioni che è possibile svolgere, quelle che comportano la modifica delle caratteristiche
degli attributi dell’oggetto e quelle che, invece, comportano l’uso dell’oggetto nella sua interazione con altri
oggetti o con l’utente.
In Python i vari oggetti sono caratterizzati da degli attributi, delle caratteristiche potremmo dire, e da dei
metodi, che sono invece le azioni che si possono svolgere con essi.
Chiamiamo con l’espressione ‘definizione di classe’ il blocco di codice che contiene sia gli attributi che i
metodi relativi ad un oggetto. Ogni codice può essere riutilizzato, quindi bisogna renderlo in meno
complicato possibile, secondo la logica del Don’t Repeat Yourself (DRY).
LE CLASSI E LE ISTANZE
La classe non è altro che una famiglia, un insieme di oggetti di un certo tipo, che possono essere già presenti
in Python o librerie esterne oppure possono essere create da noi.
L’istanza, invece, è il singolo oggetto appartenente alla classe.
Per capire meglio, supponiamo che la nostra classe sia quella delle automobili, le istanze al suo interno
saranno i singoli modelli di automobili.
Ogni oggetto, poi, deve avere dei particolari attributi e dei metodi. Riprendendo l’esempio della classe
automobili, avremo come attributi, per esempio, la potenza del motore, il tipo di cambio ecc. mentre come
metodi quello di avviare, di spegnere, di cambiare marcia ecc.
L’insieme dei metodi di una classe è chiamata interfaccia.
All’interno di Python vi sono dei tipi di dati elementari (stringhe, interi, float, logici) e strutture di dati più
complessi (tuple, liste, dizionari), che vengono chiamati literals.
A differenza degli oggetti veri e propri, i literals vengono creati con una sintassi dedicata, più semplice e
dotata di elementi di riconoscimento, che permette a Python di individuare i vari literals (per esempio le
stringhe sono identificate dagli apici o dalle virgolette, i numeri interi da cifre comprese tra 0 e 9 e così via).
29
Se, quando abbiamo parlato di variabili e tipi di dati, avevamo visto che è possibile cambiare il tipo di dato
tramite delle funzioni (str, int, float), in realtà quello che avviene è che la conversione non modifica l’oggetto
originale ma ne crea uno nuovo a partire dal primo, riassegnando il nome e il tipo desiderato. In Python,
infatti, il tipo è strettamente legato all’oggetto e non può essere modificato.
Come abbiamo già accennato, esistono delle classi già presenti nella libreria standard di Python e anche in
librerie di terze parti. Esistono delle precise regole di code-naming che permettono di identificare quando si
sta utilizzando o creando una classe; una di queste regole è quella di far iniziare il nome della classe con
una lettera maiuscola.
Se utilizziamo la funzione type possiamo verificare a quale classe di oggetti appartiene un elemento, mentre
per vedere il contenuto del modulo bisogna utilizzare la funzione dir().
Es. >>> dir(turtle), che ci mostra il contenuto per intero.
Se invece volessimo visualizzare solo gli attributi e i metodi dovremmo utilizzare dir(), con il nome della classe
o dell’istanza.
Es. >>> dir(turtle.Turtle()).
Infine, per avere anche una spiegazione possiamo utilizzare sia la funzione help, che la cosiddetta call tip,
che viene visualizzata quando scriviamo il nome di un oggetto seguito dal punto oppure quando si apre la
parentesi dopo un metodo.
Screen
LE CLASSI PERSONALIZZATE
Per poter creare degli oggetti bisogna definire e creare, per prima cosa, una classe.
In realtà nessuna classe viene creata da zero, ma ognuna ha come base la classe object cui si rifà.
Per creare una classe bisogna innanzitutto definirne il nome; supponiamo di voler creare una classe di oggetti
per giocare a Testa o Croce:
Da notare che le parentesi non sono obbligatorie ma per convenzione vanno messe.
Vanno anche messi i due punti e il blocco sottostante deve essere indentato.
Per arricchire l’oggetto di attributi bisogna costruire, per prima cosa, il metodo indicato da __init__;
tornando al nostro esempio, supponiamo di voler avere come situazione iniziale, prima del lancio, una delle
due facce; __init__ è a tutti gli effetti una funzione e, in quanto metodo, deve avere almeno un argomento,
che per convenzione è self (nome puramente convenzionale):
Il metodo costruttore non fa alcun calcolo, deve solo definire gli
attributi della futura istanza, per questo non termina con return.
È possibile aggiungere al metodo costruttore molti altri attributi, nel nostro caso potremmo aggiungere la
valuta, il valore della moneta ecc.
Gli attributi possono essere variabili oppure costanti.
Dopo la creazione degli attributi vanno create le funzioni produttive, nel nostro caso quelle che simulano il
lancio. Il metodo che creeremo deve avere come argomento lo stesso che abbiamo inserito prima, self.
In generale lo schema da utilizzare per la creazione di una classe è il seguente:
30
È possibile, infine, aggiungere delle stringhe di documentazione all’interno delle classi in modo da dare
spiegazioni e istruzioni durante l’utilizzo. Se utilizziamo la funzione help sulla classe allora verranno
visualizzate anche le eventuali docstring.
LE ISTANZE
Per creare una singola istanza è necessario darle un nome e assegnare all’oggetto la classe creata.
Dopo di che è possibile modificare i valori iniziali (quelli che sono impostati negli attributi); per far ciò bisogna
chiamare l’oggetto creato seguito dall’attributo che si vuole cambiare.
È possibile anche eliminare un oggetto. In questo caso bisogna usare la keyword del:
Per creare un duplicato di un oggetto non è possibile assegnare allo stesso un nuovo nome, bisogna
piuttosto utilizzare il modulo copy.
È un modulo che contiene solo due funzioni: copy e deepcopy(su quest’ultima il libro non si sofferma).
Nella stringa costituita da __str__ il programmatore può inserire qualsiasi informazione utile per l’utilizzatore
dell’oggetto.
Un’altra caratteristica è di avere come unico argomento self e di dover sempre terminare con un’istruzione
di return.
31
BEST PRACTICE NELLA CREAZIONE DELLE ISTANZE
Per evitare che altri programmatori possano modificare il contenuto del codice è possibile rendere alcuni
attributi costanti. Per far ciò è possibile utilizzare la funzionalità di tipo get. Invece, se si vuole rendere
l’attributo modificabile bisogna utilizzare la funzionalità set.
EREDITARIETÀ
L’ereditarietà si basa sul concetto di gerarchia, che in Python è particolarmente da creare e utilizzare.
Basta indicare nella sottoclasse(child) il nome della classe base (parent).
OVVERIDING DI METODI
Si definisce overriding il meccanismo secondo il quale il quale Python, a parità di nome del metodo, privilegia
l’esecuzione, nella sottoclasse, del metodo nella sottoclasse stessa. Questo perché si presuppone che il
livello di specializzazione dei livelli più bassi sia maggiore.
Se noi cercassimo lo stipendio di un lavoratore part time, utilizzando la classe Parttime otterremmo
l’esecuzione del secondo modulo dal nome stipendio.
OVERLOADING DI METODI
Si ha overloading di metodi quando degli operatori assumono funzionalità diverse a seconda del tipo di dato
che utilizzano. Questo avviene attraverso l’utilizzo di particolari metodi (per esempio __add__).
È una caratteristica che abbiamo già incontrato con gli operatori + e * che funzionano in modo diverso a
seconda che operino su stringhe o numeri interi/numeri a virgola mobile.
POLIMORFISMO
Infine, il polimorfismo è la caratteristica che consente al programma di decidere in che modo utilizzare una
determinata funzione o un determinato metodo, a seconda del tipo di dato che ha davanti (una stessa
funzione, infatti, può agire in maniera diversa su tipi di dati diversi).
32
http://bit.ly/Peer2Peer_Bocconi
http://bit.ly/Blab_Bocconi
https://www.blabbocconi.it/dispense/
@blabbocconi
33