Introduzione Python
Introduzione Python
Versione 3.0
6 Giugno 2005
F.Marcuzzi - M.R.Russo
Contents
1 Introduzione
1.1
1.2
Documentazione su Python . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3
. . . . . . . . . . . . . . . . . .
2 Modalit
a di esecuzione dei programmi scritti in Python
2.1
2.2
2.2.1
2.2.2
2.2.3
Help in linea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1
Tipi di dato . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2
Istruzioni composte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.2.1
La decisione if-then-else . . . . . . . . . . . . . . . . . . . . . . . . 10
3.2.2
Il ciclo for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
3.2.3
Il ciclo while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.3
Funzioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
3.4
3.5
3.4.1
I/O da file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.4.2
I/O da schermo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.2
14
4.1.2
4.1.3
Matrici Sparse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.2.1
4.2.2
5 Creazione di Grafici
19
5.1
Grafici bi-dimensionali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.2
Grafici tri-dimensionali . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
5.3
Immagini . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
22
6.1
6.2
22
22
8.1
Interpolazione polinomiale . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
8.2
24
24
24
24
24
F.Marcuzzi - M.R.Russo
Introduzione
Lesecuzione di programmi scritti in Python avviene tramite la sua shell interattiva, che
viene semplicemente invocata con il comando python, sia in Linux che in DOS/Windows.
In generale, e utile dotarsi di unIDE (Integrated Development Environment, ovvero
un ambiente di sviluppo integrato). A questo proposito ci sono varie soluzioni. UnIDE
disponibile per Linux e Windows e Eclipse, per la quale e disponibile un plugin per
Python. Pi
u semplicemente:
per
Linux
e
conveniente
http://www.python.org/idle/ .
utilizzare
IDLE,
disponibile
al
sito
Documentazione su Python
al
sito
1.3
Lutilizzo di Python per limplementazione di algoritmi numerici e possibile principalmente grazie alle sue estensioni, tra cui segnaliamo, in particolare:
Numeric
(ci
riferiamo
alla
versione
23.8
disponibile
al
sito
http://sourceforge.net/project/showfiles.php?group id=1369&package id=1351
): e lestensione che offre gli strumenti per lavorare con vettori e matrici, di importanza fondamentale; documentazione ed informazioni
sono disponibili al sito http://numeric.scipy.org/ , in particolare
http://numeric.scipy.org/numpydoc/numdoc.htm .
PySparse
(
ci
riferiamo
alla
versione
disponibile
al
sito
http://pysparse.sourceforge.net/ ): e lestensione che offre limplementazione
per Python delle matrici sparse, e di alcuni algoritmi per la risoluzione di sistemi
lineari sparsi; si appoggia a Numeric.
Gnuplot-py ( ci riferiamo alla versione disponibile al sito http://gnuplotpy.sourceforge.net/ ): e unestensione alternativa a Pygist, che interfaccia Python
al popolare Gnuplot.
F.Marcuzzi - M.R.Russo
Parte I
2
Programmazione
Modalit
a di esecuzione dei programmi scritti in Python
Ci sono due modalita principali per avviare un programma, scritto in linguaggio Python,
dal prompt della shell di Linux:
1. impartire il seguente comando (esegue il programma e ritorna alla shell di Linux):
python <nome file programma>.py
Per vedere i comandi disponibili nei moduli standard e possibile accedere al sito ufficiale
http://www.python.org/doc/current/lib/lib.html .
Se un modulo gia importato e stato successivamente modificato, e necessario caricarlo
nuovamente nellambiente. In questo caso, pero, listruzione import non farebbe nulla (in
quanto il modulo e gia stato importato), mentre e necessario utilizzare listruzione reload:
reload(<nome modulo>) .
2.2
E utile ricordare che unistruzione precedentemente impartita alla shell di Python, nella
sessione corrente, puo essere facilmente richiamata:
con IDLE (Linux): muovendosi con le combinazioni di tasti <Alt-p> e <Alt-n>
nellelenco storico progressivo memorizzato dallambiente;
con la shell interattiva (Linux) o con pythonWin (Windows): muovendosi con le
combinazioni di tasti <ctrl-freccia s
u> e <ctrl-freccia gi
u> nellelenco storico
progressivo memorizzato dallambiente .
Questa funzione e analoga a quella ottenuta in Matlab con <freccia-s
u> e <freccia-gi
u>)
.
2.2.2
E necessario che il modulo os (funzioni del sistema operativo) venga prima importato:
import os
F.Marcuzzi - M.R.Russo
2.2.3
#
#
#
#
mostra
mostra
mostra
mostra
la
la
la
la
directory
directory
directory
directory
corrente
padre
figlia specificata
specificata
Help in linea
Nota: la funzione help() richiede che il modulo <nome modulo> sia gia stato importato.
3
3.1
>>> Ci
# NB: s[da,a] considera gli indici da "da" fino ad "a-1"
# ripetizione di una stringa:
s = "Ciao"
print s * 3
>>> CiaoCiaoCiao
# concatenazione di due o piu stringhe:
s1 = "Ciao"
s2 = "Mondo"
print s1 + " " + s2
>>> Ciao Mondo
lista:
e un tipo di dato utile per immagazzinare pi
u di un valore in ununica variabile.
Vediamo le principali operazioni possibili:
# creazione di una lista (in generale, una lista e eterogenea):
listino = [panino,3.70,acqua,0.50,gelato,0.99]
listino[2] # accesso allelemento di indice 2 (NB: gli indici partono da 0)
F.Marcuzzi - M.R.Russo
listino[2] = 3
del listino[2]
len(listino)
"vino" in listino
"vino" not in listino
list.sort()
list.index("acqua")
list.append("vino")
3.2
#
#
#
#
#
#
#
#
#
Istruzioni composte
3.2.1
La decisione if-then-else
Il ciclo for
10
Il <vettore di interi> pu`o essere espresso mediante una lista oppure un array (Numeric.array), e <variabile> assume al passo i-esimo il valore della sua i-esima componente
. Esempi:
1. for i in range(1,2000,10), che significa i parte da 1, si incrementa con
passo 10 ed il ciclo si arresta quando i >= 2000 (in linguaggio C, sarebbe
for (i=1; i<2000; i+=10) {...});
2. for i in [1 2 4 6 25], che significa il ciclo esegue 5 iterazioni; alla prima i vale
1, alla seconda 2, alla terza 4, alla quarta 6, alla quinta 25.
3. for i in stringa, che significa i assume valore pari ai singoli caratteri della
stringa, partendo dal primo e fino allultimo.
Questo costrutto `e largamente utilizzato nel calcolo numerico e si presta a vari tipi di
ottimizzazioni, sia su calcolatori sequenziali che paralleli.
Tipicamente la <variabile> assume valori da 1 a N , dove N `e una dimensione fondamentale del problema, ad es. il numero di componenti di un vettore o di righe (o colonne)
di una matrice.
3.2.3
Il ciclo while
Funzioni
Un modulo Python (lo identifichiamo qui con un file, <nome file>.py) puo contenere una
o pi
u funzioni al suo interno. Importando il modulo, si rendono disponibili le funzioni in
esso contenute.
In generale, una funzione la si definisce nel seguente modo:
def <nome funzione>([<parametro 1>, <parametro 2>, ...]):
<istruzioni...>
<...con eventuale "return">
11
F.Marcuzzi - M.R.Russo
3.4.1
I/O da file
Nota: lestensione del file puo essere qualunque, e non necessariamente txt.
12
3.4.2
I/O da schermo
stampa su schermo:
print "2 + 2 = ", 2+2
>>> 2 + 2 = 4
3.5
in Linux:
istante_1 = time.time()
in Windows:
istante_1 = time.clock()
13
F.Marcuzzi - M.R.Russo
Lelaborazione di vettori e matrici non puo essere fatta con gli strumenti base di Python,
ad es. liste e cicli for, in quanto risulterebbe assai lenta se confrontata con implementazioni
in linguaggio C o Fortran. Per questo motivo e stata sviluppata lestensione Numeric, detta
anche NumPy, che consente di eseguire operazioni su vettori e matrici con unefficienza
paragonabile a quella che si ha con i linguaggi compilati (ad es. C e Fortran, appunto).
La documentazione HTML relativa allestensione Numeric puo essere trovata al sito:
Vediamo una sintesi delle operazioni principali:
from Numeric import *
14
15
F.Marcuzzi - M.R.Russo
4.1.1
16
4.1.2
4.1.3
4.2
Matrici Sparse
La matrice sparsa non e ovviamente un tipo di dato standard del linguaggio Python. La
troviamo nellestensione PySparse, in tre formati differenti. Il primo, LL, e pi
u versatile nel
creare e manipolare la matrice sparsa, mentre gli altri due, Compressed Sparse Row (CSR)
e Sparse Symmetric Skyline (SSS ), sono pi
u efficienti nelleseguire con essa operazioni di
tipo BLAS2 o BLAS3. E preferibile dunque convertire la matrice in un formato efficiente
prima di eseguire tali operazioni. A questo scopo sono disponibili le funzioni opportune.
NB: ricordiamo che in una matrice sparsa ci sono in genere molte componenti non implementate, e trattate come zeri, e relativamente poche componenti implementate, dette
nonzeri. Le prime sono zeri strutturali, le seconde sono valori in generale diversi da zero
ma che possono anche essere uguali a zero (zeri accidentali ). La disposizione dei nonzeri si
17
F.Marcuzzi - M.R.Russo
dice anche struttura di sparsita della matrice. Il rapporto tra numero di nonzeri e numero
totale di componenti e detto indice di densit
a, ed e compreso nellintervallo [0, 1]. Una
matrice con indice di densita pari a 1 si dice densa.
Vediamo una sintesi delle operazioni principali:
from spmatrix import *
from spmatrix_util import *
4.2.1
18
4.2.2
Creazione di Grafici
Utilizziamo il modulo gplt facente parte dellestensione SciPy. Esso si appoggia a Gnuplot.
import scipy
# caricamento del modulo scipy
from scipy import gplt
# caricamento del modulo gplt
from Numeric import *
# caricamento del modulo Numeric
5.1
Grafici bi-dimensionali
19
F.Marcuzzi - M.R.Russo
#
#
# esempi:
gplt.plot((1,2,3))
5.2
Grafici tri-dimensionali
Per fare il grafico di una superficie, in 3D, definita per punti interpolati linearmente, si
usa la funzione
# Per fare il grafico di una superficie in 3D definita da un insieme di
20
5.3
Immagini
21
F.Marcuzzi - M.R.Russo
Parte II
6
6.1
Librerie
6.2
22
8.1
Interpolazione polinomiale
definizione di un polinomio:
= poly1d([1,3,4]) # definisce il polinomio: x^2 + 3*x + 4
derivata di un polinomio:
= p.deriv() # "d" e il polinomio uguale alla derivata di "p"
valutazione di un polinomio:
= [1.2,3.55,7.0,14.9] # insieme di valori
= p(x) # "y" e il vettore di valori che assume "p" nei punti "x"
8.2
23
F.Marcuzzi - M.R.Russo
10
11
12
13
13.1
Classi e Oggetti
definizione di un metodo: def < nome metodo >(self , < argomenti > ) :
definizione di una variabile: self.< nome variabile > = < valore >
Nota: self e il riferimento allistanza (oggetto) che sta chiamando il metodo della classe.
Nota: i metodi di una classe si comportano come una normale funzione Python; e possibile
assegnare valori di default nel seguente modo: < argomento >=< valore di def ault >.
Utilizzo della classe:
creazione di unistanza della classe: < variabile > = < nome classe >()
accesso ai suoi metodi : < nome istanza >.< nome metodo >( < argomenti > )
oppure < nome classe >.< nome metodo >( < nome istanza > , < argomenti >
)
accesso alle sue variabili : < nome istanza >.< nome variabile >
Ispezione di classi e oggetti:
la funzione (built-in) type( < nome > ) ci dice se nome e class oppure instance.
24
la funzione (built-in) dir( < nome > ) ritorna una lista dei nomi delle proprieta e
dei metodi, se nome e una classe, ed una lista dei nomi delle variabili, se nome e
unistanza.
la proprieta bases
questa e derivata.
la proprieta dict di unistanza, contiene la lista delle coppie < nome >:<
valore > relative alle sue variabili interne.
la proprieta
13.1.1
class
25