Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Josh Cogliati
Dedica
Dedicato a Elizabeth Cogliati.
Sommario
Prefazione ....................................................................................................................................................i
1. Introduzione ...........................................................................................................................................1
1.1. La prima cosa ..............................................................................................................................1
1.2. Installare Python .........................................................................................................................1
1.3. Modo interattivo..........................................................................................................................1
1.4. Creare ed eseguire programmi ....................................................................................................2
1.5. Usare Python dalla linea di comando..........................................................................................2
2. Hello, World ...........................................................................................................................................3
2.1. Cosa dovresti gi sapere..............................................................................................................3
2.2. Stampare......................................................................................................................................3
2.3. Espressioni ..................................................................................................................................4
2.4. Parlare agli umani (e ad altri esseri intelligenti) .........................................................................5
2.5. Esempi.........................................................................................................................................6
2.6. Esercizi........................................................................................................................................7
3. Chi va l ? ...............................................................................................................................................8
3.1. Input e variabili ...........................................................................................................................8
3.2. Esempi.......................................................................................................................................10
3.3. Esercizi......................................................................................................................................11
4. Conta da 1 a 10.....................................................................................................................................12
4.1. Cicli While ................................................................................................................................12
4.2. Esempi.......................................................................................................................................13
5. Decisioni................................................................................................................................................15
5.1. Lespressione If .........................................................................................................................15
5.2. Esempi.......................................................................................................................................16
5.3. Esercizi......................................................................................................................................17
6. Debugging .............................................................................................................................................19
6.1. Cos il Debugging ?.................................................................................................................19
6.2. Cosa dovrebbe fare il programma ? ..........................................................................................19
6.3. Cosa fa il programma ? .............................................................................................................20
6.4. Come riparo il programma ? .....................................................................................................24
7. Le funzioni............................................................................................................................................25
7.1. Creare funzioni..........................................................................................................................25
7.2. Esempi.......................................................................................................................................26
7.3. Esercizi......................................................................................................................................28
8. Liste.......................................................................................................................................................29
8.1. Variabili con pi di un valore ....................................................................................................29
8.2. Altre funzioni delle liste............................................................................................................29
8.3. Esempi.......................................................................................................................................33
8.4. Esercizi......................................................................................................................................35
9. Cicli For ................................................................................................................................................36
10. Espressioni Booleane .........................................................................................................................40
10.1. Esempi.....................................................................................................................................42
10.2. Esercizi....................................................................................................................................43
iv
vi
Prefazione
"Tutorial di Python per newbies" un tutorial pensato per essere una introduzione alla programmazione
in Python, destinato infatti a chi non ha esperienze con la programmazione.
Se qualcuno di voi ha gi programmato con altri linguaggi vi raccomando il Python Tutorial scritto da
Guido van Rossum.
Se qualcuno di voi ha domande o commenti mi contatti al mio indirizzo <jjc@iname.com>,
(<nicholas_wieland@yahoo.it> per la presente versione tradotta) commenti e suggerimenti
riguardo questo documento sono i benvenuti. Prover a rispondere a qualsiasi domanda poniate meglio
che potr.
I ringraziamenti vanno a James A. Brown per aver scritto la maggior parte della sezione dedicata
allinstallazione sotto Windows. Grazie anche a Joe Oppergaard per aver scritto tutti gli esercizi. Grazie
anche a tutti quelli che ho dimenticato.
Capitolo 1. Introduzione
1.1. La prima cosa
Se state leggendo questo tutorial non avete mai programmato in vita vostra. Proseguite nella lettura e
tenter di insegnarvi come si programma. Innanzitutto chiarezza: c una sola via da percorrere per
imparare a programmare, leggere codice - scrivere codice e io ve ne far leggere e scrivere tantissimo.
Per questo dovrete sempre scrivere il codice degli esempi ed eseguirlo per poi vedere che cosa succede:
giocate con il codice, modificatelo come volete, la cosa peggiore che pu capitarvi che il programma
non funzioni. Per riconoscere il codice dalla normale scrittura user questo formato:
##Python is easy to learn
print "Hello, World!"
Facile da distinguere dal resto del testo no ? Appunto per confondervi scriver cos anche gli outputs
del computer :=)
Unaltra cosa importante: per programmare in Python vi serve il Python. Se non avete ancora il software
necessario dirigetevi verso http://www.python.org/download. Andate alla versione 2.0 o superiore e
scaricatevi la versione adatta alla vostra piattaforma, leggete le istruzioni e installatela.
Capitolo 1. Introduzione
>>> il modo che ha Python per informarvi che siete in modo interattivo, dove i comandi digitati sono
immediatamente eseguiti. Provate a digitare 1+1 e Python vi risponder immediatamente 2. In questa
modalit potete provare e vedere come reagisce Python ai vari comandi. Usatela quando sentirete il
bisogno di prendere confidenza con i comandi Python.
Innanzitutto salvate il programma sempre selezionando dal menu File e poi Save. Salvatelo come
"hello.py" nella directory di default o nella directory che preferite. Ora che avete salvato potete eseguire
il programma. Selezionate dal menu la voce edit e poi Run script. Questa azione vi restituir
loutput richiesto dal programma hello.py nella finestra *Python Shell* che saluter allegramente con
un: Hello, World!.
2.2. Stampare
Sin dallinizio dei tempi i tutorials sono sempre iniziati con un semplice programma chiamato Hello
World. Eccolo:
print "Hello, World!"
Se state usando la linea di comando per eseguire i programmi inserite la linea di testo in un editor e
salvate come hello.py, eseguite il file appena salvato con il comando python hello.py.
Altrimenti entrate in IDLE, aprite una nuova finestra (New window) e create il programma come
spiegato nella sezione 1.3.
Ecco cosa stampa sullo schermo hello.py quando viene eseguito:
Hello, World!
Non ve lo dir ogni volta ma vi consiglio vivamente di ripetere tutti gli esercizi che vi mostro, questo vi
aiuter a comprenderli meglio, anchio imparo di pi quando scrivo, probabilmente anche voi ...
Tentiamo un programma un po pi complicato:
print
print
print
print
2.3. Espressioni
Ecco qui unaltro programma:
print
print
print
print
"2 + 2
"3 * 4
100-1,
"(33 +
is ", 2 + 2
is ", 3 * 4
" = 100 - 1"
2) / 5 + 11.5 = ", (33 + 2) / 5 + 11.5
4
12
- 1
/ 5 + 11.5 =
18.5
Come puoi vedere Python pu trasformare il vostro costosissimo computer in una normale calcolatrice
:-)
Python ha 6 operatori basilari:
Tabella 2-1.
Operazione
Simbolo
Esempio
Elevamento a potenza
**
5 ** 2 = 25
Moltiplicazione
2 * 3 == 6
Divisione
14 / 3 == 4
Resto
14 % 3 == 2
Addizione
1 + 2 == 3
Sottrazione
4 - 3 == 1
Osservate come la divisione segua la regola per cui se nel dividendo e nel divisore non sono presenti
"14 / 3 = ",14 / 3
"14 % 3 = ",14 % 3
"14.0 / 3.0 =",14.0 / 3.0
"14.0 % 3.0 =",14 % 3.0
"14.0 / 3 =",14.0 / 3
"14.0 % 3 =",14.0 % 3
"14 / 3.0 =",14 / 3.0
"14 % 3.0 =",14 % 3.0
Con loutput:
14 / 3 =
14 % 3 =
4
2
2.5. Esempi
Ogni capitolo conterr esempi delle propriet di programmazione introdotte nel capitolo stesso. Dovreste
almeno dare unocchiata al codice per vedere se riuscite a capirlo. Nel caso alcuni passaggi non fossero
chiari potete scrivere il codice ed eseguirlo per tentare di capirlo meglio o addirittura apportare delle
modifiche per vedere cosa succede
Denmark.py
print "Somethings rotten in the state of Denmark."
print "
-- Shakespeare"
Output:
Somethings rotten in the state of Denmark.
-- Shakespeare
School.py
#This
# and
print
print
print
print
print
print
print
print
print
print
print
print
print
print
print
print
print
Output:
Firstish Grade
1+1 = 2
2.6. Esercizi
Scrivete un programma che stampa su schermo il vostro nome e cognome con due stringhe separate.
Scrivete un programma che mostra lutilizzo delle 6 operazioni matematiche.
Capitolo 3. Chi va l ?
3.1. Input e variabili
Ora proviamo un programma un po pi complicato:
print "Halt!"
s = raw_input("Who Goes there? ")
print "You may pass,", s
Ovviamente quando proverete anche voi lesecuzione il vostro output sar differente grazie
allespressione raw_input. Avviando il programma (perch lo state provando vero?) avrete notato che
richiede linserimento del vostro nome per poi premere Enter e continuare lesecuzione; a quel punto
viene visualizzato un messaggio seguito dal vostro nome. Questo un esempio di input: il programma
viene eseguito fino a un certo punto, dopodich attende un input di dati dallutente.
Certamente un input sarebbe inutile se non avessimo nessun posto dove mettere linformazione ottenuta,
ecco quindi che entrano in gioco le variabili. Nel programma precedente s , appunto, una variabile. Le
variabili sono come delle scatole in cui si possono immagazzinare dati. Ecco un programma che ne
spiega lutilizzo:
a = 123.4
b23 = Spam
first_name = "Bill"
b = 432
c = a + b
print "a + b is", c
print "first_name is", first_name
print "Sorted Parts, After Midnight or",b23
e questo loutput:
a + b is 555.4
first_name is Bill
Sorted Parts, After Midnight or Spam
Come ho detto: le variabili immagazzinano dati. Nel programma qui sopra ad esempio sono a, b23,
first_name, b e c. Le due tipologie base di variabili sono stringhe e numeri. Le stringhe sono
sequenze di lettere, numeri e altri caratteri: nellesempio b23 e first_name sono variabili contenenti
stringhe. Spam, Bill, a + b is e first_name sono stringhe: come potete notare sono
sempre racchiuse da " " o " " ". Gli altri tipi di variabili presenti sono numeri.
Capitolo 3. Chi va l ?
Ora, abbiamo queste scatole chiamate variabili e anche dati da metterci dentro. Il computer vedr una
linea come first_name = Bill che legger come - metti la stringa Bill nella scatola (o
variabile) first_name. Pi tardi vedr lespressione c = a + b che legger come "metti a+b o
123.4 + 432 allinterno della variabile c".
Ecco unaltro esempio sullutilizzo delle variabili:
a = 1
print
a = a
print
a = a
print
a
+ 1
a
* 2
a
Anche se in tutti i casi sopraelencati la variabile ha lo stesso nome il computer la rilegge ogni volta.
Prima trova i dati da immagazzinare e poi trova dove immagazzinarli.
Unultimo esempio prima di chiudere il capitolo:
num =
str =
print
print
print
print
print
print
Osserva il modo in cui ho ottenuto dallutente le due varaibili: input per la variabile numerica e
raw_input per la variabile stringa. Quando volete che lutente inserisca un numero o una stringa
utilizzate, rispettivamente, input o stringa raw_input.
La seconda parte del programma utilizza la funzione type che vi informa sul tipo di variabile: le varibili
numeriche sono di tipo int (numero intero) o float (numero decimale), le stringhe sono di tipo string.
Capitolo 3. Chi va l ?
Interi e decimali possono essere utilizzati per operazioni matematiche, le stringhe no. Tuttavia quando
una stringa viene moltiplicata per un intero vengono aggiunte alla stringa copie di se stessa: ad es. str *
2 = HelloHello
3.2. Esempi
rate_times.py
#This programs calculates rate and distance problems
print "Input a rate and a distance"
rate = input("Rate:")
distance = input("Distance:")
print "Time:",distance/rate
Esecuzione:
> python rate_times.py
area.py
#This program calculates the perimeter and area of a rectangle
print "Calculate information about a rectangle"
length = input("Length:")
width = input("Width:")
print "Area",length*width
print "Perimeter",2*length+2*width
Esecuzione:
> python area.py
10
Capitolo 3. Chi va l ?
temperature.py
#Converts fahrenheit to celcius
temp = input("Farenheit temperature:")
print (temp-32.0)*5.0/9.0
Esecuzione:
> python temperature.py
Farenheit temperature:32
0.0
> python temperature.py
Farenheit temperature:-40
-40.0
> python temperature.py
Farenheit temperature:212
100.0
> python temperature.py
Farenheit temperature:98.6
37.0
3.3. Esercizi
Scrivete un programma che prenda due variabili stringa e due numeriche intere dallutente, unisca le due
stringhe senza spazi e le visualizzi sullo schermo, infine moltiplichi i due numeri interi su una linea
nuova.
11
Capitolo 4. Conta da 1 a 10
4.1. Cicli While
Ecco qui finalmente la nostra prima struttura di controllo. Solitamente il computer legge il nostro
programma cominciando dalla prima linea per poi scendere da l fino alla fine del codice. Le strutture di
controllo influiscono sul programma cambiando lordine desecuzione dei comandi o decidendo se un
determinato comando verr eseguito o meno. A voi il sorgente di un primo esempio che utilizza la
struttura di controllo while:
a = 0
while a < 10:
a = a + 1
print a
Cosa fa il programma? Prima di tutto vede la linea a = 0 e assegna il valore zero alla variabile
numerica a. Dopodich vede il comando while a < 10: che ordina a Python di controllare se la
variabile a minore di 10: in questo caso a corrisponde al valore zero quindi minore di 10, per questo
motivo Python eseguir tutte le istruzioni rientrate sotto la struttura while. In poche parole finch la
variabile numerica a minore di dieci Python esegue tutte le istruzioni tabulate sotto while.
Ecco unaltro esempio delluso di while:
a = 1
s = 0
print Enter Numbers to add to the sum.
print Enter 0 to quit.
while a != 0
print Current Sum:,s
a = input(Number? )
s = s + a
print Total Sum =,s
12
Capitolo 4. Conta da 1 a 10
^
SyntaxError: invalid syntax
Ho dimenticato il : dopo il while. Python avverte dellerrore e mostra allutente dov il problema
segnando la linea di codice incriminata con un utile ^. Dopo aver risolto il problema grazie allaiuto di
Python il programma funziona a meraviglia ed ecco finalmente il risultato:
Enter Numbers to add to the sum.
Enter 0 to quit.
Current Sum: 0
Number? 200
Current Sum: 200
Number? -15.25
Current Sum: 184.75
Number? -151.85
Current Sum: 32.9
Number? 10.00
Current Sum: 42.9
Number? 0
Total Sum = 42.9
Come puoi vedere print Total sum =, s eseguito solamente alla fine: questo perch la
struttura di controllo while influisce solamente sulle istruzioni tabulate (rientrate, indentate). Il
simbolo != significa diverso: finch a diverso da zero esegui le istruzioni tabulate sotto while.
Ora che abbiamo capito la struttura di controllo while possiamo programmare uno script che venga
eseguito allinfinito. Una via molto facile per farlo ad esempio questa:
while 1 == 1:
print "Help, Im stuck in a loop."
Loutput di questo programma sar una continua ripetizione della frase Help, Im stuck in a
loop !!! allinfinito, a meno che non lo fermiate premendo i tasti Ctrl e C
contemporaneamente. Questo mander un segnale di terminazione al programma.
(Nota: a volte dovrete premere Invio oltre a Ctrl+c)
4.2. Esempi
fibonacci.py
#This program calulates the fibonnaci sequence
a = 0
b = 1
count = 0
max_count = 20
while count < max_count:
count = count + 1
#we need to keep track of a since we change it
old_a = a
13
Capitolo 4. Conta da 1 a 10
a = b
b = old_a + b
#Notice that the , at the end of a print statement keeps it
# from switching to a new line
print old_a,
print
Output:
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181
password.py
# Waits until a password has been entered.
# the password
password = "foobar"
#note that != means not equal
while password != "unicorn":
password = raw_input("Password:")
print "Welcome in"
Esecuzione:
Password:auo
Password:y22
Password:password
Password:open sesame
Password:unicorn
Welcome in
14
Capitolo 5. Decisioni
5.1. Lespressione If
Credo sia meglio partire con un esempio a caldo: ecco quindi un programma che calcola il valore
assoluto di un numero:
n = input("Number? ")
if n < 0:
print "The absolute value of",n,"is",-n
else:
print "The absolute value of",n,"is",n
Quindi cosa fa Python quando esegue questo programma? Prima di tutto chiede allutente un numero
grazie alla linea n = input ("Number? ") dopodich legge la linea if n < 0: se n minore
di zero Python esegue la linea print "The absolute value of ", n, " is ", -n altrimenti,
cio se il numero maggiore di zero, esegue la linea "print "The absolute value of ", n,
"is ", n.
Pi facilmente Python decide se laffermazione n < 0 vera o falsa. Una espressione if sempre
seguita da un blocco di altre espressioni tabulate che vengono eseguite nel caso laffermazione sia vera.
In caso contrario vengono eseguiti i comandi tabulati sotto lespressione else, ovvero quando
laffermazione if risulta falsa.
Python presenta svariati operatori associabili al confronto di una variabile: eccone una lista completa:
Tabella 5-1.
Operatore
Funzione
<
minore di
<=
minore o uguale a
>
maggiore di
>=
maggiore o uguale a
==
uguale a
!=
diverso da
<>
diverso da
15
Capitolo 5. Decisioni
Unaltra propriet dellespressione if la funzione elif. Elif unabbreviazione di else if e
significa: esegui il blocco di istruzioni tabulato sotto elif se la condizione necessaria al primo if falsa
e la condizione di elif vera. Ecco un esempio:
a = 0
while a < 10:
a = a + 1
if a > 5:
print a," > ",5
elif a <= 7:
print a," <= ",7
else:
print "Neither test was true"
Output:
1
2
3
4
5
6
7
8
9
10
<=
<=
<=
<=
<=
>
>
>
>
>
7
7
7
7
7
5
5
5
5
5
Osservate come la linea elif a <= 7: entri in azione solamente quando la prima espressione if
risulta falsa. Come potete vedere lespressione elif permette di fare test multipli allinterno di una
singola espressione if.
5.2. Esempi
High_low.py
#Plays the guessing game higher or lower
# (originally written by Josh Cogliati, improved by Quique)
#This should actually be something that is semi random like the
# last digits of the time or something else, but that will have to
# wait till a later chapter. (Extra Credit, modify it to be random
# after the Modules chapter)
number = 78
guess = 0
while guess != number :
guess = input ("Guess a number: ")
if guess > number :
print "Too high"
elif guess < number :
print "Too low"
16
Capitolo 5. Decisioni
Esecuzione:
Guess a number:100
Too high
Guess a number:50
Too low
Guess a number:75
Too low
Guess a number:87
Too high
Guess a number:81
Too high
Guess a number:78
Just right
even.py
#Asks for a number.
#Prints if it is even or odd
number = input("Tell me a number: ")
if number % 2 == 0:
print number,"is even."
elif number % 2 == 1:
print number,"is odd."
else:
print number,"is very strange."
Esecuzione:
Tell me a number: 3
3 is odd.
Tell me a number: 2
2 is even.
Tell me a number: 3.14159
3.14159 is very strange.
5.3. Esercizi
Scrivete un programma che chieda allutente di indovinare il vostro nome, ma che dia al giocatore
solamente 3 possibilit, fallite le quali il programma terminer.
Scrivete un programma che chieda allutente il nome. Se viene inserito il vostro nome il programma
dovr rispondere con un apprezzamento, se il nome inserito "John Cleese" o "Michel Palin" il
17
Capitolo 5. Decisioni
programma dovr rispondere con una battuta mentre in tutti gli altri casi loutput del programma sar un
semplice "Che bel nome!"
18
Capitolo 6. Debugging
6.1. Cos il Debugging ?
Maurice Wilkes scopre il debugging, 1949
Poco dopo aver iniziato a programmare ci siamo accorti di come non fosse affatto facile far fare ai programmi
quello che volevamo. Avevamo scoperto il Debugging. Posso ricordare il preciso momento in cui ho realizzato
che avrei passato buona parte della mia vita a scoprire e correggere gli errori nei miei stessi programmi.
Se finora avete ripetuto tutti i programmi degli esempi vi sarete certamente accorti che a volte (spesso) il
programma da voi scritto assume comportamenti differenti da quelli che avevate previsto. E molto
comune.
Il Debugging il processo grazie al quale portate il programma a svolgere le funzioni per cui stato
scritto correggendo gli errori e vi assicuro, pu essere unoperazione lunga e snervante. Una volta ho
impiegato unintera settimana per correggere un bug dovuto allo scambio di una x con una y...
Questo capitolo sar pi astratto dei precedenti. Vi prego di dirmi se vi sembrato utile o meno.
Altezza
Perimetro
14
10
16
12
Ora avvio il mio programma ed inserir i dati dei test per vedere se restituisce i risultati che mi aspetto;
19
Capitolo 6. Debugging
in caso contrario dovr scoprire cosa sta facendo il computer.
Comunemente alcuni casi restituiranno il risultato che voglio mentre altri risulteranno sbagliati, quindi
dovrete vedere coshanno in comune i casi funzionanti. Ecco ad esempio loutput del programma che
calcola il perimetro del rettangolo:
Height: 3
Width: 4
perimeter =
15
Height: 2
Width: 3
perimeter =
11
Height: 4
Width: 4
perimeter =
16
Height: 2
Width: 2
perimeter =
Height: 5
Width: 1
perimeter =
Il programma scorretto nei primi due casi, corretto nei seguenti due per sbagliare di nuovo
nellultimo. Provate ad immaginarvi coshanno in comune i casi funzionanti. Quando avrete unidea sul
motivo del malfunzionamento trovarne la causa pi facile.
20
Capitolo 6. Debugging
Domanda: Qual il suo effetto ?
Risposta: Stampa Height: sullo schermo e attende linserimento di un numero da parte dellutente per
metterlo nella variabile height.
Domanda: Qual la prossima linea che Python esegue ?
Risposta: La linea sotto: width = input ("Width: ").
Domanda: Cosa provoca nel programma ?
Risposta: Stampa Width: sullo schermo, attende linput e assegna il valore immesso alla variabile
width.
Domanda: Qual la prossima linea ?
Risposta: print "Perimeter = ", width+height+width+width.
Domanda: ma width + height + width + width calcola il perimetro correttamente?
Risposta: Vediamo: il perimetro di un rettangolo si calcola sommando i lati (uh ?). Lultimo elemento
(width) dovrebbe essere un lato (height) non la base (width)...
Domanda: Capisci ora perch alcune volte il perimetro risultava corretto ?
Risposta: Certo, risultava corretto perch tutti i lati erano uguali !!
. . . .
Ecco il codice:
number = 5
while number > 1:
print ".",
number = number - 1
print
Questo programma sar un po pi complesso, come potete notare nel codice presente una struttura
while. Bando alle ciance, rimbocchiamoci le maniche e cominciamo.
21
Capitolo 6. Debugging
Risposta: La prima linea del file: number = 5.
Domanda: Cosa fa ?
Risposta: Assegna il valore 5 alla variabile number.
Domanda: Come prosegue ?
Risposta: La prossima linea : while number > 1:.
Domanda: Cosa fa ?
Risposta: Allora: la struttura while verifica che lespressione che la segue (number > 1) sia vera o
falsa. Nel primo caso esegue il codice tabulato sotto, nel secondo caso lo salta per passare al codice
tabulato al suo stesso livello.
Domanda: Quindi in questo caso come si comporta ?
Risposta: Se la condizione number > 1 vera eseguir le due righe di codice successive.
Domanda: La variabile number allora maggiore o minore di 1 ?
Risposta: Il valore di number 5 quindi maggiore di 1.
Domanda: Quindi qual la prossima linea ?
Risposta: La linea indentata appena sotto: print ".", finch la condizione while vera Python
eseguir questa istruzione, ovvero stamper un punto e dato che alla fine dellistruzione compare una
virgola, lo stamper sulla stessa linea del precedente.
Domanda: Ed ora come continua il programma ?
Risposta: number = number - 1 visto che indentata sotto il while.
Domanda: Cosa fa ?
Risposta: Decrementa la variabile di 1. Quindi number dopo questa istruzione non risulter pi 4 ma 5.
Domanda: Ora come continua ?
22
Capitolo 6. Debugging
Risposta: Dato che il livello di tabulazione decrementa dobbiamo pensare che tipo di struttura di
controllo stiamo applicando. Preso atto che un ciclo while dobbiamo tornare alla linea while
number > 1:.
Domanda: Adesso che succede ?
Risposta: Semplice: dopo il riassegnamento della variabile number, che passata da un valore di 5 a un
valore di 4, bisogna rifare il confronto tra la condizione del while e la variabile.
Domanda: Il risultato qual ?
Risposta: La condizione number > 1 ancora vera quindi il ciclo continua: verranno eseguite per la
seconda volta le istruzioni indentate sotto il while.
Domanda: Ancora print ".", e number = number - 1 ?
Risposta: Si :-) Il risultato sar la stampa di unaltro punto sulla stessa linea del precedente e il
decremento di una unit della variabile number che assumer il valore di 3.
Domanda: A questo punto quale sar la prossima linea ?
Risposta: finch non ci sar un cambio di indentazione causato dalla fine del ciclo la linea sar sempre
while number > 1:.
Domanda: Si ricomincia da capo allora ?
Risposta: Gi. Verr aggiunto unaltro punto sulla stessa linea dei precedenti e la variabile number verr
decrementata di nuovo. Queste istruzioni verranno eseguite finch la condizione del while non risulter
falsa.
Domanda: Riassumendo quindi, alla fine di questo ennesimo ciclo i punti saranno 3 e il valore della
variabile number sar 2.
Risposta: Esattamente.
Domanda: Continuiamo? Se non sbaglio ora dobbiamo tornare a while number > 1:.
Risposta: Si, dobbiamo tornare ancora alla linea che inizia il ciclo while per confrontare ancora una
volta variabile e condizione del ciclo: dato che 2 maggiore di 1 eseguiremo ancora le istruzioni
23
Capitolo 6. Debugging
indentate sotto. Alla variabile number verr assegnato il valore di 1 e i punti sulla nostra linea
diventeranno 4.
Domanda: Aspetta un secondo: i 4 punti sono il risultato finale del programma. Cosa significa ?
Risposta: Significa che probabilmente lerrore qui :-) Ricominciamo il ciclo: while number >
1:, ovvero finch la variabile number (che ora corrisponde a 1) maggiore di 1... Ecco lerrore! Il ciclo
si interrompe qui visto che 1 non maggiore di 1.
Domanda: Come posso riparare ?
Risposta: Dato che lo scopo del programma stampare 5 punti e non 4 dobbiamo semplicemente
cambiare la condizione del ciclo while sostituendo while number > 1: con while number >=
1: Questo non lunico modo per eseguire il fix del programma.
24
Capitolo 7. Le funzioni
7.1. Creare funzioni
Inizier questo capitolo mostrandovi cosa potreste ma non dovreste fare (quindi non scrivete):
a = 23
b = -23
if a < 0:
a = -a
if b < 0:
b = -b
if a == b:
print "The absolute values of", a,"and",b,"are equal"
else:
print "The absolute values of a and b are different"
Loutput sarebbe:
The absolute values of 23 and 23 are equal
loutput :
The absolute values of 23 and -23 are equal
Lelemento chiave di questo programma listruzione def. def (abbreviazione di define, definisci)
inizializza la definizione di una funzione. def seguita dal nome della funzione abs. Poi troviamo una
"(" seguita dal parametro num (che viene passato dal programma ad ogni chiamata di funzione). Le
istruzioni dopo il ":" vengono eseguite ogni volta che la funzione viene usata dal programma e si
possono distinguere dalle normali righe di codice perch sono indentate sotto la funzione. Essa, infatti,
25
Capitolo 7. Le funzioni
finisce quando la tabulazione torna al suo livello o quando incontra return. Listruzione return ritorna
un valore dove stata chiamata la funzione.
Osservate che i valori a e b non sono cambiati. Le funzioni ovviamente possono essere usate anche per
ripetere azioni che non ritornano alcun valore.
Ecco qualche esempio:
def hello():
print "Hello"
def area(width,height):
return width*height
def print_welcome(name):
print "Welcome",name
hello()
hello()
print_welcome("Fred")
w = 4
h = 5
print "width =",w,"height =",h,"area =",area(w,h)
Loutput :
Hello
Hello
Welcome Fred
width = 4 height = 5 area = 20
Questo esempio mostra solamente un po pi in profondit in quanti differenti modi si possono applicare
le funzioni. Osservate attentamente, potete anche non dare argomenti ad una funzione cos come potete
dargliene pi duno. Osservate anche che return opzionale.
Le funzioni possono essere usate per eliminare le ripetizioni di codice.
7.2. Esempi
factorial.py
#defines a function that calculates the factorial
def factorial(n):
if n <= 1:
return 1
26
Capitolo 7. Le funzioni
return n*factorial(n-1)
print
print
print
print
"2!
"3!
"4!
"5!
=
=
=
=
",factorial(2)
",factorial(3)
",factorial(4)
",factorial(5)
Output:
2!
3!
4!
5!
=
=
=
=
2
6
24
120
temperature2.py
#converts temperature to fahrenheit or celsius
def print_options():
print "Options:"
print " p print options"
print " c convert from celsius"
print " f convert from fahrenheit"
print " q quit the program"
def celsius_to_fahrenheit(c_temp):
return 9.0/5.0*c_temp+32
def fahrenheit_to_celsius(f_temp):
return (f_temp - 32.0)*5.0/9.0
choice = "p"
while choice != "q":
if choice == "c":
temp = input("Celsius temperature:")
print "Fahrenheit:",celsius_to_fahrenheit(temp)
elif choice == "f":
temp = input("Fahrenheit temperature:")
print "Celsius:",fahrenheit_to_celsius(temp)
elif choice != "q":
print_options()
choice = raw_input("option:")
Esecuzione:
> python temperature2.py
Options:
p print options
c convert from celsius
f convert from fahrenheit
q quit the program
option:c
Celsius temperature:30
Fahrenheit: 86.0
option:f
Fahrenheit temperature:60
Celsius: 15.5555555556
27
Capitolo 7. Le funzioni
option:q
area2.py
#By Amos Satterlee
print
def hello():
print Hello!
def area(width,height):
return width*height
def print_welcome(name):
print Welcome,,name
name = raw_input(Your Name: )
hello(),
print_welcome(name)
print
print To find the area of a rectangle,
print Enter the width and height below.
print
w = input(Width: )
while w <= 0:
print Must be a positive number
w = input(Width: )
h = input(Height: )
while h <= 0:
print Must be a positive number
h = input(Height: )
print Width =,w, Height =,h, so Area =,area(w,h)
Esecuzione:
Your Name: Josh
Hello!
Welcome, Josh
To find the area of a rectangle,
Enter the width and height below.
Width:
Must be
Width:
Height:
Width =
-4
a positive number
4
3
4 Height = 3 so Area = 12
7.3. Esercizi
Riscrivete il programma area.py della sezione 3.2 definendo funzioni separate per larea del quadrato, del
rettangolo e del cerchio (3.14 * raggio**2). Create anche uninterfaccia a menu.
28
Capitolo 8. Liste
8.1. Variabili con pi di un valore
Avete gi visto le variabili ordinarie che immagazzinano un singolo valore. Tuttavia esistono altri tipi di
variabili che possono contenere pi di un valore: queste variabili vengono chiamate liste. Ecco un
esempio delutilizzo delle liste:
which_one = input("What month (1-12)? ")
months = [January, February, March, April, May, June, July,\
August, September, October, November, December]
if 1 <= which_one <= 12:
print "The month is",months[which_one - 1]
In questo esempio la variabile months una lista. months definita dalla linea months =
[January, February, March, April, May, June, July, August,
September, October, November, December ] (osserva nel codice che \ permette di
andare a capo quando la linea di codice troppo lunga). Le parentesi quadrate "[" e "]" iniziano e
finiscono la lista e la virgola separa un elemento della lista dallaltro. La lista qui descritta viene usata
nellistruzione months [which_one - 1] e consiste in un insieme di elementi numerati partendo da
0. In altre parole se volete lelemento January della lista months dovete usare months [0]. Ovvero
quando assegnate a una lista un numero utilizzando la sintassi appena descritta essa ritorner lelemento
immagazzinato nella locazione corrispondente.
Listruzione if 1 <= wich_month <= 12: sar vera solo nel caso in cui which_one sia un
numero tra 1 e 12 inclusi.
Le liste possono essere pensate come una serie di scatole. Ad esempio le scatole create da demolist =
[life, 42, the universe, 6, and, 7] sarebbero allincirca cos:
Tabella 8-1.
box number 0
demolist
42
the universe 6
life
and
Ogni scatola ha un numero di riferimento cosicch listruzione demolist [0] seleziona lelemento
life dalla lista, demolist [1] lelemento 42, demolist[5] lelemento 7.
29
Capitolo 8. Liste
E questo loutput:
demolist = [life, 42, the universe, 6, and, 7]
after everything was appended demolist is now:
[life, 42, the universe, 6, and, 7, everything]
len(demolist) = 7
demolist.index(42) = 1
demolist[1] = 42
demolist[ 0 ]= life
demolist[ 1 ]= 42
demolist[ 2 ]= the universe
demolist[ 3 ]= 6
demolist[ 4 ]= and
demolist[ 5 ]= 7
demolist[ 6 ]= everything
After the universe was removed demolist is now:
[life, 42, 6, and, 7, everything]
life was found in demolist
amoeba was not found in demolist
The sorted demolist is [6, 7, 42, and, everything, life]
Questo esempio utilizza moltissime nuove funzioni. Ad esempio guardate come potete stampare
unintera lista per poi aggiungere nuovi elementi con la funzione append. len serve a contare quanti
elementi sono presenti nella lista: le entrate (index) valide di una lista (cio quelle richiamabili grazie a
30
Capitolo 8. Liste
nome_lista [numero dellelemento]) vanno da 0 a len - 1. La funzione index serve a sapere la
posizione di un elemento in una lista: nel caso esistano elementi con lo stesso nome ritorner la prima
posizione dellelemento. Osservate come listruzione demolist.index (42) ritorni il valore 1 e
listruzione demolist [1] ritorni il valore 42. La linea #Next we will loop through the list
un semplice commento usato per introdurre le prossime righe di codice:
c = 0
while c < len(demolist):
print demolist[,c,]=,demolist[c]
c = c + 1
crea una variabile c inizialmente di valore 0 che viene incrementata finch non raggiunge lultimo
elemento della lista. Nel frattempo listruzione print stampa ogni elemento della lista.
Listruzione del pu essere usata per rimuovere un elemento dalla lista. Le linee successive utilizzano
loperatore index per sapere se un elemento presente o meno nella lista.
La funzione sort ordina la lista ed utile se avete bisogno di una lista ordinata dallelemento pi
piccolo a quello pi grande oppure in ordine alfabetico.
Riassumendo possiamo compiere le seguenti operazioni:
Tabella 8-2.
esempio
spiegazione
list[2]
list[2] = 3
del list[2]
len(list)
"value" in list
list.sort()
ordina la lista
list.index("value")
list.append("value")
31
Capitolo 8. Liste
menu_item = input("Pick an item from the menu: ")
if menu_item == 1:
current = 0
if len(list) > 0:
while current < len(list):
print current,". ",list[current]
current = current + 1
else:
print "List is empty"
elif menu_item == 2:
name = raw_input("Type in a name to add: ")
list.append(name)
elif menu_item == 3:
del_name = raw_input("What name would you like to remove: ")
if del_name in list:
item_number = list.index(del_name)
del list[item_number]
else:
print del_name," was not found"
elif menu_item == 4:
old_name = raw_input("What name would you like to change: ")
if old_name in list:
item_number = list.index(old_name)
new_name = raw_input("What is the new name: ")
list[item_number] = new_name
else:
print old_name," was not found"
print "Goodbye"
32
Capitolo 8. Liste
Pick an item from the menu: 9
Goodbye
E un programma abbastanza lungo, diamo unocchiata al codice sorgente per capirlo meglio. La linea
list = [] crea una variabile list senza elementi al suo interno. La prossima linea importante
while menu_item != 9: . Questa linea inizia un ciclo che permette di ottenere il menu di questo
programma. Le linee seguenti del programma visualizzano un menu per decidere quale parte del
programma eseguire.
La sezione:
current = 0
if len(list) > 0:
while current < len(list):
print current,". ",list[current]
current = current + 1
else:
print "List is empty"
Scorre tutta la lista e visualizza ogni suo elemento. len(list) conta quanti elementi sono presenti
nella lista, se ritorna 0 la lista vuota.
Poche linee pi sotto appare listruzione list.append(name) che aggiunge un elemento alla fine della
lista. Saltate gi di unaltro paio di linee e osservate questa sezione di codice:
item_number = list.index(del_name)
del list[item_number]
Qui la funzione index viene utilizzata per trovare lindice dellelemento richiesto per poi utilizzarlo
nella sua cancellazione. del list [item_number] viene utilizzato appunto per rimuovere lelemento.
La prossima sezione:
old_name = raw_input("What name would you like to change: ")
if old_name in list:
item_number = list.index(old_name)
new_name = raw_input("What is the new name: ")
list[item_number] = new_name
else:
print old_name," was not found"
Usa index per trovare lelemento da modificare e sostituire il vecchio valore (old_name) con il nuovo
valore desiderato (new_name).
33
Capitolo 8. Liste
8.3. Esempi
test.py
## This program runs a test of knowledge
true = 1
false = 0
# First get the test questions
# Later this will be modified to use file io.
def get_questions():
# notice how the data is stored as a list of lists
return [["What color is the daytime sky on a clear day?","blue"],\
["What is the answer to life, the universe and everything?","42"],\
["What is a three letter word for mouse trap?","cat"]]
Output:
34
Capitolo 8. Liste
What color is the daytime sky on a clear day?green
Incorrect, correct was: blue
What is the answer to life, the universe and everything?42
Correct
What is a three letter word for mouse trap?cat
Correct
You got 66 % right out of 3
8.4. Esercizi
Espandete il programma test.py in modo che abbia un menu per selezionare le opzioni del test, la lista
delle domande ed unopzione per terminare lesecuzione. Aggiungete inoltre unaltra domanda: "What
noise does a truly advanced machine make ?" la risposta sar "Ping".
35
Lonnipresente output:
1
2
3
4
5
6
7
8
9
10
Loutput familiare ma il codice diverso. La prima linea utilizza la funzione range che richiede due
argomenti, proprio come nellesempio: range (inizio, fine). inizio il primo numero che viene
prodotto mentre fine maggiore di 1 dellultimo numero prodotto. Questo programma avrebbe anche
potuto essere scritto pi brevemente:
for count in range(1,11):
print count
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(-32, -20)
[-32, -31, -30, -29, -28, -27, -26, -25, -24, -23, -22, -21]
>>> range(5,21)
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
>>> range(21,5)
[]
Avrete certamente notato la presenza di una nuova struttura di controllo, gli esempi infatti usano la
struttura for. La sintassi del controllo for : for variabile nella lista:. La lista viene quindi
attraversata dal primo elemento allultimo e mentre il ciclo for compie il suo tragitto ogni elemento
viene inserito in una variabile.
Ecco unaltra dimostrazione:
demolist = [life,42, the universe, 6,and,7,everything]
for item in demolist:
print "The Current item is:",
36
Output:
The
The
The
The
The
The
The
The
output is:
Current item
Current item
Current item
Current item
Current item
Current item
Current item
is:
is:
is:
is:
is:
is:
is:
life
42
the universe
6
and
7
everything
Osservate come il ciclo for scorra tutti gli elementi nella lista. (Provate ad esempio a togliere la virgola
alla fine dellistruzione print o a cambiare il testo allinterno della stessa... smanettateci un po
insomma :=) ). Quindi, a cosa serve? Beh, serve a scorrere uno ad uno tutti gli elementi di una lista e a
fare qualcosa con ognuno di essi. Per esempio potete sommare tutti gli elementi:
list = [2,4,6,8]
sum = 0
for num in list:
sum = sum + num
print "The sum is: ",sum
Altrimenti potreste scrivere un semplice programma per trovare i duplicati in una lista. Ad esempio:
list = [4, 5, 7, 8, 9, 1,0,7,10]
list.sort()
prev = list[0]
del list[0]
for item in list:
if prev == item:
print "Duplicate of ",prev," Found"
prev = item
Va bene, allora come funziona? Scriviamo il programma in modo che ritorni un risultato passaggio per
passaggio, qualcosa di molto simile al debugging:
l = [4, 5, 7, 8, 9, 1,0,7,10]
print "l = [4, 5, 7, 8, 9, 1,0,7,10]","\tl:",l
l.sort()
print "l.sort()","\tl:",l
prev = l[0]
print "prev = l[0]","\tprev:",prev
del l[0]
print "del l[0]","\tl:",l
37
loutput cambiato:
l = [4, 5, 7, 8, 9, 1,0,7,10]
l: [4, 5, 7, 8, 9, 1, 0, 7, 10]
l.sort()
l: [0, 1, 4, 5, 7, 7, 8, 9, 10]
prev = l[0]
prev: 0
del l[0]
l: [1, 4, 5, 7, 7, 8, 9, 10]
if prev == item:
prev: 0
item: 1
prev = item
prev: 1
item: 1
if prev == item:
prev: 1
item: 4
prev = item
prev: 4
item: 4
if prev == item:
prev: 4
item: 5
prev = item
prev: 5
item: 5
if prev == item:
prev: 5
item: 7
prev = item
prev: 7
item: 7
Duplicate of 7 Found
if prev == item:
prev: 7
item: 7
prev = item
prev: 7
item: 7
if prev == item:
prev: 7
item: 8
prev = item
prev: 8
item: 8
if prev == item:
prev: 8
item: 9
prev = item
prev: 9
item: 9
if prev == item:
prev: 9
item: 10
prev = item
prev: 10
item: 10
La ragione per cui ho inserito cos tanti print nel codice che in questo modo riuscite a vedere il
comportamento del programma linea per linea (quindi se non riuscite ad immaginare il problema di un
programma malfunzionante tentate di mettere molti print per individuarlo con pi facilit).
Il programma inizia con la nostra solita noiosa e vecchia lista che ordina nella seconda linea a seconda
del valore degli elementi (dal minore al maggiore) in modo che ogni duplicato, se ce ne sono, sia vicino
all"originale". Dopo questi primi passi viene inizializzata una variabile prev(ious). Il primo elemento
della lista (0) viene cancellato perch altrimenti sarebbe incorrettamente sembrato un duplicato della
variabile prev. La linea successiva, come potete vedere, un ciclo for. Ogni singolo elemento della lista
viene in questo modo testato e confrontato con il precedente per riconoscere eventuali duplicati. Questo
avviene memorizzando il valore del precedente elemento della lista nella variabile prev e confrontando
questultima con lelemento corrente. prev viene quindi di volta in volta (ad ogni ciclo) riassegnato in
modo che lelemento corrente venga sempre confrontato con quello appena precedente nella lista.
Osservate anche come viene utilizzato /t per stampare una tabulazione.
Unaltro modo per utilizzare un ciclo for ripetere la stessa azione un determinato numero di volte.
Ecco il codice per visualizzare i primi 11 numeri della serie di Fibonacci:
a = 1
b = 1
38
39
1
0
1
0
1
1
0
1
0
Cosa succede ? Il programma consiste in una serie di istruzioni print; ogni istruzione print
visualizza un numero e unespressione. Il numero serve a farvi capire quale istruzione viene eseguita.
Potete notare che ogni espressione consiste in uno 0 o in un 1: in Python equivalgono a falso (0) e a
vero(1). Le linee:
print 1, a == 6
print 2, a == 7
restituiscono infatti vero e falso, esattamente come dovrebbero fare finch la prima affermazione vera
e la seconda falsa. La terza istruzione print un po diversa: print 3, a == 6 and b == 7.
Loperatore and significa se entrambe le affermazioni prima e dopo loperatore logico and sono vere
tutta lespressione vera altrimenti tutta lespressione falsa. Lespressione successiva, print 4, a
== 7 and b == 7, dimostra che se una parte dellespressione and falsa tutta lespressione sar falsa.
Il significato di and pu essere riassunto come segue:
Tabella 10-1.
espressione
risultato
vero
falso
falso
40
risultato
falso
Potete notare che se la prima espressione falsa Python non esegue un check sulla seconda espressione
perch sa gi che tutta lespressione falsa.
La linea successiva, print 5, not a == 7 and b == 7, utilizza loperatore not che restituisce
semplicemente lopposto dellespressione.
Lespressione pu infatti essere riscritta semplicemente come print 5, a != 7 and b == 7. Questa
la tabella:
Tabella 10-2.
espressione
risultato
not vero
falso
not falso
vero
risultato
vero or vero
vero
vero or falso
vero
falso or vero
vero
falso or falso
falso
Anche qui Python non esegue il check sulla seconda espressione se riconosce la prima come vera dato
che anche se la seconda affermazione risultasse falsa lintera espressione sarebbe comunque vera.
Le ultime due linee, print 8, not (a == 7 and b == 6) e print 9, not a == 7 and b ==
6, mostrano come le parentesi possano raggruppare espressioni e forzarne lesecuzione prima di altre al
di fuori dalle parentesi. Potete osservare infatti che le parentesi cambiano il valore dellespressione da
falso a vero, visto che obbligano loperatore not a valutare lintera espressione anzich solamente a ==
7.
Ecco un esempio dellutilizzo delle espressioni booleane:
list = ["Life","The Universe","Everything","Jack","Jill","Life","Jill"]
#make a copy of the list
copy = list[:]
#sort the copy
copy.sort()
41
Ecco loutput:
First Match:
Jill
Questo programma continua a scorrere la lista cercando duplicati while count < (len (copy)
and copy [count]). Quando uno dei due contatori pi grande dellultimo indice di copy o viene
trovato un duplicato, loperatore and non risulta pi vero e si esce dal ciclo. if si occupa semplicemente
di accertarsi che luscita dal ciclo sia dovuta alla presenza di un duplicato.
Nellesempio viene utilizzato unaltro trucco delloperatore and. Se guardate la tabella di and potete
osservare che la terza espressione falsa senza che Python esegua un check sul secondo elemento. Se
count >= len (copy) (in altre parole count < len (copy) falsa) allora copy[count] non
viene processata. Questo avviene perch Python sa che se la prima accezione falsa, lo sono entrambe.
Questo piccolo trucco utile se la seconda met delland causa un errore. Ho usato la prima espressione
(count < len(copy)) per eseguire un check su count e controllare se count sia un indice valido.
(Se non mi credete, rimuovete Jill e Life, eseguite il programma e vedete se funziona ancora, quindi
invertite lordine di count < len(copy) and copy[count] != prev con copy[count] !=
prev and count < len(copy)).
Le espressioni booleane possono essere usate quando avete bisogno di verificare due o pi elementi in
una volta.
10.1. Esempi
password1.py
## Questo programma chiede allutente uno username e una password
# dopodich verifica se lutente autenticato
name = raw_input("What is your name? ")
password = raw_input("What is the password? ")
if name == "Josh" and password == "Friday":
print "Welcome Josh"
elif name == "Fred" and password == "Rock":
42
Semplice esecuzione:
What is your name? Josh
What is the password? Friday
Welcome Josh
What is your name? Bill
What is the password? Money
I dont know you.
10.2. Esercizi
Scrivete un programma che spinga lutente ad indovinare il vostro nome dandogli solamente 3
possibilit, dopo le quali il programma termina.
43
Ecco loutput:
1.
2.
3.
4.
5.
44
Questo programma simile a quello con la lista di nomi nel capitolo sulle liste. Ecco come funziona il
programma. Innanzitutto viene definita la funzione print_menu che visualizza sullo schermo un menu
pi volte usato nel programma. A questo punto compare la linea numbers = {} che dichiara numbers
come un dizionario. Le linee seguenti fanno funzionare il menu:
for x in numbers.keys():
print "Name: ",x," \tNumber: ",numbers[x]
Grazie a questo ciclo si possono visualizzare le informazioni contenute nel dizionario. La funzione
number.keys() restituisce una lista che viene poi utilizzata dal ciclo for. Questa lista non in nessun
ordine particolare quindi se la volete in ordine alfabetico essa deve essere ordinata. Con la notazione
numbers[x] possiamo accedere ai singoli membri del dizionario: ovviamente in questo caso x una
stringa. Successivamente la linea numbers[name] = phone aggiunge un nome e un numero di telefono
al dizionario. Se name stato gi inserito nel dizionario phone, rimpiazza il valore precedente. Le linee:
if numbers.has_key(name):
del numbers[name]
Controllano se una chiave gi presente nel dizionario, in tal caso la rimuovono. La funzione
numbers.has_key(name) ritorna vero se name presente in numbers altrimenti ritorna falso. La linea
del numbers[name] rimuove la chiave [name] e il valore ad essa associato. Le linee:
if numbers.has_key(name):
print "The number is",numbers[name]
45
,hw ch 3,test]
def print_menu():
print "1. Add student"
print "2. Remove student"
print "3. Print grades"
print "4. Record grade"
print "5. Print Menu"
print "6. Exit"
def print_all_grades():
print \t,
for i in range(len(assignments)):
print assignments[i],\t,
print
keys = students.keys()
keys.sort()
for x in keys:
print x,\t,
grades = students[x]
print_grades(grades)
def print_grades(grades):
for i in range(len(grades)):
print grades[i],\t\t,
print
print_menu()
menu_choice = 0
while menu_choice != 6:
print
menu_choice = input("Menu Choice (1-6):")
if menu_choice == 1:
name = raw_input("Student to add:")
students[name] = [0]*len(max_points)
elif menu_choice == 2:
name = raw_input("Student to remove:")
if students.has_key(name):
del students[name]
else:
print "Student: ",name," not found"
46
E questo loutput:
1.
2.
3.
4.
5.
6.
Add student
Remove student
Print grades
Record grade
Print Menu
Exit
hw ch 2
25
quiz
50
hw ch 3
25
test
100
47
hw ch 2
25
24
3
0
quiz
quiz
50
45
4
0
hw ch 3
hw ch 3
25
23
5
0
test
test
100
95
La variabile students un dizionario le cui chiavi sono i nomi degli studenti e i valori, i voti degli
studenti. Le prime due linee creano semplicemente due liste. La linea successiva students =
{#Max:max_points} crea un nuovo dizionario la cui chiave #Max e il valore [25,25,50,25,100] (
il valore di max_points nel momento in cui il valore viene assegnato; viene usata la chiave #Max perch
" # " sempre ordinato sopra i caratteri alfabetici). Quindi viene definita la funzione print_menu. Le
linee:
def print_all_grades():
print \t,
for i in range(len(assignments)):
print assignments[i],\t,
print
keys = students.keys()
keys.sort()
for x in keys:
print x,\t,
grades = students[x]
print_grades(grades)
48
49
Mo
1
8
15
22
29
Tu
2
9
16
23
30
January
We Th Fr
3 4 5
10 11 12
17 18 19
24 25 26
31
Sa
6
13
20
27
Su
7
14
21
28
February
Mo Tu We Th Fr
1 2
5 6 7 8 9
12 13 14 15 16
19 20 21 22 23
26 27 28
Sa
3
10
17
24
Su
4
11
18
25
March
Mo Tu We Th Fr
1 2
5 6 7 8 9
12 13 14 15 16
19 20 21 22 23
26 27 28 29 30
Sa
3
10
17
24
31
Su
4
11
18
25
(Ho saltato parte delloutput, credo vi siate fatti unidea). Cosa fa il programma ? La prima linea
import calendar usa un nuovo comando: import . Il comando import carica un modulo (in questo
caso il modulo calendar). Per vedere i comandi disponibili nei moduli standard cercate nella "library
Questa versione importa una specifica funzione dal modulo. Creiamo unaltro programma utilizzando le
funzioni della Python Library (chiamate il file clock.py)(premete ctrl e c per chiudere il
programma):
from time import time, ctime
prev_time = ""
while(1):
the_time = ctime(time())
if(prev_time != the_time):
print "The time is:",ctime(time())
prev_time = the_time
With some output being:
The time is: Sun Aug 20 13:40:04 2000
The time is: Sun Aug 20 13:40:05 2000
The time is: Sun Aug 20 13:40:06 2000
The time is: Sun Aug 20 13:40:07 2000
Traceback (innermost last):
File "clock.py", line 5, in ?
50
Loutput ovviamente infinito, cos lho interrotto (loutput continua fino a quando non premete
ctrl+c). Il programma entra semplicemente in un cliclo infinito ed esegue un controllo per vedere se
lorario cambiato, nel qual caso visualizza il nuovo orario sul monitor. Fate attenzione a come import
utilizzato nella linea from time import time, ctime per richiamare pi di una funzione.
La Python Library contiene molte funzioni utili che semplificano la programmazione in Python.
12.1. Esercizio
Riscrivete il programma high_low.py della sezione 5.2 usando le ultime due cifre della funzione time
per rendere il numero random (casuale).
Note
1. Import cerca un file di nome calendar.py e lo legge. Se il file chiamante si chiama calendar.py
e contiene import calendar cerca di leggere in se stesso con risultati quantomeno scarsi.
51
Questi esempi dovrebbero esservi familiari. Se volete estrarre il primo elemento di una lista dovrete
richiamare lelemento con indice 0, il secondo elemento avr indice 1 e cos via attraverso la lista. Come
fare se volete lultimo elemento della lista ? Una via potrebbe essere quella di utilizzare la funzione len
allinterno delle parentesi quadre: list[len(list)-1]. len ritorna sempre lultimo indice + 1. Nello
stesso modo listruzione per avere il penultimo elemento della lista sar list[len(list)-2]. Esiste
una via pi semplice: in Python lultimo elemento sempre indicizzato come -1, il penultimo come -2 e
cos via. Ecco unesempio:
>>> list[len(list)-1]
five
>>> list[len(list)-2]
four
>>> list[-1]
five
>>> list[-2]
four
>>> list[-6]
zero
Cos ogni elemento in una lista pu essere indicizzato in due modi differenti, dallinizio della lista e
dalla fine della lista.
Unaltra via molto utile per estrarre elementi da una lista sono le sezioni. Ecco unaltro esempio:
>>> list = [0,Fred,2,S.P.A.M.,Stocking,42,"Jack","Jill"]
>>> list[0]
0
>>> list[7]
Jill
>>> list[0:8]
[0, Fred, 2, S.P.A.M., Stocking, 42, Jack, Jill]
>>> list[2:4]
[2, S.P.A.M.]
>>> list[4:7]
[Stocking, 42, Jack]
52
Le sezioni sono utilizzate per estrarre parti di liste. La sintassi per estrarre sezioni
list[primo_indice:ultimo_indice]. La sezione selezionata va da primo_indice allindice
prima di ultimo_indice. E possibile utilizzare entrambi i metodi di indicizzazione:
>>> list[-4:-2]
[Stocking, 42]
>>> list[-4]
Stocking
>>> list[-4:6]
[Stocking, 42]
Unaltro trucco con le sezioni non specificare lindice. Se il primo indice non viene specificato Python
assumer il primo indice della lista come indice da cui partire: Ecco unaltro esempio:
>>> list[:2]
[0, Fred]
>>> list[-2:]
[Jack, Jill]
>>> list[:3]
[0, Fred, 2]
>>> list[:-5]
[0, Fred, 2]
53
E questo loutput:
Bold
Bold
Bold
Bold
[
[
[
[
La funzione get_bold scorre per una lista dividendola in parole e chiamate. Le chiamate che cerca
sono <B> che inizia il testo in grassetto e <\B> che lo termina.
La prossima funzione delle liste copiarle:
>>>
>>>
>>>
[1,
>>>
>>>
[1,
>>>
[1,
a = [1,2,3]
b = a
print b
2, 3]
b[1] = 10
print b
10, 3]
print a
10, 3]
Questo probabilmente sorprendente in quanto una modifica a b modifica anche a. Questo grazie
allistruzione b = a che restituisce b come riferimento ad a. Significa che b non altro che unaltro
nome per riferirsi ad a, il risultato che una modifica a b una modifica ad a. Ci nonostante alcune
tipologie di assegnamento non significano la creazione di un doppio riferimento:
>>>
>>>
>>>
[1,
>>>
[1,
>>>
>>>
[1,
>>>
[1,
a = [1,2,3]
b = a*2
print a
2, 3]
print b
2, 3, 1, 2, 3]
a[1] = 10
print a
10, 3]
print b
2, 3, 1, 2, 3]
In questo caso b non un riferimento ad a in quanto listruzione a*2 crea una nuova lista; b quindi si
riferisce ad a*2 e non ad a. Tutti gli assegnamenti creano un riferimento. Quando passate una lista come
argomento ad una funzione create un riferimento. La maggior parte delle volte non dovrete preoccuparvi
di creare un riferimento anzich una copia. Ci nonostante, quando dovete modificare una lista senza
cambiarne unaltra assegnata ad un nome differente, dovete assicurarvi di aver creato una copia e non un
riferimento. Esistono diversi modi per copiare una lista. Il modo pi semplice usare le sezioni:
>>> a = [1,2,3]
54
b = a[:]
b[1] = 10
print a
2, 3]
print b
10, 3]
In questo modo si pu copiare una lista, ma qualsiasi sottolista creata in seguito si riferir alla rispettiva
sottolista della lista originale. Potete ovviare al problema copiando anche le sottoliste usando la funzione
deepcopy del modulo copy :
>>> import copy
>>> a = [[1,2,3],[4,5,6]]
>>> b = a[:]
>>> c = copy.deepcopy(a)
>>> b[0][1] = 10
>>> c[1][1] = 12
>>> print a
[[1, 10, 3], [4, 5, 6]]
>>> print b
[[1, 10, 3], [4, 5, 6]]
>>> print c
[[1, 2, 3], [4, 12, 6]]
Innanzitutto notate che a una lista di liste. Listruzione b[0][1] = 10 cambia sia la lista b che la
lista a, c invece resta uguale. Questo accade perch b continua ad essere un riferimento ad a se vengono
utilizzate le sezioni; c invece una copia ottenuta grazie alla funzione deepcopy.
Dovrete preoccuparvi dei riferimenti solamente quando utilizzate dizionari e liste. Numeri e stringhe
creano dei riferimenti ma quando vengono modificati creano una copia, quindi non potrete mai
modificarli inaspettatamente.
Adesso vi starete probabilmente chiedendo perch vengono usati i riferimenti. La ragione basilare per
la loro velocit. E molto pi veloce fare un riferimento a una lista di migliaia di riferimenti che copiarli
tutti. Unaltra ragione che permettono di avere una funzione che modifichi una lista o un dizionario.
Tenetene quindi conto se vi troverete ad avere strani errori in relazione a dati modificati quando
questultimi non avrebbero dovuto subire alcun cambiamento.
55
Ecco loutput:
Gimme a L
L
Gimme a o
o
Gimme a s
s
Gimme a e
e
The middle character is: d
The middle character is: r
The middle character is: a
Questo programma dimostra che le stringhe sono per alcuni aspetti simili alle liste. La procedura shout
dimostra che un ciclo for pu essere usato con le stringhe esattamente nello stesso modo in cui veniva
usato con le liste. La procedura middle mostra come possa essere utilizzata la funzione len anche con
le stringhe, cos come gli indici e le slice. Molte funzioni delle liste funzionano con le stringhe.
La prossima funzione utilizzer alcune funzioni specifiche delle stringhe:
def to_upper(string):
## Converts a string to upper case
upper_case = ""
for character in string:
if a <= character <= z:
location = ord(character) - ord(a)
new_ascii = location + ord(A)
character = chr(new_ascii)
upper_case = upper_case + character
return upper_case
print to_upper("This is Text")
Con loutput:
56
Il motivo per cui questo codice funziona che il computer "vede" le lettere come numeri da 0 a 255.
Python ha una funzione ord (abbreviazione di ordinale) che ritorna un carattere come un numero. Esiste
anche una funzione corrispondente chr che converte un numero in un carattere. Imparate queste
funzioni, il programma dovrebbe essere chiaro. Il primo dettaglio la linea: if a <= character
<= z: che controlla se la lettera minuscola. La linea: location = ord(character) ord(a) converte i numeri corrispondenti alle lettere nel codice ASCII in numeri da 0 a 36 quindi la
linea new_ascii = location + ord(A) converte la lettera minuscola in maiuscola.
Unaltro esercizio:
>>> #Integer to String
...
>>> 2
2
>>> repr(2)
2
>>> -123
-123
>>> repr(-123)
-123
>>> #String to Integer
...
>>> "23"
23
>>> int("23")
23
>>> "23"*2
2323
>>> int("23")*2
46
>>> #Float to String
...
>>> 1.23
1.23
>>> repr(1.23)
1.23
>>> #Float to Integer
...
>>> 1.23
1.23
>>> int(1.23)
1
>>> int(-1.23)
-1
>>> #String to Float
...
>>> float("1.23")
1.23
>>> "1.23"
1.23
>>> float("123")
123.0
57
La funzione int prova a convertire una stringa (o un numero in virgola mobile) in un intero. Esiste
anche una funzione simile float che converte un numero intero in numero in virgola mobile. Unaltra
funzione di Python eval che ritorna il tipo di dato che viene immesso. Per esempio:
>>> v=eval(123)
>>> print v,type(v)
123 <type int>
>>> v=eval(645.123)
>>> print v,type(v)
645.123 <type float>
>>> v=eval([1,2,3])
>>> print v,type(v)
[1, 2, 3] <type list>
Se usate la funzione eval dovete controllare il valore che ritorna per assicurarvi che sia quello che vi
aspettate.
Unaltra funzione utile in string la funzione split. Questo un esempio:
>>> import string
>>> string.split("This is a bunch of words")
[This, is, a, bunch, of, words]
>>> string.split("First batch, second batch, third, fourth",",")
[First batch, second batch, third, fourth]
Notate come split converte una stringa in una lista di stringhe. La stringa viene divisa in
corrispondenza di ogni spazio o di un secondo argomento (in questo caso la virgola).
14.1. Esempi
58
to_string(2)
to_string(23445)
to_string(-23445)
to_int("14234")
to_int("12345")
to_int("-3512")
Ecco loutput:
2
23445
-23445
14234
12345
-3512
59
Osservate come il programma scriva un file chiamato test.txt nella directory nella quale viene
eseguito. Il "\n" nella stringa dice a Python di andare a capo nel punto in cui compare.
Una panoramica sul file IO:
1. Aprite un oggetto file con la funzione open
2. Leggete o scrivete nelloggetto file (dipendentemente da come lavete aperto)
3. Chiudetelo
Il primo passo usare un oggetto file grazie alla funzione open. La sintassi oggetto_file = open
(nome_file, modo) dove oggetto_file la variabile contenente loggetto file, nome_file la
stringa con il nome del file, e modo la modalit di apertura del file: "r" in lettura, "w" in scrittura.
Dopodich potrete chiamare le funzioni delloggetto file. Le due funzioni pi comuni sono read e
write: la funzione read legge il file e ne ritorna il contenuto sottoforma di stringa, la funzione write
aggiunge una stringa alla fine del file.
Questa una nuova versione dellagenda telefonica che abbiamo scritto precedentemente:
import string
def print_numbers(numbers):
print "Telephone Numbers:"
for x in numbers.keys():
print "Name: ",x," \tNumber: ",numbers[x]
print
def add_number(numbers,name,number):
numbers[name] = number
60
def lookup_number(numbers,name):
if numbers.has_key(name):
return "The number is "+numbers[name]
else:
return name+" was not found"
def remove_number(numbers,name):
if numbers.has_key(name):
del numbers[name]
else:
print name," was not found"
def load_numbers(numbers,filename):
in_file = open(filename,"r")
while 1:
in_line = in_file.readline()
if in_line == "":
break
in_line = in_line[:-1]
[name,number] = string.split(in_line,",")
numbers[name] = number
in_file.close()
def save_numbers(numbers,filename):
out_file = open(filename,"w")
for x in numbers.keys():
out_file.write(x+","+numbers[x]+"\n")
out_file.close()
def print_menu():
print 1. Print Phone Numbers
print 2. Add a Phone Number
print 3. Remove a Phone Number
print 4. Lookup a Phone Number
print 5. Load numbers
print 6. Save numbers
print 7. Quit
print
phone_list = {}
menu_choice = 0
print_menu()
while menu_choice != 7:
menu_choice = input("Type in a number (1-7):")
if menu_choice == 1:
print_numbers(phone_list)
elif menu_choice == 2:
print "Add Name and Number"
name = raw_input("Name:")
phone = raw_input("Number:")
add_number(phone_list,name,phone)
elif menu_choice == 3:
print "Remove Name and Number"
name = raw_input("Name:")
remove_number(phone_list,name)
61
62
def save_numbers(numbers,filename):
out_file = open(filename,"w")
for x in numbers.keys():
out_file.write(x+","+numbers[x]+"\n")
out_file.close()
Analiziamo la funzione save_numbers del programma. Innanzitutto crea un oggetto file con il
comando open(filename, "w") dopodich crea una nuova linea per ognuno dei numeri di telefono
con il comando out_file.write(x+","+nombers[x]+"\n"). In questo modo scrive una linea
contenente il nome, una virgola ed il numero, seguito da un a capo (newline).
La funzione load_numbers un po pi complessa. Inizia creando un oggetto file quindi usa un ciclo
while per scorrere il file e leggere le linee con listruzione in_line = in_file.readline() finch
non incontra un break. Listruzione if esegue un controllo e uscir dal ciclo while con una istruzione
break nel momento in cui incontrer la fine del file (len(in_line) == 0) .
Listruzione in_line = in_line[:-1] elimina lultimo carattere della linea (il newline che farebbe
andare a capo la linea) e nelle restanti istruzioni viene trattata la stringa dividendola in base alla virgola
in due parti: [name,number] = string.split(in_line,",") , nome e numero. Infine il numero
viene inserito nel dizionario numbers.
63
15.1. Esercizi
Modificate il programma dei voti del Capitolo 11 per salvare su di un file la registrazione degli studenti.
64
Come potete vedere la funzione int() non funziona (e non deve funzionare) con il numero #@&.
Lultima linea mostra qual lerrore: Python ha trovato un ValueError. Come fare in modo che il
nostro programma sappia gestire anche questo valore ? Innanzitutto mettendo la parte di codice che
restituisce lerrore in un blocco try e poi decidendo come Python debba trattare ValueError. Il
seguente programma mostra come ottenere tale comportamento:
print "Type Control C or -1 to exit"
number = 1
while number != -1:
try:
number = int(raw_input("Enter a number: "))
print "You entered: ",number
except ValueError:
print "That was not a number."
Ora, quando eseguiremo il nuovo programma ed inseriremo #@& il programma risponder con la frase
"That was not a number." per poi continuare ci che stava facendo prima.
Quando il vostro programma restituisce un errore che sapete come gestire, mettete il codice in un blocco
try e il modo per gestire lerrore nel successivo blocco except.
16.1. Esercizi
Aggiornate il programma della rubrica telefonica del capitolo precedente in modo che non fermi
lesecuzione se lutente non inserisce dati nel menu.
65
66
67
68