Ex0
Ex0
a.a. 2020/2021
Introduzione a Python
D.Cozzolino
Questa è una breve introduzione al Python che ha l'obiettivo di fornirvi gli elementi essenziali per il suo
https:
utilizzo. Chi è interessato ad una guida completa può riferirsi alle documentazione uciale al sito
//docs.python.org/3/ o ai tutorial oerti dalla w3schools https://www.w3schools.com/python
Leggete questo documento e provate tutte le istruzioni che troverete di seguito.
1 Concetti base
Lanciando Spyder, avete a disposizione la console Interattiva di Python (Interactive Python, IPython),
da cui è possibile digitare i comandi. Per esempio, si può usare la console come se fosse una semplice
calcolatrice, digitando
In [1]: 4+5*2
e premendo INVIO otterremo la risposta.
Out [1]: 14
Provate adesso ad usare il comando print, eseguendo la seguente istruzione
2 Variabili
I risultati dell'operazione possono essere memorizzati in Variabili tramite l'operatore uguale (=). Provate
ad eseguire le seguenti istruzioni:
a = 10*2
c = " ALOHA !"
1
Nell'esempio precedente, a e c sono le variabili che adesso memorizzano rispettivamente il numero 20
e la scritta ALOHA!. E' importante sottolineare che in Python non è necessario specicare il tipo della
variabile che risulta automaticamente denita in seguito all'assegnazione dei valori che deve assumere.
Digitando il nome della variabile è possibile conoscerne il valore.
In [ ]: a
Out [ ]: 20
I nomi delle variabili possono contenere solo lettere, numeri e il carattere underscore (_) e non possono
iniziare con un numero.
E' possibile cancellare una variabile tramite il comando del. Prova il seguente codice:
In [ ]: % whos
I magic command iniziano con il carattere % e sono esclusivi della console Interattiva di Python (In-
teractive Python, IPython) e quindi non possono essere utilizzati negli script e nei moduli Python. Un
altro magic command utile è %reset che resetta la console cancellando tutte le variabili.
Python ha diversi tipi tra cui: i numeri interi (int), i numeri a virgola mobile (float), le stringe (str)
e i booleani (bool).
a = 10 # un intero
b = 3.14 # un numero floating point
c = " string " # una stringa
d = True # uno booleano
La funzione int( ) converte l'input in un intero. Analogamente, le funzioni str( ) e float( ) con-
vertono l'input rispettivamente in una stringa e in un numero a virgola mobile. Per sapere il tipo di
una variabile si può usare la funzione type( ). Mentre, possiamo usare la funzione isinstance( ) per
vericare se la variabile è di un dato tipo. Provate ad usare le funzioni appena descritte.
a = 5
b = str (a)
isinstance (a , int )
isinstance (b , int )
type ( b)
Python prevede diverse operazioni tra i tipi numerici (tabella 1). Inoltre, è possibile usare le parentesi
tonde per denire l'ordine delle operazioni. Provate le seguenti istruzioni:
2
Operazione Descizione
+ Addizione
- Sottrazione
* Moltiplicazione
/ Divisione
// Divisione arrotondata per difetto
% Modulo
** Elevazione a potenza
abs( ) Valore Assoluto
== Restituisce True, se sono uguali
!= Restituisce True, se non sono uguali
< Restituisce True, se il primo termine è minore del secondo
<= Restituisce True, se il primo termine è minore o uguale del secondo
> Restituisce True, se il primo termine è maggiore del secondo
>= Restituisce True, se il primo termine è maggiore o uguale del secondo
and Restituisce True, se entrambi i termini sono True
or Restituisce True, se almeno uno è True
not Restituisce True, se il termine è Falso
a = 5
b = 3
a+ b * 5
(a +b )*5
Python prevede due tipi di divisioni con singolo slash (/) o doppio slash (//). Nel caso si usi un
singolo slash il risultato della divisione tra due int è un float. Mentre, bisogna usare il doppio slash
per ottenere un intero.
In [ ]: 7 / 4
Out [ ]: 1.75
In [ ]: 7 // 4
Out [ ]: 1
N.B. Un'utile funzionalità di Spyder è l'uso del tasto freccia in alto (↑), che permette di ridurre note-
volmente i tempi di immissione, infatti premendo questo tasto si ottengono le istruzioni precedentemente
digitate, che si possono eventualmente modicare; lo stesso comando può agire in maniera più selettiva,
digitando una lettera o un gruppo di lettere e poi ↑, vengono riproposti solo i comandi che iniziano con
la lettera o il gruppo di lettere digitati.
2.2 Le Liste
Python nativamente include tipi strutturati per raccogliere o raggruppare dati. Noi ci concentreremo solo
sulle liste di Python che permettono di gestire una sequenza di elementi dove ogni elemento può essere
di un tipo dierente. Possiamo denire una lista usando le parentesi quadre o usando la funzione list.
3
Operazione Descrizione
+ Concatena due liste
len( ) Per ottenere la lunghezza della lista
* per replicare una lista
in determina se un elemento è nella lista
not in determina se un elemento non è nella lista
In [ ]: a = [0 , 4, 4]
In [ ]: b = [5 , 9, 8]
In [ ]: a + b
Out [ ]: [0 , 4, 4, 5, 9 , 8]
4
Python prevede anche le tuple che sono simili alle liste, ma non posso essere modicate dopo essere state
create. Possiamo denire una tupla usando le parentesi tonde.
Listing 1: my_script.py
In [ ]: % run my_script . py
Durante le esercitazioni provate sempre a creare degli script piuttosto che a digitare in console, in questo
modo risparmierete tempo quando volete ripetere e/o correggere dei comandi.
Python prevede i classici costrutti di programmazione come il costrutto if-else.
a = 4
if a >10:
print ( " viene eseguito solo se 'a ' è maggiore di 10 ")
print ( " viene eseguito sempre perchè fuori dal blocco IF ")
Notate che il blocco di istruzione in Python si denisce tramite l'indentazione, se l'indentazione non è
corretta il programma è sbagliato.
a = 4
if a >10:
print ( " viene eseguito solo se 'a ' è maggiore di 10 ")
print ( " incluso del blocco IF ")
Un altro costrutto classico è il for con cui possiamo scorrere una lista di interi denita dalla funzione
range(start,stop,step) che ha una sintassi simile indicizzazione delle liste:
# scrive i numeri da 0 a 9
for x in range (10):
print ( x)
5
l = [" dog " , " cat " , " mouse "]
# scrive gli elementi della lista
for x in l :
print ( x)
def half (x ):
"""
Restituisce la metà del valore dato
"""
return x / 2
Inoltre digitando help(half) verrà visualizzato tutto ciò che avete scritto nel commento delineato
dai caratteri """, questo è utile per descrivere il comportamento della funzione. Cercate quindi di
documentare sempre e in modo appropriato le funzioni che scrivete in modo che possano essere utilizzate
facilmente. Le funzioni possono essere usate anche esternamente allo script. Infatti, ogni le .py può
essere considerato come un modulo Python, cioè una collezione di funzioni, variabili ed altro. Crea il le
my_module.py con il seguente codice:
Listing 2: my_module.py
"""
Esempio di modulo python . Contiene una variabiel chiamata
my_variable e una funzione chiamata my_function .
"""
my_variable = 0
Un modulo Python può diventare accessibile dalla console o da un altro modulo usando la parola chiave
import.
import my_module
6
Possiamo usare le variabili e le funzioni presenti nel modulo attraverso l'operatore punto (.)
a = my_module . my_variable
b = my_module . my_function ()
Possiamo anche denire un alias al modulo usando la seguente sintassi:
import numpy as np
La libreria Numpy prevede il tipo N-dimensional-array che utilizzeremo per vettori e matrici. Rispetto ad
un lista gli elementi di un Numpy array devono essere omogenei. In altre parole tutti gli elementi di un
array devono essere dello stesso tipo. Un array può essere creato a partire da una lista usando la funzione
np.array:
V = np . array ([1 ,2 ,3 ,4 ,5 ,6])
In questo modo abbiamo denito un vettore di sei elementi con valori 1,2,3,4,5 e 6. Analogamente per
le matrici possiamo applicare la funzione np.array a una lista di liste:
a = A [0 ,2]
Ricordatevi sempre che in Python gli incidi partono da 0.
E' anche possibile estrarre sotto-matrici da una matrice utilizzando l'operatore :. Supponiamo per
esempio di aver denito una matrice D di dimensioni 9 × 8; per estrarre delle sottomatrici da D si
possono usare i seguenti comandi:
7
D[1:5,0:3]
estrae una matrice 4×3 da D le cui righe vanno dalla seconda alla quinta, mentre le colonne dalla
prima alla terza.
D[1,:]
estrae la seconda riga dalla matrice; per estrarre la seconda colonna basta digitare D[:,1]
Per convertire il tipo degli elementi di un array (chiamato dtype) possiamo usare il metodo astype().
A. astype ( np . int16 )
Possibili dtype previsti da Numpy sono: np.uint8, np.int64, np.float32, np.float64, np.complex64
e np.bool. La funzione np.array determina automaticamente il dtype analizzando gli elementi della
lista. In alternativa il dtype può anche essere esplicitato nel seguente modo:
A = np.zeros((N,M))
denisce una matrice di N righe ed M colonne con elementi tutti nulli. Se non è esplicitato il dtype
è np.float64.
A = np.ones((N,M))
denisce una matrice di N righe ed M colonne con elementi tutti unitari. Se non è esplicitato il
dtype è np.float64.
B = np.copy(A)
denisce l'array B replicando l'array A. Fate attenzione ad evitare assegnazioni dirette del tipo
B = A, perché in questo caso B e A risulterebbero lo stesso array e qualsiasi manipolazione fatta
su variabile B risulta anche su variabile A.
A = np.eye(N)
denisce una matrice identità quadrata di N righe ed N colonne.
c = np.arange(N)
denisce un vettore coi numeri fra 0 a N-1 con passo 1.
c = np.arange(start,stop,step)
denisce un vettore che parte del valore start con un passo pari a step no al valore stop-1.
Nota che il valore stop non è incluso.
B = A.T
denisce B come trasposta di A.
C = np.hstack((A,B))
denisce la matrice C aancando le due matrici A e B, che devono avere lo stesso numero di righe.
C = np.vstack((A,B))
denisce la matrice C sovrapponendo le due matrici A e B, che devono avere lo stesso numero di
colonne.
8
5.1 Operazioni sugli array
Sugli array si possono eseguire operazioni elemento per elemento, o anche dette puntuali, tra cui le
operazioni aritmetiche (+, -, *, /), le operazioni di confronto (==, >, !=) e le operazioni logiche (&, |).
Notate che il simbolo * e il simbolo / eseguono rispettivamente la moltiplicazione puntuale a le divisione
puntuale, mentre per la moltiplicazione matriciale si utilizza il simbolo @.
Applicando l'operatore di somma (+) a due liste e poi a due array, noterete che il risultato è dierente,
provate a capire il motivo. Oltre alle operazioni, esistono moltissime funzioni e metodi che permettono
di estrarre utili informazioni dagli array, di seguito se ne mostrano alcune:
A.dtype
restituisce il dtype dell'array, cioè il tipo degli elementi dell'array.
A.shape
restituisce una tupla contenente il numero di elementi lungo ogni dimensione.
A.ndim
restituisce il numero di dimensioni dell'array.
A.size
restituisce il numero totale di elementi dell'array.
len(A)
restituisce il numero di elementi lungo la prima dimensione.
A[:,::-1]
restituisce una matrice con l'ordine delle colonne invertito; A[::-1,:] opera in modo analogo
sulle righe.
np.cos(A)
restituisce una matrice con le stesse dimensioni di A contenente il coseno di ogni elemento di A,
opera quindi punto per punto. Questo comportamento vale per numerose funzioni matematiche:
np.abs( ), np.log( ), np.exp( ).
np.min(A)
restituisce il valore minimo di tutti gli elementi dell'array; analogamente np.max(A) restituisce il
massimo di tutti gli elementi e np.mean(A) restituisce le media di tutti gli elementi.
np.min(A,0)
calcola il minimo lungo ogni colonna, mentre np.min(A,1) calcola il minimo lungo ogni riga.
Anche np.max(A,d) e np.mean(A,d) funzionano in maniera analoga.
A.flatten(order='C')
fornisce un vettore contenente i valori della matrice A costituito concatenando le righe. Analoga-
mente A.flatten(order='F') fornisce un vettore contenente i valori della matrice A costituito
concatenando le colonne.
9
np . save ( ' dati . npy ', A)
che crea nella directory corrente il le dati.npy che contiene i dati dell'array A. Gli array salvati possono
essere caricati in memoria con il comando
In [ ]: % matplotlib qt
Adesso possiamo importare il modulo matplotlib.pyplot che fornisce un insieme di funzioni per creare
graci con la sintassi simile a quella di MATLAB.
plt.figure()
crea una nestra.
plt.stem(t,x)
disegna la sequenza di valori di x come impulsi centrati negli istanti deniti dal vettore t.
plt.plot(t,x)
disegna il graco interpolando linearmente i valori contenuti in x.
plt.subplot(m,n,p)
consente di visualizzare più graci all'interno della stessa gura. Suddivide la gura in m x n
quadranti e inserisce il graco corrente nella posizione p-esima.
plt.title('Titolo della figura')
permette di inserire un titolo alla gura.
plt.show()
rende visibili le gure.
10
plt.close()
chiude la gura attiva.
Maggiori informazioni sulla libreria Matplotlib si trovano sul sito uciale http://matplotlib.org.
2. Scrivete funzioni brevi, ma usate nomi signicativi, anche se lunghi, per le funzioni e le variabili.
4. Attenzione anche all'uso delle lettere maiuscole e minuscole (per Python sono diverse).
5. Create un codice ben commentato, scoprirete presto quanto sia utile avere una buona documen-
tazione dei programmi che si vogliono usare.
6. Usate sempre l'help in linea quando avete dei dubbi su come deve essere usato un determinato
comando.
7. Inne, fate molta attenzione ai messaggi di errore. Leggeteli sempre perché non solo vi danno
informazioni sul tipo di errore, ma vi indicano anche il punto nel codice in cui il programma si
blocca, e quindi dove verosimilmente è localizzato l'errore.
8 Esercizi proposti
a) Scrivete una funzione che analizza un vettore di numeri e restituisce un vettore saturando i va-
lori superiori in modulo ad un dato limite. La rma della funzione deve essere la seguente:
clip(x, limit), dove x è il vettore in ingresso, limit è il valore limite, inoltre la funzione
dovrà restituire un altro vettore. Per vericare la correttezza della funzione, applicatela al vettore
[-10, 3, -6, 0, 1, -2, 3, 4, -15, 3, 21] usando il valore limite pari a 8.
b) Scrivete una funzione in cui, data una matrice di valori positivi, reali e distinti tra loro, e dimensioni
16 × 16, volete conservare solo i 4 valori più grandi e annullare tutti gli altri. Il prototipo della
funzione deve essere il seguente: clip(x), dove x è la matrice in ingresso.
11