Le liste

Le liste

Cos’è una lista? È come quella che si fa quando bisogna fare la spesa? O come quando si fa l’elenco degli amici da invitare alla festa per il compleanno?
Una lista è un insieme ordinato di valori di qualunque tipo, proprio come la lista della spesa.
Vediamo qualche esempio:
[3,6,9,12,15] lista di tutti numeri interi
[“Luigi”,”Mario”,”Nicola”,”Giuseppina”] lista di tutte stringhe
[“pane”,”latte”,”zucchero”,1,15,230,”bicchieri”,1.5,2.5]
lista mista: 3 stringhe, 3 numeri interi, 1 stringa, 2 numeri decimali
I valori della lista sono chiamati “elementi” .
Le parentesi quadrate [ ] iniziano e finiscono la lista e la virgola (“,”) separa un elemento della lista dall’altro.
Come abbiamo visto in uno degli esempi precedenti, non è obbligatorio che gli elementi di una lista siano tutti dello stesso tipo, tutti numeri o tutte stringhe, ossia una lista può essere non omogenea.
Esiste poi una lista speciale chiamata “lista vuota” e si indica con [ ].
La lista vuota non contiene alcun elemento.
Esempi:
[“pane”,”latte”,”zucchero”,1,15,230,”bicchieri”,1.5,2.5]
[1,”due”,3.0]
[]
[“tabellina del cinque”,5,10,15,20,25]

Ovviamente, alle liste possiamo dare un nome.
spesa
=[“pane”,”latte”,”zucchero”,1,15,230,”bicchieri”,1.5,2.5]
vocabolario = [“bicicletta”,”casa”,”scuola”]
dati_di_delpiero = [“Del Piero”, “Alessandro”, 1974]
lista_vuota = []

Ma le liste sono un tipo di variabile?

Si, le liste sono un tipo di variabile. Variabili “composte”.
Le variabili ordinarie immagazzinano un singolo valore.
Le liste sono variabili che possono contenere più di un valore.
Possiamo pensarle come composte da una serie di scatole.
Vediamo ora come si fa ad accedere ai singoli elementi di una lista.
Prova a scrivere il seguente programma e analizza attentamente il risultato:
Squadre = [“Juventus”, “Inter”, “Milan”, “Roma”]
i = 0
while i < 4:
  print Squadre[i]
  i = i + 1

Questo programma assegna alla lista squadre alcuni valori e con il ciclo while “attraversa” la lista e ne visualizza un elemento alla volta.
Per farlo usa un indice (nel nostro caso “i”).
Squadre[i] individua l’elemento i della lista squadre.
Quindi è possibile accedere separatamente a ciascun elemento della lista.

Ricordi che abbiamo parlato di insieme ordinato di valori?
Gli elementi di una lista sono valori numerati e identificati da un indice.
Un indice identifica un particolare elemento di un insieme ordinato che nel
nostro caso è l’insieme degli elementi della lista.
La numerazione degli elementi della lista inizia da 0.

Squadre[0] è la stringa “Juventus”
Squadre[1] è la stringa “Inter”
Squadre[2] è la stringa “Milan”
Squadre[3] è la stringa “Roma”

oppure

dati_di_delpiero[0] è la stringa “Del Piero”
dati_di_delpiero[2] è la stringa “1974”

Appare chiaro da questi esempi che l’elemento [0] è il primo e l’elemento [2] è il terzo.

Nota bene: Fai attenzione al fatto che gli indici di una lista, cosi come gli indici di una stringa, iniziano sempre da zero; può sembrarti strano, ma i calcolatori preferiscono iniziare a contare da zero. Quindi per accedere al primo elemento di una lista dobbiamo scrivere [0] e non [1].
Esercitati a selezionare gli elementi di tutte le liste che abbiamo usato come esempio e prova a scrivere un ciclo WHILE per attraversarle e visualizzare gli elementi su video, come nell’esempio seguente, con la lista: [3,6,9,12,15]

  1. Innanzitutto dobbiamo dare un nome alla lista:
    tabellina = [3,6,9,12,15]
  2. Quindi selezionare gli elementi:
    >>>print tabellina[0]
    3
    …….
    …….
    …….
  3. Ora scriviamo il ciclo per attraversare la lista:
    i = 0
    while i < 5:
    print tabellina[i]
    i = i + 1

Ora che hai una buona dimestichezza con le liste, specifichiamone meglio l’uso. Ad esempio:
Cosa succede con questa espressione?
dati_di_delpiero[1] = “Ale”
L’operatore porzione [ ] può comparire sia a destra che a sinistra del simbolo = di un’espressione. A destra indica l’elemento specificato, a sinistra cambia uno degli elementi della lista (nell’esempio all’elemento 1 viene assegnato il valore “Ale”). Quindi il secondo elemento della lista dati_di_delpiero[1] diventa: “Ale”.
A differenza delle stringhe, le liste sono “mutabili”, cioè gli elementi della lista possono essere sostituiti da valori diversi da quelli iniziali. È quindi possibile cambiare il valore di un elemento di una lista con un’istruzione di assegnazione.
Se a dati_di_delpiero aggiungiamo un quarto elemento per indicare i gol fatti, scriveremo:
dati_di_delpiero = [“Alessandro”,”Del Piero”, 32, 205]
Ogni volta che Del Piero segnerà un goal scriverò:
dati_di_delpiero[3] = dati_di_delpiero[3] + 1
e, ogni anno, il giorno del suo compleanno, il 9 novembre, scriverò
dati_di_delpiero[2] = dati_di_delpiero[2] + 1

Indici
Si accede agli elementi di una lista nel modo già visto per accedere ai caratteri di una stringa.
print dati_di_delpiero[1] -> Visualizza: il secondo elemento della lista, ossia Alessandro
Una qualsiasi espressione che produca un intero può essere un indice.
Ad esempio: tabellina[5-1] visualizza: 12
Prova a usare un numero decimale come indice e analizza il messaggio di errore
che compare:
TypeError: sequence index must be integer
Prova a leggere o a modificare un elemento che non esiste. Ad esempio:
tabellina[7] = 2
L’interprete cerca di assegnare a tabellina[7] il valore 2.
Anche qui analizza attentamente il messaggio di errore:
IndexError: list assignment index out of range

Cosa succede se l’indice ha valore negativo? ad esempio: tabellina[-2]
Se un indice ha valore negativo il conteggio parte dalla fine della lista.
Per verificarlo prova a scrivere: dati_di_delpiero[-3]
Questo metodo di usare l’indice negativo si rivela molto comodo quando non si ricorda la lunghezza della lista. Sappiamo che se scriviamo [-1] accederemo all’ultimo elemento, [-2] al penultimo e così via.
Infine, come abbiamo visto all’inizio, una variabile di ciclo può essere usata come indice di lista. Esempio:
amici = [“Gianni”, “Luigi”, “Carlo”]
i = 0
while i <3:
print amici[i]
i = i +1

Lista speciale
È una lista composta da tutti numeri interi consecutivi, talmente comune che Python fornisce un modo speciale per crearla. La funzione range è lo strumento usato per crearla. Infatti, scrivere [0,1,2,3,4] è equivalente a scrivere range[5].
Cioè, la funzione range crea una lista che parte da 0 e arriva fino al numero indicato dall’indice.
range[10] è equivalente a [0,1,2,3,4,5,6,7,8,9].
Con range si può scrivere: range[1,5] che è equivalente a [1,2,3,4].
La funzione range in questo caso legge dalla lista di interi gli elementi che partono dal primo indice incluso e arrivano all’ultimo indice escluso.
Con range possiamo scrivere anche espressioni del tipo:
range[1,10,2] che è equivalente a [1,3,5,7,9]
Il terzo indice si chiama “passo” e indica con quale intervallo leggere i numeri dalla lista di interi partendo da 1 e arrivando a 10 escluso. In questo caso legge il primo, il terzo, il quinto e cosi via fino a 10-1, ottenendo una lista di numeri dispari.
Che lista ottieni con questa funzione, range[2,10,2] ?       [2, 4, 6, 8]

3 – Lunghezza di una lista
La funzione len applicata ad una lista produce il numero di elementi di una lista, come nelle stringhe.
>>>allievi=[“luigi”,”marco”,”filippo”,”paola”,”gabriella”,”silvia”]
>>>i = 0
>>>while i < len(allievi):
>>> print allievi[i]
>>> i = i + 1
luigi marco filippo paola gabriella silvia

4 – Operazioni sulle liste
Come per le stringhe, l’operatore + concatena le liste:
>>>allievi_3A = [“luigi”,”marco”,”filippo”,”paola”,”gabriella”,”silvia”]
>>>allievi_4E = [“gabriele”,”alessandro”,”anna”,”michela”,”antonio”]
>>>allievi = allievi_3A + allievi_4E
>>>print allievi
luigi marco filippo paola gabriella silvia gabriele alessandro anna michela antonio

L’operatore * ripete una lista un dato numero di volte.
>>>numeri * 4
3 6 9 12 15 3 6 9 12 15 3 6 9 12 15 3 6 9 12 15
>>>allievi_4E * 2
gabriele alessandro anna michela antonio gabriele alessandro anna michela antonio

5 – Sezione di lista
Una sezione di lista è l’analogo di una sezione di stringa e ha la stessa logica di funzionamento. Infatti, come per le stringhe, si adotta l’operatore porzione :
>>>amici = [“Gianni”, “Luigi”, “Carlo”)
>>>amici[0:3]
gianni luigi carlo
>>amici[1:3]
luigi carlo
>>>allievi_4E =
[“gabriele”,”alessandro”,”anna”,”michela”,”antonio”]
>>>allievi_4E[1:3]
[alessandro,anna ]
>>>allievi[1:2]
[alessandro]

Con questo operatore possiamo eliminare uno o più elementi di una lista assegnando alla corrispondente sezione una stringa vuota.
>>>allievi_4E = [“gabriele”,”alessandro”,”anna”,”michela”,”antonio”]
>>>allievi_4E[1:3] = []
>>>print allievi_4E
gabriele michela antonio
Ma non è così pratico ed è facile sbagliare. Con la funzione del è molto più facile cancellare un elemento da una lista.
>>>allievi_4E = “gabriele”,”alessandro”,”anna”,”michela”,”antonio”]
>>> del allievi_4E[1:3]
>>>print allievi_4E
gabriele michela antonio
Vediamo un altro esempio:
>>>Squadre = [“Juventus”, “Inter”, “Milan”, “Roma”]
>>>del Squadre[1]
>>>print Squadre
Juventus Milan Roma
Analogamente possiamo inserire uno o più elementi in una lista inserendoli in una sezione vuota nella posizione desiderata, come nella terza istruzione del programma seguente:
>>>allievi_4E = [“gabriele”,”alessandro”,”anna”,”michela”,”antonio”]
>>>print allievi[2:2]
[]
>>>allievi_4E[2:2] = [“sandra”, “andrea”]
>>>print allievi_4E
gabriele alessandro sandra andrea anna michela antonio

Cosa si ottieneo se scrivo quanto segue?
>>>allievi_4E =
[“gabriele”,”alessandro”,”anna”,”michela”,”antonio”]
>>>print allievi_4E[:4]
>>>print allievi_4E[3:]
>>>print allievi_4E[:]
Se non viene specificato il primo indice la porzione parte dall’inizio della stringa.
Senza il secondo indice la porzione finisce con il termine della stringa.
Se mancano entrambi gli indici si intende tutta la lista.

LISTE annidate
Un elemento di una lista può essere a sua volta una lista.
>>>tabellina = [3,6,9,12,15,[10,20,30]]
>>>print tabellina[5]
10 20 30
Il sesto elemento della lista tabellina è a sua volta una lista.

Nell’esempio la lista allievi_4E è diventata una lista di liste:
>>>allievi_4E =
[[“bianchi”,”gabriele”],[“verdi”,”alessandro”],[“rossi”,”anna”],[“neri”,”michela
“],[“viola”,”antonio”]]
>>>print allievi_4E[2]
rossi anna

Cosa si ottiene se si scrive print allievi_4E[2][0]?
Si ottiene come risultato [rossi].
Si può estrarre un elemento da una lista annidata con due metodi differenti.
Il primo è il seguente:
>>>allievo = allievi_4E[2]
>>> allievo[0]
rossi
Si crea una lista che si chiama allievo e prendo il primo elemento di quella nuova
lista.
Il secondo permette di scrivere direttamente:
>>>allievi_4E[2][0]
Questa espressione deve essere letta da sinistra verso destra: trova il terzo
elemento (2) della lista allievi_4E
ed essendo questo elemento a sua volta una lista, ne estrae il primo elemento (0).

Il ciclo FOR
Riprendiamo l’esempio:
allievi = [“luigi”,”marco”,”filippo”,”paola”,”gabriella”,”silvia”]
i = 0
while i < len(allievi):
      print allievi[i],
     i = i + 1

luigi marco filippo paola gabriella silvia
Questo ciclo può essere scritto anche in questo modo:

allievi = [“luigi”,”marco”,”filippo”,”paola”,”gabriella”,”silvia”]
for allievo in allievi:
      print “Ora stampo l’allievo: “, allievo
Possiamo leggere quasi letteralmente: “Fai quello che segue per ciascun allievo nella lista allievi, lavorando la prima volta sul primo elemento, la seconda sul secondo, e cosi via.
Stesso risultato, ma il programma è molto più conciso.
In termini generali si deve scrivere:

for <nome di variabile> in <nome di lista>:

L’istruzione for significa:
per ciascuna variabile della lista fai tutto quello che segue

In modo più formale la lista viene analizzata dal primo elemento sino all’ultimo.
La prima volta:
1. alla variabile allievo assegna il valore allievi[0]
2. esegue i comandi che seguono i due punti
3. ritorna all’istruzione for e prosegue fin quando trova un elemento nella lista.

Negli esempi che seguono cerchiamo di capire a cosa può servire il ciclo for

Stampiamo il quadrato dei primi 10 numeri interi.
for numero in range(11):
print “il quadrato di “, numero, ” è “, numero * numero
il quadrato di 0 è 0
il quadrato di 1 e` 1
il quadrato di 2 e` 4
il quadrato di 3 e` 9
il quadrato di 4 e` 16
il quadrato di 5 e` 25
il quadrato di 6 e` 36
il quadrato di 7 e` 49
il quadrato di 8 e` 64
il quadrato di 9 e` 81
il quadrato di 10 e` 100

Misuriamo ora la lunghezza di alcune parole:
vocabolario=[‘alba’,’banana’,’carro’,’dodici’,’giacca’,’finestra’]
for parola in vocabolario:
print parola, len(parola)
alba 4
banana 6
carro 5
dodici 6
giacca 5
finestra 8

Per uscire immediatamente da un ciclo for o while si può usare l’istruzione break.
Vediamo un esempio semplice: un programma che stampa tutti i numeri positivi fino a 100 ma se viene inserito 0 si interrompe.
i = 1
while i < 100:
      i = input(‘inserisci un numero da 0 a 100 ‘)
      if i == 0:
        break
      print “il numero è “, i
i = i + 1
print ‘Finito’

Notare che se il ciclo avesse un else questo non verrebbe mai eseguito.

Fare le cose “con stile”

Prima di passare allo step successivo, dedicato interamente alla grafica, vediamo insieme qualche accorgimento utile per facilitarci nella scrittura di programmi più complessi, con molte righe di codice.
I programmi che eseguono operazioni complesse hanno tantissime righe di codice e a volte può essere veramente difficile ricordarsi la logica con cui sono state scritte.
I programmatori hanno una regola fondamentale quando scrivono i loro programmi: la coerenza.

È molto importante che il codice del programma sia scritto in modo da rispettare alcune regole che il programmatore decide all’inizio cosi poi gli sarà facile leggerlo in seguito quando dovrà correggerlo o cambiarlo.
Cominciamo…

Indentazioni
Quando si inizia a scrivere, si decida quanti spazi lasciare nelle indentazioni delle istruzioni e lascia sempre quelli.
Ricordarsi di usare sempre e solo la sbarra spaziatrice.
Se si utilizzasse il tasto di tabulazione, si potrebberoavere dei problemi; infatti, i computer seguono formattazioni diverse per il TAB.
Nell’esempio seguente lasciamo sempre 4 spazi:

def interrogazione(domanda,risposta_esatta):
    risposta_allievo = raw_input(domanda)
        if risposta_esatta == risposta_allievo:
               print “La risposta è esatta”
               print “Bravissimo”
        else:
            print “Risposta errata”
            print “La risposta esatta è “, risposta_esatta
            print “. Studia di più!”

Separazioni
È una buona regola separare le definizioni di funzioni lasciando due righe bianche.
Si possono usare le righe bianche anche all’interno del programma e delle funzioni, moderatamente, per indicare le sezioni logiche, cioè le parti di programma che risolvono problemi diversi.

Spazi bianchi in Espressioni e Istruzioni sono da evitare
• immediatamente entro parentesi tonde, quadre o graffe
• subito prima di virgola, punto e virgola, o due punti
• subito prima della parentesi aperta che inizia la lista degli argomenti in una chiamata
• subito prima della quadra aperta che inizia un indicizzazione
• più di uno spazio attorno a un assegnamento o operatore per allinearlo con altri, tipo:
• x      = 1
• y      = 2

Lunghezza massima delle righe
Molto spesso sui PC di uso comune le righe sono di 80 caratteri.
Se scrivi linee più lunghe, queste verranno “ripiegate” e risulteranno brutte e soprattutto difficili da leggere.
Cercate quindi di limitare ogni linea a un massimo di 79 caratteri (una linea di esattamente 80 caratteri rischierebbe infatti di venire comunque ripiegata).
Comunque, se proprio non ci riuscite, il modo migliore di dividere linee lunghe è come vedi nell’esempio
seguente:
print altezza_media_femmine
altezza_media_classe =((altezza_media_femmine*femmine)+
                      (altezza_media_maschi*maschi))/alunni
print altezza_media_classe
Ricordarsii di indentare bene la riga che continua a capo e sempre nello stesso modo.

I commenti
I “commenti” sono parole, frasi o proprio testi brevi che servono a spiegare bene le operazioni che il codice esegue. I commenti non sono esaminati dall’interprete che quando li incontra passa oltre.
È molto importante aggiungere nei programmi alcune osservazioni che spiegano le operazioni che vengono fatte perché il codice risulta molto più comprensibile anche allo stesso autore, che dopo un po’ di mesi può anche non ricordarsi più perché aveva scritto le istruzioni in quel modo.
Attenzione a scrivere bene i commenti: inserire dei commenti che contraddicono il codice è molto peggio che non avere commenti!
Anche per i commenti valgono le raccomandazioni precedenti.

I commenti possono essere “a blocco” e allora si riferiscono al codice che li segue.
• Se il codice è indentato anche i commenti a blocco vanno indentati esattamente come quel codice.
• Ogni riga di un commento a blocco inizia con # .
• Si possono separare i paragrafi entro un commento a blocco con una riga vuota che contiene
soltanto un #.
• Il commento può essere lungo quanto si vuole, non ci sono limiti sulla lunghezza.
• È meglio circondare i commenti a blocco con una riga bianca sopra e una sotto per renderli più visibili.

I commenti possono essere anche “in linea” ovvero sulla stessa riga dell’istruzione.
Questi commenti non dovrebbero dire delle cose ovvie, ad esempio:
x = x+1 # Incremento x
è un commento ovvio e quindi inutile e soprattutto distrae chi legge il programma!!!

I commenti in linea dovrebbero essere separati da almeno due spazi dall’istruzione e devono iniziare con un # seguito da un singolo spazio. Ricordati di non usare spesso i commenti in linea perché l’effetto finale è di un programma poco leggibile, meglio usare alcuni blocchi anche lunghi ma messi nei punti cruciali del programma.
Vediamo un esempio prima senza i commenti e poi con alcuni commenti.
def interrogazione(domanda,risposta_esatta):
     risposta_allievo = raw_input(domanda)
      if risposta_esatta == risposta_allievo:
          print “La risposta è esatta”
          print “Bravissimo”
     else:
           print “Risposta errata”
         print “La risposta esatta è “, risposta_esatta
         print “. Studia di più!
domanda1 = “In che anno è caduto l’impero romano d’occidente? “
risposta_esatta1 = “476”
interrogazione(domanda1, risposta_esatta1)
domanda2 = “Chi è stato il primo presidente degli Stati Uniti? “
risposta_esatta2 = “Washington”
interrogazione(domanda2, risposta_esatta2)
domanda3 = “In che anno è terminata la prima guerra mondiale? “
risposta_esatta3 = “1918”
interrogazione(domanda3, risposta_esatta3)

Ora rivediamo lo stesso esercizio con i commenti:
# Programma “interrogazione di storia”
# a ogni domanda chiama la funzione
# interrogazione
# funzione che controlla la risposta dell’allievo, confrontandola con la
# risposta esatta
def interrogazione(domanda,risposta_esatta):
    risposta_allievo = raw_input(domanda)
    if risposta_esatta == risposta_allievo:
        print “La risposta è esatta”
        print “Bravissimo”
    else:
    print “Risposta errata”
    print “La risposta esatta è “, risposta_esatta
       print “. Studia di più!”

# prima domanda
domanda1 = “In che anno e` caduto l’impero romano d’occidente? “
risposta_esatta1 = “476”
interrogazione(domanda1, risposta_esatta1) # prima chiamata di funzione
# seconda domanda
domanda2 = “Chi e’ stato il primo presidente degli Stati Uniti? “
risposta_esatta2 = “Washington”
interrogazione(domanda2, risposta_esatta2)….. # seconda chiamata di funzione
# terza domanda
domanda3 = “In che anno e` finita la prima guerra mondiale? “
risposta_esatta3 = “1918”
interrogazione(domanda3, risposta_esatta3 # terza chiamata di funzione

Scoprire gli errori (debugging)

Può capitare che un programma funzioni correttamente ma che il risultato sia diverso da quello che ci si aspetti oppure che un programma non faccia nulla o ancora che non si fermi più quando va in esecuzione; insomma spesso i programmi contengono degli errori che non è sempre facile scoprire. In inglese gli errori si chiamano “bug”, insetti che si infiltrano tra le righe del programma, ed è per questo che la tecnica di scoprire gli errori si chiama “debugging”.
Il primo passo per scoprire un errore è capire con che tipo di errore si
ha a che fare.

Un tipo di errore molto comune è l’errore di sintassi. Si verifica quando sbagli a scrivere un istruzione (ad esempio mancano i due punti alla fine di una istruzione if) e compaiono i messaggi: SyntaxError,
invalid syntax. Python può eseguire un programma solo se il programma è sintatticamente corretto, altrimenti il programma non è eseguito e l’interprete trasmette un messaggio d’errore.
Ecco alcune raccomandazioni per evitare i più comuni errori di sintassi.

• controllare di non usare parole riservate per dare i nomi alle variabili
• controllare i due punti alla fine delle istruzioni dove sono necessari
• controllare l’indentazione
• controllare che le parentesi siano appaiate correttamente ( una parentesi non chiusa costringe Python a cercare la fine nelle righe successive…)
• controllare che non ci sia un “=” anziché un “==”

Un altro tipo di errore è l‘errore in esecuzione (runtime error).
Cioè il programma non fa nulla oppure si blocca, oppure continua all’infinito, oppure ancora si sta cercando di dividere un numero per 0. In tutti questi casi la sintassi è corretta ma qualcosa va storto.
E qui il controllo diventa più difficile. Vediamo i casi possibili:
Il programma non fa nulla: magari si ha delle funzioni ma ti sei dimenticato di mettere nel programma la chiamata di funzione. Controllare bene che ci siano tutte le chiamate alle funzioni.
Il programma si blocca o continua all’infinito. Controllare i cicli, forse il programma non esce mai da un ciclo.
Un metodo semplice e utile di scoprire gli errori nei cicli è quello di stampare i risultati di ogni operazione usando l’istruzione print immediatamente prima di entrare nel ciclo e una subito dopo
l’uscita. Ad esempio: print “entrata nel ciclo” e print “uscita dal ciclo”.
Cosi se eseguendo il programma vedi il primo messaggio ma non il secondo sei sicuro che il ciclo è infinito!

Inserire le istruzioni di “print” per scoprire gli errori in esecuzione è un metodo ottimo e può essere usato come nell’esempio di prima oppure per:
– stampare i valori delle variabili prima e dopo una condizione (if, while) per verificare che cambino.
– stampare i parametri di una funzione
– aggiungere le istruzioni print lungo il flusso del programma ti permette di seguire la traccia di cosa sta facendo Python ed eventualmente dove sbaglia
Attenzione a non farsi sommergere dalle “print”. Bisogna metterne poche e quando non servono bisogna ricordarsi di toglierle.
Spesso vedere stampati i dati ti aiuta a scoprire indizi utili a trovare la soluzione agli errori.
Ma non disperarsi se si è davvero bloccati! Anche ai migliori succede. In questo caso la soluzione migliore è smetterla di guardare il codice, fermarsi e poi ritornare “freschi”. A volte ci vuole molto tempo per trovare un errore ed è meglio fare la ricerca con la mente riposata.
I migliori hacker sostengono che i posti sicuri per trovare i bug sono itreni, le docce, il letto…!!!
Il lavoro di debugging a volte può essere frustrante ma è anche una delle parti più creative, stimolanti ed interessanti della programmazione.
In un certo senso per fare il debug bisogna diventare detective: si è messi di fronte agli indizi e bisogna ricostruire i processi e gli eventi che hanno portato ai risultati che si è ottenuto.
Come diceva Sherlock Holmes “Quando hai eliminato l’impossibile ciò che rimane, per quanto improbabile, deve essere la verità”.

Vediamo un esempio di debugging così capirai più facilmente l’uso dell’istruzione print come strumento di debugging. Riprendiamo un esercizio:
La soluzione corretta, con le “print” per il debugging e i commenti è:
maschi = 8
femmine =10
alunni = maschi + femmine
print alunni
M = 1.55 #altezza di Mario
FML = 1.60*3 #altezza di Fabio, Matteo, Luca
AAGG = 1.50*4 #altezza di Aldo Andrea Giovanni Giacomo
altezza_media_maschi = (M + FML+ AAGG)/ maschi
print altezza_media_maschi
MGEF = 1.55*4 #altezza di Marta Giovanna Elisabetta Francesca
SCS = 1.50*3 #altezza di Stefania Chiara Simonetta
A = 1.68 #altezza di Arianna
DD = 1.63*2 #altezza di Daria, Domitilla
altezza_media_femmine = (MGEF+ SCS + A + DD)/femmine
print altezza_media_femmine
altezza_media_classe =((altezza_media_femmine*femmine)+(altezza_media_maschi*maschi))/
alunni
print altezza_media_classe

Facciamo un errore:
maschi = 8
femmine =10
alunni = maschi + femmine
print alunni
M = 1.55
FML = 1.60*3
AAGG = 1.50*4
altezza_media_maschi = (M + FML+ AAGG)/ maschi
print altezza_media_maschi
MGEF = 1.55*4
SCS = 1.50*3
A = 1.68
DD = 1.63*5 (errore inserito)
altezza_media_femmine = (MGEF+ SCS + A + DD)/femmine
print altezza_media_femmine
altezza_media_classe =((altezza_media_femmine*femmine)+(altezza_media_maschi*mas
chi))/alunni
print altezza_media_classe

Dopo aver verificato che l’altezza media delle femmine ha un valore che è sbagliato, proviamo ad inserire alcune istruzioni di stampa (print) per controllare il valore delle variabili che utilizziamo per calcolare il valore – altezza media delle femmine. Così si vedrà che il valore della variabile DD è sbagliato e sarà facile correggere l’errore:

maschi = 8
femmine =10
alunni = maschi + femmine
print alunni
M = 1.55
FML = 1.60*3
AAGG = 1.50*4
altezza_media_maschi = (M + FML+ AAGG)/ maschi
print altezza_media_maschi
MGEF = 1.55*4
SCS = 1.50*3
A = 1.68
DD = 1.63*5
print AA
print SCS
print A
print DD
altezza_media_femmine = (MGEF+ SCS + A + DD)/femmine
print altezza_media_femmine
altezza_media_classe
=((altezza_media_femmine*femmine)+(altezza_media_maschi*maschi))/alunni
print altezza_media_classe

Inserendo queste quattro istruzioni di print potremo accorgerci dell’errore che abbiamo fatto.

 

Commento all'articolo