2. 2
Python!
Creato nel 1991 da Guido van Rossum
Il nome deriva da Monty Python
Utile come linguaggio di scripting
script: Piccolo programma per un unico utilizzo
Sviluppato per supportare progetti di tipo medio/piccolo
Usato da:
Google, Yahoo!, Youtube
Molte distribuzioni Linux
Giochi and app
Recentemente diffuso in ambito
scientifico
3. 3
Installare Python
Windows:
Download Python da
http://www.python.org
Installate Python.
Aprite Idle dal menu Start.
Mac OS X:
Python e gia installato.
Aprite un terminale ed
eseguite python o lanciate
Idle da Finder.
Linux:
E probabile che Python sia
gia installato. Verificate
scrivendo python nel
terminale.
Se non e disponibile
installatelo dal sistema di
gestione dei pacchetti della
vostra distribuzione.
4. 4
Linguaggi interpretati
interpretato
Non compilato come Java, C, C++
Codice scritto ed eseguito direttamente da un
interprete
E possibile scrivere comandi direttamente
nellinterprete e osservarne il risultato (come in R)
Compute
r
Runtime
Environment
Compiler
Code
Java:
Compute
r
Interpreter
Code
Python:
5. 5
L
Interprete Python
Permette di scrivere comandi uno alla volta ed
osservarne il risultato
Modo molto comodo di fare esperienza con la
sintassi di Python
6. 6
Primo programma in
Python
Python non ha un metodo main come Java
Il codice del programma e semplicemente scritto nel
file che verra eseguito (file sorgente)
In Python le righe non finiscono con ; (come in PERL)
hello.py
1 print("Hello, world!")
7. 7
La funzione print
print("text")
print() (una linea vuota)
Sequenze di escape come " sono le stesse di Java
Le stringhe possono iniziare/finire con '
swallows.py
1
2
3
4
print("Hello, world!")
print()
print("Suppose two swallows "carry" it together.")
print('African or "European" swallows?')
8. 8
Commenti
Sintassi:
# testo commentato (una riga)
swallows2.py
1
2
3
4
5
6
# Mario Rossi, MTD, autunno 19
# Messaggi importanti.
print("Hello, world!")
print() # linea vuota
print("Suppose two swallows "carry" it together.")
print('African or "European" swallows?')
9. 9
Funzioni
Funzioni: Equivalenti di metodi statici in Java (e di funzioni in
R).
Sintassi
def name():
statement
statement
...
statement
DEVE essere dichiarata al di sopra del codice principale (main)
Espressioni allinterno delle funzioni DEVONO essere INDENTATI
(ad es. ogni riga inizia con una o piu tabulazioni)
hello2.py
1
2
3
4
5
6
7
# Prints a helpful message.
def hello():
print("Hello, world!")
# main (calls hello twice)
hello()
hello()
10. 10
Significato spazi bianchi
Python usa le indentazioni per indicare I blocchi di
codice invece di {}
Questo rende il codice piu leggibile
In Java lindentazione e opzionale. In Python essa e
obbligatoria!
hello3.py
1
2
3
4
5
6
7
8
# Prints a helpful message.
def hello():
print("Hello, world!")
print("How are you?")
# main (calls hello twice)
hello()
hello()
11. 11
Esercizio (funzioni)
Scrivere un programma Python che ricrei questo output:
______
/
/
/
______/
/
______/
+--------+
______
/
/
| STOP |
/
______/
______
/
/
+--------+
14. 14
Espressioni
Aritmetica molto simile a Java e R
Operatori: + - * / %
Precedenza: () quindi ** quindi * / % quindi + -
Numeri interi e numeri reali
>>> 1 + 1
2
>>> 1 + 3 * 4 - 2
11
>>> 7 / 2
3
>>> 7.0 / 2
3.5
>>> 10 ** 6
1000000
15. 15
Operatori aritmetici
Assumendo le variabili a=5 e b=3 :
+ Addizione Es: a+b=8
Sottrazione Es: a-b=2
* Moltiplicazione Es: a*b=15
/ Divisione reale Es: a/b= 1.6666666666666667
// Divisione intera Es: a//b=1
% Resto della divisone Es: a%b=2
** Potenza di un numero Es: a**b=125
16. 16
Operatori di assegnazione 1
= assegna Es: a=5 assegna alla variabile a che sta a sinistra il valore 5 (ovvero ci嘆 che
竪 a destra delluguale.) Un altro esempio potrebbe essere a=b+c dove ad a stavolta
assegniamo la somma b+c.
+= somma e assegna Assegna alloperando di sinistra la somma tra esso e loperando
di destra.Es: a+=2 equivale a fare a=a+2, quindi assegna alla variabile a che sta a sinistra
il valore di a (supponiamo sempre a=5) sommato a 2. Quindi otterremo a=7.
= sottrae e assegna Assegna alloperando di sinistra la differenza tra esso e
loperando di destra. Es: a-=2 equivale a fare a=a-2, quindi assegna alla variabile a che sta
a sinistra il valore di a (supponiamo sempre a=5) meno 2. Quindi otterremo a=3.
*= moltiplica e assegna Assegna alloperando di sinistra il prodotto tra esso e loperando
di destra.Es: a*=2 equivale a fare a=a*2, quindi assegna alla variabile a che sta a sinistra il
valore di a (supponiamo sempre a=5) moltiplicato per 2. Quindi otterremo a=10.
/= divide e assegna Assegna alloperando di sinistra la divisione reale tra esso e
loperando di destra. Es: a/=2 equivale a fare a=a/2, quindi assegna alla variabile a che sta
a sinistra il valore di a (supponiamo sempre a=5) diviso 2. Quindi otterremo a=2.5.
17. 17
Operatori di assegnazione 2
//= divide e assegna Assegna alloperando di sinistra la divisione
arrotondata tra esso e loperando di destra. Es: a//=2 equivale a fare
a=a//2, quindi assegna alla variabile a che sta a sinistra il valore di a
(supponiamo sempre a=5) diviso 2 arrotondato allintero. Quindi
otterremo a=2.
%= calcola il resto e assegna Assegna alloperando di sinistra il resto
ottenuto dalla divisione tra esso e loperando di destra. Es: a%=2
equivale a fare a=a%2, quindi assegna alla variabile a che sta a sinistra il
valore di a (supponiamo sempre a=5) diviso 2 arrotondato allintero.
Quindi otterremo a=1.
**= calcola la potenza e assegna Assegna alloperando di sinistra il
risultato dellelevamento a potenza di esso come base ed esponente
loperando di destra. Es: a**=2 equivale a fare a=a2, quindi assegna alla
variabile a che sta a sinistra il valore di a (supponiamo sempre a=5)
elevato a 2. Quindi otterremo a=25.
18. 18
Variabili
Dichiarazione
Non si scrive il tipo; stessa sintassi dellassegnamento
Operatori
Non esistono operatori ++ o -- operatori (si incrementa
o decrementa di 1)
Java Python
int x = 2;
x++;
System.out.println(x)
;
x = x * 8;
System.out.println(x)
;
double d = 3.2;
d = d / 2;
System.out.println(d)
;
x = 2
x = x + 1
print(x)
x = x * 8
print(x)
d = 3.2
d = d / 2
print(d)
19. 19
Variabili
Regole di definizione dei nomi di variabile
Alle variabili viene sempre assegnato un nome
Il nome di una variabile non puo essere un numero
Il nome di una variabile non puo iniziare con un numero
(es. 5area non e ammesso, area5 si)
Gli spazi non sono ammessi nei nomi di variabile. Se
servono usate _ .
I nomi di varibile non possono contenere simboli (ad
esempio $,%,&,# ecc.)
Non possono essere nessuna delle parole chiave del
linguaggio. Per ottenere una lista delle parole chiave di
python scrivete keywords nel prompt di Python.
20. 20
Tipi di variabile
Python e piu permissivo di Java
Il tipo di variabile non va dichiarato
Le variabili possono cambiare di tipo durante
lesecuzione del programma
Per conoscere il tipo (attuale) di una variabile Python
mette a disposizione la funzione type(nomevariabile)
Value Java
type
Python
type
42 int int
3.14 double float
"ni!" String str
21. 21
Moltiplicare di stringhe
Le stringhe Python possono essere moltiplicate per
un valore intero.
Il risultato sono diverse copie concatenate della
stringa.
>>> "hello" * 3
"hellohellohello"
>>> print(10 * "yo ")
yo yo yo yo yo yo yo yo yo yo
>>> print(2 * 3 * "4")
444444
22. 22
Concatenare stringhe
Interi e stringhe non possono essere concatenate in
Python.
Possibile soluzione:
str(value) - converte valore in stringa
print(expr, expr) - stampa due variabili sulal stessa
linea
>>> x = 4
>>> print("Thou shalt not count to " + x + ".")
TypeError: cannot concatenate 'str' and 'int' objects
>>> print("Thou shalt not count to " + str(x) + ".")
Thou shalt not count to 4.
>>> print(x + 1, "is out of the question.")
5 is out of the question.
23. 23
Il ciclo for
for name in range(max):
statements
Ripete per valori tra 0 (incluso) e max (escluso)
>>> for i in range(5):
... print(i)
0
1
2
3
4
24. 24
for Variazioni ...
for name in range(min, max):
statements
for name in range(min, max, step):
statements
Possibile specificare un minimo diverso da 0 ed un step
diverso da 1
>>> for i in range(2, 6):
... print(i)
2
3
4
5
>>> for i in range(15, 0, -5):
... print(i)
15
10
5
25. 25
Cicli annidati
Cicli annidati sono spesso rimpiazzati da
moltiplocazioni e addizioni tra stringhe
....1
...2
..3
.4
5
Java
1
2
3
4
5
6
for (int line = 1; line <= 5; line++) {
for (int j = 1; j <= (5 - line); j++) {
System.out.print(".");
}
System.out.println(line);
}
Python
1
2
for line in range(1, 6):
print((5 - line) * "." + str(line))
26. 26
Esercizio
Riscrivete il programma Mirror in Python. Il suo
output e il seguente:
#================#
| <><> |
| <>....<> |
| <>........<> |
|<>............<>|
|<>............<>|
| <>........<> |
| <>....<> |
| <><> |
#================#
27. 27
Soluzione esercizio
def bar():
print "#" + 16 * "=" + "#"
def top():
for line in range(1, 5):
# Convenzione slide: linee troppo lunghe spezzate da
print "|" + (-2 * line + 8) * " " +
"<>" + (4 * line - 4) * "." + "<>" +
(-2 * line + 8) * " " + "|"
def bottom():
for line in range(4, 0, -1):
print "|" + (-2 * line + 8) * " " +
"<>" + (4 * line - 4) * "." + "<>" +
(-2 * line + 8) * " " + "|"
# main
bar()
top()
bottom() NON INSERITE IL CARATTERE NEL SORGENTE!
bar()
28. 28
Concatenazione di range
I range possono essere concatenati con il +
E possibile ciclare attraverso insiemi disgiunti di
numeri
>>> range(1, 5) + range(10, 15)
[1, 2, 3, 4, 10, 11, 12, 13, 14]
>>> for i in range(4) + range(10, 7, -1):
... print(i)
0
1
2
3
10
9
8
29. 29
Soluzione esercizio
def bar():
print "#" + 16 * "=" + "#"
def top():
for line in range(1, 5):
# Convenzione slide: linee troppo lunghe spezzate da
print "|" + (-2 * line + 8) * " " +
"<>" + (4 * line - 4) * "." + "<>" +
(-2 * line + 8) * " " + "|"
def bottom():
for line in range(4, 0, -1):
print "|" + (-2 * line + 8) * " " +
"<>" + (4 * line - 4) * "." + "<>" +
(-2 * line + 8) * " " + "|"
# main
bar()
top()
bottom() NON INSERITE IL CARATTERE NEL SORGENTE!
bar()
30. 30
Esercizio: soluzione 2
def bar():
print "#" + 16 * "=" + "#"
def mirror():
for line in range(1, 5) + range(4, 0, -1):
print "|" + (-2 * line + 8) * " " +
"<>" + (4 * line - 4) * "." + "<>" +
(-2 * line + 8) * " " + "|"
# main
bar()
mirror()
bar()
31. 31
Costanti
Python non ha delle vere e proprie costanti.
Dichiariamo una variabile globale al di sopra del
codice principale.
Tutti I metodi potranno usare questa variabile.
constant.py
1
2
3
4
5
6
7
8
9
10
11
12
13
MAX_VALUE = 3
def printTop():
for i in range(MAX_VALUE):
for j in range(i):
print(j)
print()
def printBottom():
for i in range(MAX_VALUE, 0, -1):
for j in range(i, 0, -1):
print(MAX_VALUE)
print()
34. 34
Parametri di funzioni
def name(parameter, parameter, ...,
parameter):
statements
I parametri sono dichiarati scrivendo I loro nomi (e non
il loro tipo)
>>> def print_many(message, n):
... for i in range(n):
... print(message)
>>> print_many("hello", 4)
hello
hello
hello
hello
36. 36
Soluzione esercizio
stars.py
1
2
3
4
5
6
7
8
9
10
11
12
13
# Disegna un rettangolo di asterischi date larghezza e
altezza.
def box(width, height):
print(width * "*")
for i in range(height - 2):
print("*" + (width - 2) * " " + "*")
print(width * "*")
# main
print(13 * "*")
print( 7 * "*")
print(35 * "*")
box(10, 3)
box(5, 4)
37. 37
Valori di default
def name(parameter=value, ..., parameter=value):
statements
Potete rendere I parametri opzionali specificando un valore di
default
Esercizio: Modificare stars.py aggiungendo un parametro di
default per il carattere da usare per il disegno dei rettangoli (default
"*").
>>> def print_many(message, n=1):
... for i in range(n):
... print(message)
>>> print_many("shrubbery")
shrubbery
>>> print_many("shrubbery", 3)
shrubbery
shrubbery
shrubbery
38. 38
Nomi dei parametri
name(parameter=value, ..., parameter=value)
E possibile specificare I nomi dei parametri durante la
ciamata della funzione
Questo permette di passare I parametri in qualsiasi
ordine
>>> def print_many(str, n):
... for i in range(n):
... print(str)
>>> print_many(str="shrubbery", n=4)
shrubbery
shrubbery
shrubbery
shrubbery
>>> print_many(n=3, str="Ni!")
Ni!
Ni!
Ni!
40. 40
Funzioni matematiche
from math import *
Function name Description
abs(value) absolute value
ceil(value) rounds up
cos(value) cosine, in radians
degrees(value) convert radians to degrees
floor(value) rounds down
log(value, base) logarithm in any base
log10(value) logarithm, base 10
max(value1, value2, ...) larger of two (or more) values
min(value1, value2, ...) smaller of two (or more) values
radians(value) convert degrees to radians
round(value) nearest whole number
sin(value) sine, in radians
sqrt(value) square root
tan(value) tangent
Constant Description
e 2.7182818...
pi 3.1415926...
41. 41
Restituire valori
def name(parameters):
statements
...
return expression
Python non richiede di specificare che una funzione
ritorna un valore semplicemente restitute un valore
come ultima istruzione della funzione.
>>> def ftoc(temp):
... tempc = 5.0 / 9.0 * (temp - 32)
... return tempc
>>> ftoc(98.6)
37.0
42. 42
input : Legge una stringa dalla tastiera.
Legge e restituisce unintera riga di input *
* Queste slide si riferiscono alla versione 3.x di Python e
succesisve. La vecchia versione 2.x di Python gestiva linput
in modo differente ...
input
>>> name = input("Howdy. What's yer name?")
Howdy. What's yer name? Mario Rossi
>>> name
'Mario Rossi'
43. 43
Per leggere numeri, convertire il risultato di input() in
un int o in un float
Se lutente non inserisce un numero viene generato un
errore.
Esempio:
age = int(input("How old are you? "))
print("Your age is", age)
print(65 - age, "years to retirement")
Output:
How old are you? 53
Your age is 53
12 years to retirement
input
46. 46
if ... in
if value in sequence:
statements
sequence puo essere un range, una stringa, una tupla o
una lista (trattate piu avanti)
Esempi:
x = 3
if x in range(0, 10):
print("x is between 0 and 9")
letter = input("What is your favorite letter? ")
if letter in "aeiou":
print("It is a vowel!")
47. 47
Operatori logici
Operator Example Result
and (2 == 3) and (-1 < 5) False
or (2 == 3) or (-1 < 5) True
not not (2 == 3) True
Operator Meaning Example Result
== equals 1 + 1 == 2 True
!= does not equal 3.2 != 2.5 True
< less than 10 < 5 False
> greater than 10 > 5 True
<= less than or equal to 126 <= 100 False
>= greater than or equal to 5.0 >= 5.0 True
48. 48
Esercizio
Scrivi un programma che legga le ore lavorate da
due impiegati e scriva il totale e la media giornaliera
(per impiegato) ed il totale di ore lavorate.
Riduci le ore inserite dallutente ad un massimo di 8.
Employee 1: How many days? 3
Hours? 6
Hours? 12
Hours? 5
Employee 1's total hours = 19 (6.33 / day)
Employee 2: How many days? 2
Hours? 11
Hours? 6
Employee 2's total hours = 14 (7.00 / day)
Total hours for both = 33
49. 49
Stringhe
Accesso ai caratteri:
variable [ index ]
variable [ index1:index2 ]
index2 exclusive
index1 or index2 can be
omitted (goes to end of string)
index 0 1 2 3 4 5 6 7
or -8 -7 -6 -5 -4 -3 -2 -1
charact
er
P . D i d d y
>>> name = "P. Diddy"
>>> name[0]
'P'
>>> name[7]
'y'
>>> name[-1]
'y'
>>> name[3:6]
'Did'
>>> name[3:]
'Diddy'
>>> name[:-2]
'P. Did'
50. 50
Metodi delle stringhe
>>> name = "Martin Douglas Stepp"
>>> name.upper()
'MARTIN DOUGLAS STEPP'
>>> name.lower().startswith("martin")
True
>>> len(name)
20
Java Python
length len(str)
startsWith, endsWith startswith, endswith
toLowerCase, toUpperCase upper, lower,
isupper, islower,
capitalize, swapcase
indexOf find
trim strip
51. 51
Cicli for e stringhe
Un ciclo for puo accedere ad ogni carattere di una
stringa nellordine in cui I caratteri compaiono nella
stessa.
for name in string:
statements
>>> for c in "booyah":
... print c
...
b
o
o
y
a
h
52. 52
Formattazione del testo
"format string" % (parameter, parameter, ...)
Segnaposto inseriscono valori formattati in una stringa:
%d an integer
%f a real number
%s a string
%8d an integer, 8 characters wide, right-aligned
%08d an integer, 8 characters wide, padding with 0s
%-8d an integer, 8 characters wide, left-aligned
%12f a real number, 12 characters wide
%.4f a real number, 4 characters after decimal
%6.2f a real number, 6 total characters wide, 2 after
decimal
>>> x = 3; y = 3.14159; z = "hello"
>>> print "%-8s, %04d is close to %.3f" % (z, x, y)
hello , 0003 is close to 3.142
53. 53
Stringhe e interi
ord(text) - Converte una stringa in un numero.
ord("a") is 97
ord("b") is 98
Usa conversione standard (ASCII e Unicode).
chr(number) - Converte un numero in una stringa.
chr(97) is "a"
chr(99) is "c"
54. 54
Crittografia di base
Cifrario a rotazione scambia ogni lettera di un numero
prefissato di posizioni
Cifrario di Cesare scambia ogni lettera di 3 passi (in avanti)
"the cake is a lie" diventa
"wkh fdnh lv d olh"
Cifrario a sostituzione trasforma ognilettera in unaltra
Non adotta spostamenti costanti; deve esistere qualche forma
di mapping (es. dizionario)
simile ai crittogrammi nelle riviste di enigmistica
55. 55
Exercise
Scivere un programma che critti un messaggio segreto
usando un cifrario di Cesare shiftando le lettere di 3 posizioni
(in avanti):
es. "Attack" se rotato di 2 diventa "cwwcfn"
Se avete tempo rendete il programma capace di decrittare il
testo.
Sapreste scrivere una funzione che implementa un cifrario a
sostituzione?
57. 57
Ciclo while
while test:
statements
sentinel.py
1
2
3
4
5
6
7
8
9
10
# Somma interi inseriti dallutente
# fino a quando un -1 viene inserito, usando un loop.
sum = 0
num = int(input("Type a number (-1 to quit)? "))
while n != -1:
sum += num
num = int(input("Type a number (-1 to quit)? "))
print("The total is", sum)
58. 58
Random Numbers
from random import *
randint(min, max)
Ritorna un intero casuale nel range [min, max] inclusi
choice(sequence)
Restituisce una valore scelto a caso dalla sequenza
data
(la sequenza puo essere un range, una stringa, un
array, ...)
>>> from random import *
>>> randint(1, 5)
2
>>> randint(1, 5)
5
>>> choice(range(4, 20, 2))
16
>>> choice("hello")
'e'
59. 59
while / else
while test:
statements
else:
statements
Esegue la parte else se non si entra mai in loop
Esosre uno statement for / else simile
>>> n = 91
>>> while n % 2 == 1:
... n += 1
... else:
... print(n, "was even; no loop.")
...
91 was even; no loop.
60. 60
bool
E il tipo di dato logico di Python, equivalente ai
boolean in Java
True e False iniziano con lettere maiuscole
>>> 5 < 10
True
>>> b = 5 < 10
>>> b
True
>>> if b:
... print("The value is true")
...
The value is true
>>> b = not b
>>> b
False
61. 61
Operatori logici
Operator Example Result
and 2 == 3 and -1 < 5 False
or 2 == 3 or -1 < 5 True
not not -1 < 5 False
Operator Meaning Example Result
== equals 1 + 1 == 2 True
!= does not equal 3.2 != 2.5 True
< less than 10 < 5 False
> greater than 10 > 5 True
<= less than or equal to 126 <= 100 False
>= greater than or equal to 5.0 >= 5.0 True
62. 62
Esercizio
Scrivere il programma Dice in Python. Il suo output
e il seguente (vittoria se due dadi restituiscono
valori casuali che sommano a 7).
2 + 4 = 6
3 + 5 = 8
5 + 6 = 11
1 + 1 = 2
4 + 3 = 7
You won after 5 tries!
63. 63
Tuple
tuple_name = (value, value, ..., value)
Modo comodo per "impacchettare" piu valori in
ununica variabile
name, name, ..., name = tuple_name
"estrarre" da tupla e assegnare a piu variabili
>>> x = 3
>>> y = -5
>>> p = (x, y, 42)
>>> p
(3, -5, 42)
>>> a, b, c = p
>>> a
3
>>> b
-5
>>> c
42
64. 64
Using Tuples
Utili per rappresentare dati multidimensionali (es.
punti (x, y) )
Utili per ritornare piu di un valore
>>> p = (42, 79)
>>> from random import *
>>> def roll2():
... die1 = randint(1, 6)
... die2 = randint(1, 6)
... return (die1, die2)
...
>>> d1, d2 = roll2()
>>> d1
6
>>> d2
4
65. 65
Tuple come parametri
def name( (name, name, ..., name), ... ):
statements
Dichiarare tuple come parametri assegnando nomi ad
ognuna delle loro componenti
>>> def slope((x1, y1), (x2, y2)):
... return (y2 - y1) / (x2 - x1)
...
>>> p1 = (2, 5)
>>> p2 = (4, 11)
>>> slope(p1, p2)
3
66. 66
Tuple come valori di ritorno
def name(parameters):
statements
return (name, name, ..., name)
>>> from random import *
>>> def roll2():
... die1 = randint(1, 6)
... die2 = randint(1, 6)
... return (die1, die2)
...
>>> d1, d2 = roll2()
>>> d1
6
>>> d2
4
68. 68
Leggere File
name = open("filename")
Apre il file di cui e fornito il percorso in lettura e
ritorna un oggetto di tipo file.
name.read() - Intero contenuto del file come
stringa
name.readline() - Prossima linea del file come
stringa
name.readlines() - Contenuto del file come lista
di righe
Le righe di un oggetto fle possono anche essere lette
usando un ciclo for
>>> f = open("hours.txt")
>>> f.read()
'123 Susan 12.5 8.1 7.6 3.2n
456 Brad 4.0 11.6 6.5 2.7 12n
789 Jenn 8.0 8.0 8.0 8.0 7.5n'
69. 69
Template file input
Template generico per leggere file in Python:
name = open("filename")
for line in name:
statements
>>> input = open("hours.txt")
>>> for line in input:
... print(line.strip()) # strip() rimuove n
123 Susan 12.5 8.1 7.6 3.2
456 Brad 4.0 11.6 6.5 2.7 12
789 Jenn 8.0 8.0 8.0 8.0 7.5
70. 70
Esercizio
Scrivere una funzione input_stats che accetta in
input il fome di un file e ritorna la riga piu lunga del
file.
Esempio di input file, carroll.txt:
Beware the Jabberwock, my son,
the jaws that bite, the claws that catch,
Beware the JubJub bird and shun
the frumious bandersnatch.
Output atteso:
>>> input_stats("carroll.txt")
longest line = 42 characters
the jaws that bite, the claws that catch,
73. 73
Spezzare stringhe
split spezza una stringa in parti attraverso cui
possiamo ciclare.
name.split() #spezza agli spazi
name.split(delimiter) #spezza al delimitatore
join fa il contratio di split (ricuce)
delimiter.join(list of tokens)
>>> name = "Brave Sir Robin"
>>> for word in name.split():
... print(word)
Brave
Sir
Robin
>>> "LL".join(name.split("r"))
'BLLave SiLL Robin
74. 74
Spezzare stringa in +
variabili
Se conosciamo il numero di parti in cui una stringa
verra spezzata possiamo assegnarle direttamente
ad una sequenza di variabili.
var1, var2, ..., varN = string.split()
E possibile convertire il tipo di specifiche parti della
stringa: type(value)
>>> s = "Jessica 31 647.28"
>>> name, age, money = s.split()
>>> name
'Jessica'
>>> int(age)
31
>>> float(money)
647.28
75. 75
Esercizio
Suppponiamo di avere I seuenti dati in hours.txt :
123 Suzy 9.5 8.1 7.6 3.1 3.2
456 Brad 7.0 9.6 6.5 4.9 8.8
789 Jenn 8.0 8.0 8.0 8.0 7.5
Calcolare per ogni lavoratore (uno per riga nel file) il
totale di ore lavorate ed la media delle ore
lgiornaliere.
Assumere che ogni lavoratore lavori esattamente 5
giorni.
Suzy ID 123 worked 31.4 hours: 6.3 / day
Brad ID 456 worked 36.8 hours: 7.36 / day
Jenn ID 789 worked 39.5 hours: 7.9 / day
76. 76
Soluzione Esercizio
hours.py
1
2
3
4
5
6
7
8
9
10
input = open("hours.txt")
for line in input:
id, name, mon, tue, wed, thu, fri = line.split()
# Somma cumulativa delle ore di questo impiegato
hours = float(mon) + float(tue) + float(wed) +
float(thu) + float(fri)
print(name, "ID", id, "worked",
hours, "hours: ", hours/5, "/ day"
77. 77
Scrivere su File
name = open("filename", "w")
name = open("filename", "a")
Apre file in lettura (cancella contenuto), o
Apre file per aggiungere righe (nuovi dati inseriti in
coda al file)
name.write(str) - scrive la stringa str nel file
name.close() - salva il file quando la scrittura
e terminata
>>> out = open("output.txt", "w")
>>> out.write("Hello, world!n")
>>> out.write("How are you?")
>>> out.close()
>>> open("output.txt").read()
'Hello, world!nHow are you?'
78. 78
Esercizio
Scrivi del codice che legga il prezzo del gas negli
USA ed in Belgio:
8.20 3.81 3/21/11
8.08 3.84 3/28/11
8.38 3.92 4/4/11
...
Salva ill prezzo medio del gas per ogni nazione in un
file di output di nome gasout.txt.
80. 80
Liste
liste: equivalenti Python degli array Java (ma
migliori)
Dichiarazione:
name = [value, value, ..., value] or,
name = [value] * length
Accesso/modifica elementi: (come in Java)
name[index] = value
>>> scores = [9, 14, 18, 19, 16]
[9, 14, 18, 19, 16]
>>> counts = [0] * 4
[0, 0, 0, 0]
>>> scores[0] + scores[4]
25
81. 81
Indici
Le liste si pososno indicizzare utilizzando sia numeri
positivi che negativi:
index 0 1 2 3 4 5 6 7
value 9 14 12 19 16 7 24 15
index -8 -7 -6 -5 -4 -3 -2 -1
>>> scores = [9, 14, 12, 19, 16, 7, 24, 15]
[9, 14, 12, 19, 16, 7, 24, 15]
>>> scores[3]
19
>>> scores[-3]
7
82. 82
Richiamo: Stringhe
Accesso ai caratteri:
variable [ index ]
variable [ index1:index2 ]
index2 incluso
index1 o index2 si possono
omettere(va fino a fine stringa)
index 0 1 2 3 4 5 6 7
value P . D i d d y
-index -8 -7 -6 -5 -4 -3 -2 -1
>>> name = "P. Diddy"
>>> name[0]
'P'
>>> name[7]
'y'
>>> name[-1]
'y'
>>> name[3:6]
'Did'
>>> name[3:]
'Diddy'
>>> name[:-2]
'P. Did'
83. 83
Slicing
slice: Una sotto-lista creata specificando indice start
e indice stop
name[start:end] # end e escluso
name[start:] # fino a fine lista
name[:end] # da inizio lista
name[start:end:step] # ogni step-esimo valore
>>> scores = [9, 14, 12, 19, 16, 18, 24, 15]
>>> scores[2:5]
[12, 19, 16]
>>> scores[3:]
[19, 16, 18, 24, 15]
>>> scores[:3]
[9, 14, 12]
>>> scores[-3:]
[18, 24, 15]
inde
x
0 1 2 3 4 5 6 7
value 9 14 12 19 16 18 24 15
inde
x
-8 -7 -6 -5 -4 -3 -2 -1
84. 84
Liste
Le liste si pososno stampare (o converire in stringhe
con str()).
Lunghezza calcolata tramite funzione len .
Ciclare attraverso unalista usando un loop for ... in .
>>> scores = [9, 14, 18, 19]
>>> print("My scores are", scores)
My scores are [9, 14, 18, 19]
>>> len(scores)
4
>>> total = 0
>>> for score in scores:
... print("next score:", score)
... total += score
next score: 9
next score: 14
next score: 18
next score: 19
>>> total
60
85. 85
Range, Stringhe, e Liste
La funzione range ritorna una lista.
Le stringhe si comportano come liste di caratteri:
len
Indicizzazione e slicing
Loop for ... in
>>> nums = range(5)
>>> nums
[0, 1, 2, 3, 4]
>>> nums[-2:]
[3, 4]
>>> len(nums)
5
86. 86
Splitting di stringhe
split spezza una stringa in una lista di elementi.
name.split() # break by whitespace
name.split(delimiter) # break by delimiter
join esegue loperazione opposta di split
delimiter.join(list)
>>> name = "Brave Sir Robin"
>>> name[-5:]
'Robin'
>>> tokens = name.split()
['Brave', 'Sir', 'Robin']
>>> name.split("r")
['B', 'ave Si', ' Robin']
>>> "||".join(tokens)
'Brave||Sir||Robin'
87. 87
Tokenizzazione File Input
Use split per tokenizzare il contenuto delle righe
lette da file.
Se e necessaria una conversione: type(value)
>>> f = open("example.txt")
>>> line = f.readline()
>>> line
'hello world 42 3.14n'
>>> tokens = line.split()
>>> tokens
['hello', 'world', '42', '3.14']
>>> word = tokens[0]
'hello'
>>> answer = int(tokens[2])
42
>>> pi = float(tokens[3])
3.14
88. 88
Esercizio
Riconsideriamo il file hours.txt. Supponiamo che
# di giorni possa variare:
123 Susan 12.5 8.1 7.6 3.2
456 Brad 4.0 11.6 6.5 2.7 12
789 Jenn 8.0 8.0 8.0 8.0 7.5
Calcolare il totale di ore lavorate da ogni lavoratore e
la media di ore giornaliera.
Deve funzionare indipendentemente da quanti giorni
ha lavorato un lavoratore
Suzy ID 123 worked 31.4 hours: 6.3 / day
Brad ID 456 worked 36.8 hours: 7.36 / day
Jenn ID 789 worked 39.5 hours: 7.9 / day
89. 89
Soluzione Esercizio
hours.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
file = open("hours.txt")
for line in file:
tokens = line.split()
id = tokens[0]
name = tokens[1]
# somma cumulativa delle ore di questo impiegato
hours = 0.0
days = 0
for token in tokens[2:]:
hours += float(token)
days += 1
print(name, "ID", id, "worked",
hours, "hours:", hours / days, "/ day")
90. 90
Esercizio
Supponiamo di avere un file contenente I punteggi
ottenuti durante un parziale di meta corso, scores.txt:
76
89
76
72
68
Creare un istogramma degli score come segue:
75: *
76:
79: **
81: ***
82: *
84: *
91. 91
Esercizio
Supponiamo di avere dati scaricati da Internet Movie
Database (IMDb):
1 9.1 196376 The Shawshank Redemption (1994)
2 9.0 139085 The Godfather: Part II (1974)
3 8.8 81507 Casablanca (1942)
Scrivere un programma che cerchi in tutti I titoli di
film a partire da una data parola:
Search word? part
Rank Votes Rating Title
2 139085 9.0 The Godfather: Part II (1974)
40 129172 8.5 The Departed (2006)
95 20401 8.2 The Apartment (1960)
192 30587 8.0 Spartacus (1960)
4 matches.
92. 92
Soluzione Esercizio
movies.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
search_word = input("Search word? ")
matches = 0
file = open("imdb.txt")
for line in file:
tokens = line.split()
rank = int(tokens[0])
rating = float(tokens[1])
votes = int(tokens[2])
title = " ".join(tokens[3:])
# il titolo contiene search_word?
if search_word.lower() in title.lower():
matches += 1
print(rank, "t", votes, "t", rating, "t",
title)
print(matches, "matches.")
94. 94
OOP, Definire una Classe
Python e stato costruito come linguaggio
procedurale ma
OOP (object orientedprogramming) esiste e funziona
bene
Dichiarazione di una classe:
class name:
statements
95. 95
Campi (var. interne)
name = value
Esempio:
class Point:
x = 0
y = 0
# main
p1 = Point()
p1.x = 2
p1.y = -5
Possono essere dichiarati direttamente allinterno della
classe (come nellesempio) o nei costruttori (piu comune)
Python non ha incapsulamento (campi privati)
Spera che il chiamante non cambi I valori dei campi interni ad una
classe
point.py
1
2
3
class Point:
x = 0
y = 0
96. 96
Using a Class
import class
Programmi client (utenti di classi esterne) DEVONO
importare TUTTE le classi che usano.
point_main.py
1
2
3
4
5
6
7
8
9
10
from Point import *
# main
p1 = Point()
p1.x = 7
p1.y = -3
...
# Oggetti Python sono dinamici (e possibile aggiunere
campi in qualsiasi momwnto)
p1.name = "Tyler Durden"
97. 97
Metodi degli oggetti
def name(self, parameter, ..., parameter):
statements
self DEVE essere il primo parametro di OGNI medodo di
oggetto
Reppresenta il "parametro imoplicito" (this in Java)
LACCESSO ai campi di un oggetto passato come
parametro avviene tramite un riferimento a self
class Point:
def translate(self, dx, dy):
self.x += dx
self.y += dy
...
98. 98
Parametro "Implicito"
(self)
Java: this, implicito
public void translate(int dx, int dy) {
x += dx; // this.x += dx;
y += dy; // this.y += dy;
}
Python: self, esplicito
def translate(self, dx, dy):
self.x += dx
self.y += dy
Esercizio: Scrivete I metodi distance, set_location, e
distance_from_origin.
99. 99
Soluzione Esercizio
point.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from math import *
class Point:
x = 0
y = 0
def set_location(self, x, y):
self.x = x
self.y = y
def distance_from_origin(self):
return sqrt(self.x * self.x + self.y * self.y)
def distance(self, other):
dx = self.x - other.x
dy = self.y - other.y
return sqrt(dx * dx + dy * dy)
100. 100
Chiamate a Metodi
Il programma client puo chiamare I metodi di un
oggetto in due modi:
(il valore di self puo essere un parametro esplicito o
implicito)
1) object.method(parameters)
oppure
2) Class.method(object, parameters)
Esempio:
p = Point(3, -4)
p.translate(1, 5)
Point.translate(p, 1, 5)
101. 101
Costruttori di classe
def __init__(self, parameter, ..., parameter):
statements
un construttore e un metodo speciale di nome __init__
Esempio:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
...
Come potremmo rendere possibile la costruzione di un oggetto
Point() senza parametri ma ottenendo il punto (0, 0)?
102. 102
toString and __str__
def __str__(self):
return string
Equivalente del metodo toString di Java (converte
oggetto in stringa)
invicato automaticamente quanso str o print
vengono usate sulloggetto
Esercizio: Scrivere un metodo __str__ per oggetti di tipo
Point che restituisca sctringhe come questa: "(3,
-14)"
def __str__(self):
return "(" + str(self.x) + ", " + str(self.y) + ")"
103. 103
Classe Point completa
point.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from math import *
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def distance_from_origin(self):
return sqrt(self.x * self.x + self.y * self.y)
def distance(self, other):
dx = self.x - other.x
dy = self.y - other.y
return sqrt(dx * dx + dy * dy)
def translate(self, dx, dy):
self.x += dx
self.y += dy
def __str__(self):
return "(" + str(self.x) + ", " + str(self.y) + ")"
104. 104
Operator Overloading
operator overloading: You can define functions so
that Python's built-in operators can be used with
your class.
See also: http://docs.python.org/ref/customization.html
Operator Class Method
- __neg__(self, other)
+ __pos__(self, other)
* __mul__(self, other)
/ __truediv__(self, other)
Unary Operators
- __neg__(self)
+ __pos__(self)
Operator Class Method
== __eq__(self, other)
!= __ne__(self, other)
< __lt__(self, other)
> __gt__(self, other)
<= __le__(self, other)
>= __ge__(self, other)
105. 105
Esercizio
Esercizio: Scrivere una classe Fraction per rappresentare
numeri razionali come 1/2 e -3/8.
Le frazioni dovrebbero sempre essere salvate in forma
ridotta; ad esempio, salvare 4/12 come 1/3 e 6/-9 come -2/3.
Suggerimento: una funzione MCD (massimo comun divisore)
puo essere di aiuto.
Definire metodi add e multiply che accettano come
parametro un altra variabile Fraction e modifichi la
variabile corrente Fraction aggiungendo ad
essa/moltiplicandola per il parametro passato alla funzione.
Definire gli operatori +, *, ==, e < .
106. 106
Generare Eccezioni
raise ExceptionType("message")
Utile quando le classi che abbiamo scritto vengono usate
in modo inappropriato
Tipi di eccezione: ArithmeticError, AssertionError,
IndexError, NameError, SyntaxError, TypeError, ValueError
Esempio:
class BankAccount:
...
def deposit(self, amount):
if amount < 0:
raise ValueError("negative amount")
...
107. 107
Ereditarieta
class name(superclass):
statements
Esempio:
class Point3D(Point): # Point3D estende Point
z = 0
...
Python supporta ereditarieta multipla
class name(superclass, ..., superclass):
statements
(NB: se piu superclassi hanno gli stessi campi/metodi, I conflitti sono risolti da sinistra a
destra seguendo lordine nella definizione della classe)
108. 108
Chiamare metodi delle
Superclassi
metodi: class.method(object,
parameters)
costruttori: class.__init__(parameters)
class Point3D(Point):
z = 0
def __init__(self, x, y, z):
Point.__init__(self, x, y)
self.z = z
def translate(self, dx, dy, dz):
Point.translate(self, dx, dy)
self.z += dz