Introduzione Python
Introduzione Python
Felice Iavernaro
Dipartimento di Matematica
Università di Bari
Ottobre 2015
Calcolo Numerico
INFORMATICA L.T.
https://www.continuum.io
(Calcolo Numerico) Informatica 10/2015 6 / 105
IDE
Durante questo corso utilizzeremo la IDE Spyder (inclusa in anaconda)
quale interfaccia grafica all’interno della quale utilizzare Python:
1
qui e nel seguito, per sintetizzare, faremo riferimento alle proprietà principali degli
oggetti che descriviamo. La trattazione risulta quindi incompleta ma di più semplice
comprensione.
(Calcolo Numerico) Informatica 10/2015 8 / 105
Numeri interi
>>> -3e8
>>> 2.34e-12
ESEMPI
>>> 2.0**30 >>> 3/2 >>> 5.0-2//3
1073741824.0 1.5 5.0
>>> type(2.0**30) >>> 3.0//2.0 >>> 5-2/3
float 1.0 4.333333333333333
(Calcolo Numerico) Informatica 10/2015 10 / 105
Aritmetica di macchina
Python rappresenta i numeri reali in base binaria utilizzando la doppia
precisione.
Ciascun numero è memorizzato in un campo da 64 bit2 di cui:
1 bit identifica il segno (+ o -);
52 bit sono dedicati alla memorizzazione della mantissa Ciò
corrisponde, in base 10, a circa 16 cifre significative.
11 bit sono dedicati alla memorizzazione dell’esponente.
Ad esempio i numeri 1.2345678901234567890 e 1.2345678901234566
verranno rappresentati dal medesimo numero di macchina.
>>> 1.2345678901234567890 == 1.2345678901234566
True
Inoltre non potranno essere rappresentati numeri né troppo grandi né
troppo piccoli (in valore assoluto). Esempio: digitare
>>> a=12.345
>>> b=a+1
>>> A=3.1
>>>a+A
15.445
(Calcolo Numerico) Informatica 10/2015 12 / 105
Le variabili: proprietà (1/2)
Le variabili sono sovrascrivibili, cioè, se digitiamo ora la stringa
>>> A = 0.5
il precedente valore 3.1 viene definitivamente perso.
È possibile e↵ettuare più assegnazioni sulla stessa riga, separate dal
simbolo ;
>>>w1=2.3; w2=-3.5; t=0.12;
Alternativamente si può anche scrivere (assegnazione multipla)
>>>w1, w2, t = 2.3, -3.5, 0.12
una variabile può essere una qualsiasi combinazione di caratteri
alfanumerici. Il nome di una variabile non può iniziare con un numero;
inoltre vi sono alcuni caratteri non ammessi, poiché hanno diverso
significato (* + / - . , = ecc.).
Più avanti esamineremo più in dettaglio il significato delle variabili in
Python. Al momento pensiamole come contenitori di valori.
(Calcolo Numerico) Informatica 10/2015 13 / 105
Le variabili: proprietà (2/2)
Nota tecnica: Le variabili definite all’interno della shell, risiedono in una
zona di memoria chiamata main namespace. Il modulo main è
l’ambiente all’interno del quale viene eseguito un interprete di Python,
come ad es. IPython.
Per visualizzare il contenuto di una variabile, si digita la variabile e si
preme invio o, alternativamente, si digita print(nomevariabile)
Per visualizzare tutte le variabili definite (all’interno dello spazio dei
nomi principale) dall’inizio della sessione di lavoro:
>>> import __main__
>>> dir(__main__)
Per cancellare una variabile dal main namespace si utilizza il comando
del. Esempi:
>>> del A
>>> del w1, w2
>>> dir(__main__)
+ addizione;
sottrazione;
⇤ moltiplicazione;
/ divisione;
⇤⇤ elevamento a potenza;
Esempi:
>>> 2**3
8 >>> 2**3/4
>>> 2**-3 2.0
0.125 >>> 2**(3/4)
>>> 2**0.5 1.681792830507429
1.4142135623730951
>>> sqrt(2)
Le funzioni matematiche elementari sono disponibili dopo aver caricato il modulo numpy:
Questo comando carica in memoria tutte le funzioni presenti nel modulo numpy e le
rende accessibili all’utente mediante la sintassi:
>>> numpy.nome_funzione
Ad esempio:
>>> numpy.sqrt(2)
1.4142135623730951
Altre funzioni:
abs valore assoluto o modulo sqrt radice quadrata
fix parte intera round arrotondamento
>>> np.nome_funzione
Esempi:
>>> np.sqrt(2) >>> 4*np.arctan(1)
1.4142135623730951 3.1415926535897931
>>> np.log(2) >>> np.sinh(2)
0.69314718055994529 3.6268604078470186
>>> np.round(np.log(2)) >>> (np.exp(2)-np.exp(-2))/2
1.0 3.626860407847019
Esempi:
>>> sqrt(2)
1.4142135623730951
>>> log(2)
0.69314718055994529
>>> round(log(2))
1.0
Esempi
>>> 2>=1 >>> (np.sqrt(2))**2==2
True >>> a=np.log(3)>1 False
>>> not 2>1 >>> print(a) >>> (np.sqrt(2))**2
False True 2.0000000000000004
>>> 2>1 and 0>1 >>> b=not a >>> np.cos(np.pi/2)==0
False >>> print(b) False
>>> 2>1 or 0>1 False >>> np.cos(np.pi/2)
True 6.123233995736766e-17
VOLO n. AZ1609
partenza da Roma, ore 09:20
arrivo a Bari, ore 10:30"""
>>> lettera
’Caro Fabio,\n ecco gli estremi del mio volo:\n VOLO n. AZ1609
\n partenza da Roma, ore 09:20\n arrivo a Bari, ore 10:30’
>>> print(lettera)
Caro Fabio,
ecco gli estremi del mio volo:
VOLO n. AZ1609
partenza da Roma, ore 09:20
arrivo a Bari, ore 10:30
Esempio
>>> a,b,c=1,-5,6
>>> delta=b**2-4*a*c
>>> x1=(-b-np.sqrt(delta))/(2*a)
>>> x2=(-b+np.sqrt(delta))/(2*a)
>>> print("le radici sono: x1=", x1," x2=",x2)
if condizione :
istruzioni
Da ricordare:
1 condizione rappresenta l’argomento del costrutto if. È una qualsiasi
proposizione la cui veridicità viene esaminata;
2 istruzioni rappresenta il blocco delle istruzioni che formano il corpo
del costrutto if. Tali istruzioni dovranno essere indentate, inserendo
un certo numero di spazi. Comunemente si inserisce un carattere di
tabulazione (tasto TAB);
3 se l’argomento dell’if risulta vero, vengono eseguite le istruzioni
corrispondenti al corpo dell’if. Viceversa, se l’argomento dell’if è falso,
viene e↵ettuato un salto alla riga successiva alla fine del costrutto if.
(Calcolo Numerico) Informatica 10/2015 26 / 105
Selezione (2/3): Esempio
Calcolo del valore assoluto di un numero x, supponendo di aver assegnato
a x un valore.
>>> if x<0:
x=-x
È possibile inserire queste istruzioni direttamente da riga di comando nella
shell. Alternativamente possiamo inserirle in un file di testo con estensione
.py (utilizzando, ad esempio, l’editor di Spyder) ed eseguire il file mediante
il comando run. Opteremo per questa seconda scelta, che in seguito
perfezioneremo. Creiamo il file valore assoluto.py, contenente il codice:
x=input("inserisci un numero: x=")
x=float(x)
if x<0:
x=-x
print("il valore assoluto di x e’:",x)
N.B. L’output della funzione input è una stringa, che viene poi convertita
in numero mediante la funzione float
(Calcolo Numerico) Informatica 10/2015 27 / 105
Selezione (3/3): definizione generale
L’uso completo del costrutto if è:
if prima condizione :
istruzioni
elif seconda condizione :
istruzioni
..
.
else :
istruzioni
Esempio: calcolo del segno di un numero reale x. Scriviamo il seguente
codice in uno script file che denomineremo segno.py
x=float(input("inserisci un numero: x="))
if x>0:
s=1
elif x==0:
s=0
else:
s=-1
print("il segno di x e’:",s)
(Calcolo Numerico) Informatica 10/2015 28 / 105
Un primo esempio di funzione
Normalmente è meglio evitare l’uso dell’istruzione input per l’ingresso da
tastiera dei dati da elaborare, e del comando print per la stampa a video
dei dati di output. Risulta invece più vantaggioso riguardare il codice
all’interno di una funzione. Ecco la sintassi per il calcolo del segno di un
numero:
def segno(x):
if x>0:
s=1
elif x==0:
s=0
else:
s=-1
return s
>>> print(somma)
55
Stampa i primi 20 numeri della successione di Fibonacci
>>> a,b=1,1
>>> for k in range(2,15+2):
print(a)
c=a+b
a=b
b=c
Si scriva una funzione di nome inverti che abbia in input una stringa s
e in output una stringa r che contenga gli stessi caratteri di s ma in
ordine inverso
Esempio:
s = “enoteca” =) r = “acetone”
def MCD(m,n):
"""
Calcola il Massimo Comune Divisore tra due numeri
"""
while m!=n:
if m>n:
m=m-n
else:
n=n-m
return m
Riconosciamo:
la parola chiave def che identifica l’inizio della funzione;
la parola chiave return che identifica la fine della funzione;
il nome della funzione;
le variabili di input a,b,...;
le variabili di output c,d,...;
IMPORTANTE: Tutte le variabili usate all’interno di una function sono variabili locali,
cioè esistono solo durante l’esecuzione della funzione e non modificano il main
namespace. Ad esempio, la variabile a usata all’interno di una function sarà diversa dalla
variabile a usata in un’altra function o nella shell.
(Calcolo Numerico) Informatica 10/2015 39 / 105
Funzioni: come scriverle.
Un qualsiasi editor di testo può essere utilizzato per scrivere il codice che
definisce una funzione. Spyder possiede un proprio editor di testo che ci
aiuta durante la scrittura di un programma, mediante l’uso di colori,
l’indentazione automatica, il check della correttezza semantica del codice,
ecc.
Una volta scritta la funzione, la si salva in un file, mediante la barra degli
strumenti dell’editor.
Il nome del file non deve necessariamente coincidere con quello della
funzione.
Ogni file dovrà avere l’estensione .py per essere riconosciuto da
Python.
3
da discutere in seguito
(Calcolo Numerico) Informatica 10/2015 40 / 105
Funzioni: come caricarle (1/2)
4
per maggiore chiarezza, riportiamo esplicitamente possibili valori di input
(Calcolo Numerico) Informatica 10/2015 42 / 105
Liste (definizione)
Un lista è un insieme ordinato di oggetti non necessariamente omogenei. Per definire
una lista, si elencano i suoi oggetti separandoli da virgole e racchiudendoli tra parentesi
quadre.
Vediamo qualche esempio:
Come per le stringhe, per accedere agli elementi di una lista si indicano gli indici tra
parentesi quadre:
>>> z[0] <-- l’indice del primo >>> z[-1]
’a’ elemento della lista \‘e 0 [1, -2, 0.125]
>>> type(z[0]) >>> type(z[-1])
<type ’str’> <type ’list’>
>>> z[3] >>> z[-1][1]
<ufunc ’log’> -2
>>> z[3](2) >>> z[-1][-1]
0.69314718055994529 0.125
>>> L1=[1,2,3,"a","b","c"]
>>> len(L1)
6
Concatenazione:
>>> L2=["d","e",4,5]
>>> L=L1+L2
>>> L
[1, 2, 3, ’a’, ’b’, ’c’, ’d’, ’e’, 4, 5]
Moltiplicazione:
>>> L3=["bla","bla"]
>>> 2*L3
[’bla’, ’bla’, ’bla’, ’bla’]
>>> 3*L3
[’bla’, ’bla’, ’bla’, ’bla’, ’bla’, ’bla’]
>>> L=["a",1,"b",2,"c",3,"b",4]
>>> L
[’a’, 1, ’b’, 2, ’c’, 3, ’b’, 4]
>>> L.remove("b")
>>> L
[’a’, 1, 2, ’c’, 3, ’b’, 4]
>>> L.pop(3)
’c’
>>> L
[’a’, 1, 2, 3, ’b’, 4]
1 Scrivere una funzione di nome somma che abbia in input una lista
numerica e in output la somma degli elementi della lista. Applicare la
funzione al vettore x = [1.5, 0.2, 3.1, 2.6]. Confrontare con la
funzione predefinita sum del modulo numpy.
2 Scrivere una funzione di nome media che abbia in input una lista
numerica e in output la media degli elementi della lista. Tale funzione
dovrà richiamare la funzione somma. Confrontare con la funzione
predefinita mean del modulo numpy.
3 Scrivere una funzione di nome varianza che abbia in input una lista
numerica e in output la varianza degli elementi della lista. Tale
funzione dovrà richiamare la funzione media. Confrontare con la
funzione predefinita var del modulo numpy.
L’accesso agli elementi di una tupla segue la medesima sintassi vista per le stringhe e
per le liste:
>>> z[0]="c"
>>> z[0]
’a’ Traceback (most recent call last):
>>> z[-1] File "<pyshell#25>", line 1, in <module>
[1, -2, 0.125] z[0]="c"
>>> z[-1][1] TypeError: ’tuple’ object does not support
-2 item assignment
>>> z[:3] >>> z[-1][1]=3
(’a’, -7, ’b’) >>> z
(’a’, -7, ’b’, <ufunc ’log’>, [1, 3, 0.125])
(Calcolo Numerico) Informatica 10/2015 50 / 105
Stringhe, Liste e Tuple: operatori in, + e *
Per tutte e tre i tipi, gli operatori
in : appartenenza
+ : concatenazione
* : moltiplicazione
hanno il medesimo significato. Esempi:
>>> x=("a","b",1,2,3)
>>> y="Elvira" >>> w=z+["e",(1,2)]
>>> z=[4,5,6,"c","d"] >>> w
>>> "a" in x [4, 5, 6, ’c’, ’d’, ’e’, (1, 2)]
True >>> 2*x
>>> "a" in y (’a’, ’b’, 1, 2, 3, ’a’, ’b’, 1, 2, 3)
True >>> 2*z
>>> "a" in z [4, 5, 6, ’c’, ’d’, 4, 5, 6, ’c’, ’d’]
False >>> 3*y
>>> x+("c","d",-3) ’ElviraElviraElvira’
(’a’, ’b’, 1, 2, 3, ’c’, ’d’, -3)
La gestione delle liste è più lenta ma più potente rispetto a quella delle tuple.
Le liste hanno il grande vantaggio di poter essere modificate sul posto. Inoltre per
esse sono definite numerose operazioni utili per la gestione dei dati.
Le tuple sono immutabili (dunque non modificabili) e per esse sono disponibili
meno metodi.
>>> x=("a","b",1,2,3)
>>> type(x)
tuple
>>> y=list(x)
>>> y
[’a’, ’b’, 1, 2, 3]
>>> type(y)
list
Ogni oggetto possiede un suo tipo, indipendentemente dal fatto che vi sia
un’assegnazione.
Se assegnamo un oggetto a una variabile, essa assume il tipo dell’oggetto a cui si
riferisce.
Dunque, la nozione di tipo risiede nell’oggetto e non nella variabile che si riferisce
all’oggetto.
1 Viene creato un oggetto (che nel nostro caso coincide con l’intero 18) e conservato
in memoria;
1 Viene creato un oggetto (che nel nostro caso coincide con l’intero 18) e conservato
in memoria;
2 viene creato il nome a (nel caso in cui non esista già);
1 Viene creato un oggetto (che nel nostro caso coincide con l’intero 18) e conservato
in memoria;
2 viene creato il nome a (nel caso in cui non esista già);
3 viene creato un collegamento (referenza) che partendo da a, punta alla locazione
di memoria che contiene l’oggetto 18.
>>> L1 = [1, 2, 3]
>>> L1 = [1, 2, 3]
>>> L2 = L1[:] < crea una copia di L1
>>> L1 = [1, 2, 3]
>>> L2 = L1[:] < crea una copia di L1
>>> L1[1] = 4
>>> L2
[1, 2, 3]
Esercizio. Si scriva una funzione che abbia in input un numero intero positivo x0 e
restituisca in output
- il più piccolo intero n tale che xn = 1;
- una lista x che contenga l’intera sequenza di valori x0 , x1 , . . . , xn .
Suggerimento. Per stabilire se un numero è pari o dispari, può essere utile la function
mod del modulo numpy . Se x e y sono due numeri interi positivi, mod(x, y ) restituisce
il resto della divisione tra x e y . Dunque se mod(x, 2) è uguale a 0, x è pari, mentre se
è uguale a 1, allora x è dispari.
5
http://it.wikipedia.org/wiki/Congettura_di_Collatz.
(Calcolo Numerico) Informatica 10/2015 59 / 105
Definizione di matrice reale
Definizione
Dati due interi positivi m ed n, una matrice A reale m ⇥ n è un array
bidimensionale avente m righe ed n colonne cosı̀ definito
0 1
a11 a12 · · · · · · a1n
B a21 a22 · · · · · · a2n C
B C
A=B . .. .. C
@ .. . . A
am1 am2 · · · ··· amn
A : {1, 2, . . . , m} ⇥ {1, 2, . . . , n} ! R
Esempio (A 2 R3⇥4 )
0 p 1
2 0 1 3
A = @ ⇡ log(3) 1/3 1 A,
2/3 0 sin(⇡/7) 4/3
è una matrice 3 ⇥ 4, ovvero a 3 righe e 4 colonne.
I due tipi matrix e array condividono diversi metodi. Per ottenere la lista dei
metodi associati ai due tipi, digitare, dal prompt dei comandi, dir(A) per la
matrice definita in precedenza e dir(B) per l’array definito qui sopra.
Benché meno generale e meno di↵uso rispetto all’array, l’oggetto matrix è più
idoneo nel contesto dell’algebra lineare numerica e pertanto, insieme all’array, sarà
utilizzato durante il presente corso. In ogni caso è sempre possibile:
ESEMPIO:
0 1
0 3
B 4 1 C
x = (6, 4, 0, 6, 8, 0, 0) =) A = B
@ 6
C
2 A
8 1
>>>identity(4)
array([[ 1., 0., 0., 0.],
[ 0., 1., 0., 0.],
[ 0., 0., 1., 0.],
[ 0., 0., 0., 1.]])
>>>D=diag([1,-2,3])
>>>D
array([[1, 0, 0],
[0,-2, 0],
[0, 0, 3]])
(Calcolo Numerico) Informatica 10/2015 69 / 105
Addizione tra matrici (1/2)
Definizione
Se A = {aij } e B = {bij } sono matrici m ⇥ n si definisce somma tra A e B
la matrice
A + B = {aij + bij } 2 Rm⇥n
Esempio
0 1 0 1 0 1
1 2 3 1 0 1 2 2 4
A=@ 1 0 1 A, B = @ 1 2 0 A, A+B = @ 2 2 1 A.
2/3 1 2 1/3 4 3 1 3 1
>>> asarray(A)+asarray(B)
array([[ 2, 2, 4],
[-2, -2, 1]])
Definizione
Se A = {aij } 2 Rm⇥n e 2 R, si definisce prodotto di per A la matrice
· A = { aij } 2 Rm⇥n
Esempio
0 1 0 1
1 2 3 2 4 6
A= @ 1 0 1 A, 2·A= @ 2 0 2 A.
2/3 1 2 4/3 2 4
AT = {aji }, i = 1, . . . m, j = 1, . . . n.
Pertanto AT 2 Rn⇥m .
Esempio
0 1
✓ ◆ 1 1
1 2 3
A= =) AT = @ 2 0 A.
1 0 1
3 1
>>> B=A.T
>>> B
matrix([[ 1, -1],
[ 2, 0],
[ 3, 1]])
>>> C=transpose(B)
>>> C
matrix([[ 1, 2, 3],
[-1, 0, 1]])
(Calcolo Numerico) Informatica 10/2015 75 / 105
Prodotto di matrici (righe per colonne)
Ricordiamo che se a e b sono due vettori (colonna) di lunghezza n, il
prodotto scalare di a e b denotato con aT b è cosı̀ definito:
n
X
aT b ⌘ ak bk .
k=1
aT
i ! i-esima riga di A; bj ! j-esima colonna di B.
Osservazione
Il prodotto tra due matrici è possibile solo se il numero di colonne del
primo fattore coincide con il numero di righe del secondo fattore.
0 1
✓ ◆ ✓ ◆ 1 1 3
1 2 3 4 aT1 B 1 0 1 C
A= 1 0 1 2
= aT2
, B=@ 0 2 1 A = ( b1 , b 2 , b3 )
2 1 2
✓ ◆ ✓ ◆
aT T T
1 b1 a1 b2 a1 b3 7 9 6
A·B = =
a2 b1 a2 b2 aT
T T
2 b3 3 5 8
B · A non è possibile.
0 1 0 1 0 1
1 2 3 1 5
@ 4 5 6 A · @ 1 A = @ 11 A
7 8 9 2 17
0 1
1 2 3
1 1 2 · @ 4 5 6 A= 11 13 15
7 8 9
0 12 0 1 0 1 0 1
1 2 3 1 2 3 1 2 3 30 36 42
@ 4 5 6 A = @ 4 5 6 A · @ 4 5 6 A = @ 66 81 96 A
7 8 9 7 8 9 7 8 9 102 126 150
✓ ◆ ✓ ◆ ✓ ◆
1 2 0 1 4 1
· =
3 4 2 1 8 1
✓ ◆ ✓ ◆ ✓ ◆
0 1 1 2 3 4
· =
2 1 3 4 1 0
Osservazione
Dunque, se A e B sono quadrate dello stesso ordine, A · B e B · A sono
ben definite, tuttavia, in generale A e B non sono permutabili cioè, in
generale, A · B 6= B · A.
Ne segue che la moltiplicazione tra matrici non è commutativa.
>>> C=A*B
>>> C
matrix([[ 3, 3, -5, 4],
[ 9, 9, -8, 7]])
>>> [m,n]=shape(A)
>>> print(m,n)
2 3
>>> arange(2:3)
array([2])
>>> arange(2,2)
array([], dtype=int64)
>>> arange(10,1)
array([], dtype=int64)
In questa accezione arange assume lo stesso significato di range usato in
precedenza nel ciclo for.
(Calcolo Numerico) Informatica 10/2015 83 / 105
La funzione “arange” (2/3)
a, a + h, a + 2h, . . . , a + mh
a + mh < b e a + (m + 1)h b.
>>> arange(10,20,2)
array([10, 12, 14, 16, 18])
>>> arange(10,21,3)
array([10, 13, 16, 19])
>>> arange(100,78,-5)
array([100, 95, 90, 85, 80])
>>> arange(0,pi/4,0.1)
array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7])
>>> linspace(0,1,11)
array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8,
>>> linspace(0,pi,8)
array([ 0. , 0.44879895, 0.8975979 , 1.34639685,
1.7951958 , 2.24399475, 2.6927937 , 3.14159265])
x ⇤ y = [x1 y1 , x2 y2 , x3 y3 ]
Analogamente, avremo:
e
x ⇤ ⇤y = [x1y1 , x2y2 , x3y3 ]
>>> A*B
array([[ -2, 8, 6],
[ -4, 15, -12]])
>>> A/B
array([[-0.5 , 0.5 , 1.5 ],
[-4. , 1.66666667, -3. ]])
(Calcolo Numerico) Informatica 10/2015 88 / 105
Tabulare una funzione (1/2)
Consideriamo una funzione reale di variabile reale y = f (x). Sia
x = [x1 , x2 , . . . , xn ] un vettore di elementi appartenenti al dominio di f .
Vogliamo costruire il vettore delle valutazioni di f , cioè
y = [f (x1 ), f (x2 ), . . . , f (xn )].
y = x2 e x:
>>> y=(x**2)*exp(-x)
>>> y
array([0., 0.2812455, 0.512922, 0.5261868, 0.4265042])
x
y= :
cos(x)
>>> y=x/cos(x)
>>> y
array([ 0.00000000e+00, 1.11072073e+00, 2.56530508e+16,
-3.33216220e+00, -3.14159265e+00])
(Calcolo Numerico) Informatica 10/2015 90 / 105
Grafico di una funzione: esempio Python (1/2)
Si voglia rappresentare il grafico della funzione y = sin(x)e x
nell’intervallo [0, 2⇡]. Per le istruzioni grafiche faremo uso del modulo
pylab che caricheremo in memoria ad esempio mediante il comando
>>> x=linspace(0,2*pi,100)
>>> y=sin(x)*exp(-x)
>>> plot(x,y)
Un dizionario è una struttura non ordinata di elementi che realizza un’associazione tra
due insiemi:
l’insieme delle chiavi (keys)
l’insieme dei valori (values)
Le chiavi possono essere di qualsiasi tipo, purché immutabile. I valori possono essere di
qualsiasi tipo (anche mutabile). Esempi:
>>> pari=[0,2,4,6,2,0,8,0,8]
>>> s1=set(pari)
>>> s1
set([0, 8, 2, 4, 6])
>>> type(s1)
set
>>> dispari=(1,1,3,3,5,5,7,9)
>>> s2=set(dispari)
>>> s2
set([1, 3, 9, 5, 7])
>>> vocali="AEIOU"
>>> s3=set(vocali)
>>> s3
set([’A’, ’I’, ’E’, ’U’, ’O’])
>>> "O" in s3
True
>>> "B" in s3
False
nostre elaborazioni.
Python permette di svolgere le comuni operazioni sui file: apertura e chiusura di un file,
lettura e scrittura su un file, ecc.
L’istruzione per aprire un file è open. La sintassi completa è:
nomeoggetto=open(“nomefile”, modalità)
dove nomefile indica il nome del file da aprire, di solito un file di testo (ad es. dati.txt).
Il secondo argomento indica l’operazione che si intende compiere sul file. Le possibilità
sono:
“w” : scrittura (write)
“r” : lettura (read)
“a” : appende (append) il testo in coda a quello preesistente
“r+” : lettura e scrittura
La funzione open, restituisce un oggetto di tipo file che verrà assegnato al nome
nomeoggetto. I metodi di tale oggetto permetteranno la manipolazione del file.
(Calcolo Numerico) Informatica 10/2015 98 / 105
Scrivere in un file: un semplice esempio
ESERCIZIO: Aprire un nuovo file di nome prova.txt nella directory di
lavoro, e scrivere il nostro nome e cognome.
Per fissare le idee supponiamo che il path che identifica la nostra directory
sia
C:\python
>>> prova=open("C:\python\prova.txt","w")
>>> prova.write("Felice Iavernaro")
>>> prova.close()
>>> prova=open("C:\python\prova.txt","r")
>>> nominativo=prova.readline()
>>> prova.close()
>>> print(nominativo)
Felice Iavernaro
>>> es=open("esempio.txt","w")
>>> es.write("Ciccio;3284354123\n") <-- il ";" e’ un separatore tra
>>> es.write("Elvira;3391234567\n") i due campi (nome e numero)
>>> es.write("Marco;3479876543\n") \n indica l’andata a capo
>>> es.close() (su Mac: \r)
>>> es=open("esempio.txt","a")
>>> es.writelines(["Carla;3336543210\n","Paolo;3389753108\n"])
>>> es.close()
Il metodo writelines permette la scrittura di più stringhe, inserite come elementi di una
lista (o una tupla).
Ricontrolliamo il contenuto del file esempio.txt. Ora leggiamone il contenuto e
carichiamo la rubrica in un dizionario.
>>> rubrica
{’Paolo’: ’3389753108’, ’Carla’: ’3336543210’, ’Marco’: ’3479876543’,
’Ciccio’: ’3284354123’, ’Elvira’: ’3391234567’}
>>> es.close()
>>> agenda.close()
oppure
>>> agenda=open("agenda.txt","w")
>>> for nome,numero in rubrica.items():
riga=nome+";"+numero+"\n"
agenda.write(riga)
>>> agenda.close()
Altro esempio di for
>>> stringa="ciao"
>>> for k in stringa:
print(k)
c
i
a
o
(Calcolo Numerico) Informatica 10/2015 105 / 105