際際滷

際際滷Share a Scribd company logo
Unit 1
Basi di Python programi, funzioni
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
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
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
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
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
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
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
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
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
Esercizio (funzioni)
 Scrivere un programma Python che ricrei questo output:
______
/ 
/ 
 /
______/
 /
______/
+--------+
______
/ 
/ 
| STOP |
 /
______/
______
/ 
/ 
+--------+
12
Soluzione esercizio
def egg():
top()
bottom()
print()
def cup():
bottom()
line()
print()
def stop():
top()
print("| STOP |")
bottom()
print()
def hat():
top()
line()
print()
def top():
print(" ______")
print(" / ")
print("/ ")
def bottom():
print(" /")
print(" ______/")
def line():
print("+--------+")
# main
egg()
cup()
stop()
hat()
Unit 2
Espressioni e variabili; ciclo for
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
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
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
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
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
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
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
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
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
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
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
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
Esercizio
 Riscrivete il programma Mirror in Python. Il suo
output e il seguente:
#================#
| <><> |
| <>....<> |
| <>........<> |
|<>............<>|
|<>............<>|
| <>........<> |
| <>....<> |
| <><> |
#================#
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
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
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
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
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()
32
Esercizio: soluzione 3
SIZE = 4
def bar():
print "#" + 4 * SIZE * "=" + "#"
def mirror():
for line in range(1, SIZE + 1) + range(SIZE, 0, -1):
print "|" + (-2 * line + 2 * SIZE) * " " + 
"<>" + (4 * line - 4) * "." + "<>" + 
(-2 * line + 2 * SIZE) * " " + "|"
# main
bar()
mirror()
bar()
Unit 3
parameteri di funzione
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
35
Esercizio
 Ricreate questa serie di asterischi che disegnano
linee e barre (rettangoli):
***
**


* *


* *
* *
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
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
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!
Unit 4
If/else, return, user input, stringhe
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
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
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
 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
44
if
if condition:
statements
 Esempio:
gpa = float(input("What is your GPA? "))
if gpa > 2.0:
print("Your application is accepted.")
45
if/else
if condition:
statements
elif condition:
statements
else:
statements
 Example:
gpa = float(input("What is your GPA? "))
if gpa > 3.5:
print("You have qualified for the honor roll.")
elif gpa > 2.0:
print("Welcome to Mars University!")
else:
print("Your application is denied.")
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
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
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
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
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
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
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
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
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
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?
Unit 5
Ciclo while ; flusso logico del
programma; numeri casuali; tuple
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
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
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
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
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
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
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
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
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
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
Unit 6
Processamento di file
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
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
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,
71
Soluzione esercizio
def input_stats(filename):
input = open(filename)
longest = ""
for line in input:
if len(line) > len(longest):
longest = line
print("Longest line =", len(longest))
print(longest)
72
Ripasso: Metodi 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
ord, chr
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
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
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
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
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
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.
Unit 7
Liste
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
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
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
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
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
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
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
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
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
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
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
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
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.")
Unit 8
Classi e Oggetti; Ereditarieta
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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

More Related Content

Similar to 際際滷s introduttive alla programmazione del linguaggio Python (20)

PPT
Corso java base
Simone Gimelli
PDF
Lezione 23 (9 maggio 2012)
STELITANO
PPSX
Modulo 1 - Lezione 1
Giacomo Migliorini
KEY
Pycrashcourse2.0
rik0
PDF
Lezione 12 (28 marzo 2012)
STELITANO
PDF
Lezione 12 (28 marzo 2012)
STELITANO
PDF
Bash Scripting
Mariano Fiorentino
PPT
7 Sottoprogrammi
guest60e9511
PDF
Bash intro
Giuseppe Levi
PDF
Esercitazione 3 (14 marzo 2012)
STELITANO
PPT
Riepilogo Java C/C++
Pasquale Paola
PPTX
Caratteristiche del linguaggio c
ughetta
PDF
2008 python
Loris Michielutti
ODP
08 mapreduce
Davide Carboni
PDF
Let's give it a GO!
MarioTraetta
PDF
Lezione 5 (7 marzo 2012)
STELITANO
PDF
Bash programming
Sebastiano Merlino (eTr)
PPT
05 1 intro-struttura
Piero Fraternali
PDF
LINQ, Entities Framework & ORMs
JUG Genova
PPT
Corso c++
Antonio Furone
Corso java base
Simone Gimelli
Lezione 23 (9 maggio 2012)
STELITANO
Modulo 1 - Lezione 1
Giacomo Migliorini
Pycrashcourse2.0
rik0
Lezione 12 (28 marzo 2012)
STELITANO
Lezione 12 (28 marzo 2012)
STELITANO
Bash Scripting
Mariano Fiorentino
7 Sottoprogrammi
guest60e9511
Bash intro
Giuseppe Levi
Esercitazione 3 (14 marzo 2012)
STELITANO
Riepilogo Java C/C++
Pasquale Paola
Caratteristiche del linguaggio c
ughetta
2008 python
Loris Michielutti
08 mapreduce
Davide Carboni
Let's give it a GO!
MarioTraetta
Lezione 5 (7 marzo 2012)
STELITANO
Bash programming
Sebastiano Merlino (eTr)
05 1 intro-struttura
Piero Fraternali
LINQ, Entities Framework & ORMs
JUG Genova
Corso c++
Antonio Furone

際際滷s introduttive alla programmazione del linguaggio Python

  • 1. Unit 1 Basi di Python programi, funzioni
  • 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 | / ______/ ______ / / +--------+
  • 12. 12 Soluzione esercizio def egg(): top() bottom() print() def cup(): bottom() line() print() def stop(): top() print("| STOP |") bottom() print() def hat(): top() line() print() def top(): print(" ______") print(" / ") print("/ ") def bottom(): print(" /") print(" ______/") def line(): print("+--------+") # main egg() cup() stop() hat()
  • 13. Unit 2 Espressioni e variabili; ciclo for
  • 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()
  • 32. 32 Esercizio: soluzione 3 SIZE = 4 def bar(): print "#" + 4 * SIZE * "=" + "#" def mirror(): for line in range(1, SIZE + 1) + range(SIZE, 0, -1): print "|" + (-2 * line + 2 * SIZE) * " " + "<>" + (4 * line - 4) * "." + "<>" + (-2 * line + 2 * SIZE) * " " + "|" # main bar() mirror() bar()
  • 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
  • 35. 35 Esercizio Ricreate questa serie di asterischi che disegnano linee e barre (rettangoli): *** ** * * * * * *
  • 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!
  • 39. Unit 4 If/else, return, user input, stringhe
  • 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
  • 44. 44 if if condition: statements Esempio: gpa = float(input("What is your GPA? ")) if gpa > 2.0: print("Your application is accepted.")
  • 45. 45 if/else if condition: statements elif condition: statements else: statements Example: gpa = float(input("What is your GPA? ")) if gpa > 3.5: print("You have qualified for the honor roll.") elif gpa > 2.0: print("Welcome to Mars University!") else: print("Your application is denied.")
  • 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?
  • 56. Unit 5 Ciclo while ; flusso logico del programma; numeri casuali; tuple
  • 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,
  • 71. 71 Soluzione esercizio def input_stats(filename): input = open(filename) longest = "" for line in input: if len(line) > len(longest): longest = line print("Longest line =", len(longest)) print(longest)
  • 72. 72 Ripasso: Metodi 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 ord, chr
  • 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.")
  • 93. Unit 8 Classi e Oggetti; Ereditarieta
  • 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