Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Appunti corso "Programmazione e Analisi di Dati" - Modulo A "Programmazione Python", Appunti di Programmazione Orientata agli Oggetti

Appunti di tutte le lezioni (a.a. 2022-2023) del modulo A "Programmazione" (9cfu) del corso "Programmazione e Analisi di Dati". Docenti: Susanna Pelagatti, Barbara Guidi. Informatica Umanistica Magistrale - Università di Pisa (Voto esame 30). Appunti scritti su Overleaf e completi di codice, esempi e schemi.

Tipologia: Appunti

2022/2023

In vendita dal 25/08/2023

emer_
emer_ 🇮🇹

1 documento

1 / 65

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Appunti Programmazione e Analisi di Dati
Informatica Umanistica (Magistrale)
prof.ssa Susanna Pelagatti
prof.ssa Barbara Guidi
a.a. 2022/2023
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41

Anteprima parziale del testo

Scarica Appunti corso "Programmazione e Analisi di Dati" - Modulo A "Programmazione Python" e più Appunti in PDF di Programmazione Orientata agli Oggetti solo su Docsity!

Appunti Programmazione e Analisi di Dati

Informatica Umanistica (Magistrale)

prof.ssa Susanna Pelagatti

prof.ssa Barbara Guidi

a.a. 2022/

Indice

1 Lezione 1 - Introduzione (19 settembre 2022)

Informatica: INFORmazione + autoMATICA Informazione: rappresentazione e codifica che abbiamo stabilito. Automatica: viene dall’utilizzo di un calcolatore. Pallottoliere: antenato del calcolatore

  • Informazione
  • Rappresentazione dell’informazione
  • Elaborazione dell’informazione

Anche il calcolatore, come il pallottoliere, è un oggetto finito. Tutto ciò che rappresentiamo all’interno di un calcolatore è una sequenza di 0 e 1 (bit) sotto una certa codifica. I gruppi di otto 0 o 1 si chiamano byte e sono l’unità di informazione. All’interno del computer c’è la CPU, che è un esecutore che da qualche parte ha scritte delle regole. Architettura di Von Neumann

  • RAM: memoria principale. Parte nella quale vengono rappresentate sia le rappresentazioni dei dati in binario, sia le rappresentazioni degli algoritmi sempre in binario. È una memoria molto veloce ma è anche volatile, quando spengo il computer tutto quello che c’è dentro viene resettato. E’ importante che sia grande per accedervi più rapidamente.
  • Il processore CPU: legge e scrive la memoria principale e anche le istruzioni su come manipolarli e modificarli.
  • BUS: permette al processore di leggere e scrivere.
  • Memoria secondaria. Memoria che riesce a memorizzare gli 0 e gli 1, più lenta, meno costosa della RAM, più capiente e consistente. Importante che sia grande per memorizzarci tutto quanto. Memoria che contiene tutti i file presenti sul computer. Unità di ingresso: qualsiasi cosa che da informazioni verso la CPU e il computer. Mouse, scanner, tastiera... Unità di uscita: tutto ciò che esce, schermo, scheda di rete...

2 Lezione 2 - Conversioni basi numeriche e concetti

di programma e algoritmo (20 settembre 2022)

Tutta l’informazione presente sul computer deve essere memorizzata in forma bi- naria, come sequenze di 0 ed 1. Rappresentazione posizionale.In queste rappresentazioni una cifra contribui- sce con un valore diverso al numero a seconda della posizione in cui si trova. Un numero è rappresentato da una sequenza finita di cifre di un certo alfabeto.

Un modo semplice per convertire in base b è effettuare una sequenza di divisioni intere fino ad ottenere quoziente 0. Un numero naturale è un oggetto matematico, che puo essere rappresentato me- diante una sequenza di simboli di un alfabeto fissato. Il numero 12 può essere rappresentato in diversi modi:

  • Numerazione romana = XII
  • Rappresentazione decimale posizionale = 12
  • Rappresentazione binaria posizionale = 1100 ( 23 + 22 + 01 + 00 =8+4)

Un numero è rappresentato da una sequenza finita di cifre di un certo alfabeto: Cn− 1 Cn− 2... C 1 − 0 = Nb dove Cn− 1 è detta cifra più significativa e C 0 è detta cifra meno significativa.

Conversione da base 10 a base X:

  • Conversione di (8) 10 a base 2: 8/2 quoziente=4 resto=0; 4/2 quoziente= resto=0; 2/2 quoziente=2 resto=0; 1/2 quoziente=0 resto= Risultato=
  • Conversione (8) 10 a base 8: 8/8 quoziente=1 resto=0; 1/8 quoziente=0 resto= Risultato=
  • Conversione (8) 10 a base 16: 8/16 quoziente=0 resto= Risultato=

Conversione da base X a base 10:

  • Conversione di (1000) 2 a base 10: 0 ∗ 20 + 0 ∗ 21 + 0 ∗ 22 + 0 ∗ 23 = 8
  • Conversione di (10) 8 a base 10: 0 ∗ 80 + 1 ∗ 81 = 8
  • Conversione di (8) 16 a base 10: 8 ∗ 168 = 8

Conversione da base X a base 2:

  • Conversione di (21) 8 a base 2: dato che voglio passare da base 8 a base 2 e 8 in base 2 è 23 avrò bisogno di 3 cifre per ciascuna cifra del numero che voglio convertire. Quindi la prima cifra di 21 è 2: 2/2 quoziente=1 resto=0; 1/2 quoziente= resto=1. Risultato=10. Aggiungo uno 0 davanti per avere le 3 cifre, quindi 2 diventa
    La seconda cifra di 21 è 1: 1/2 quoziente=0 resto=1. Risultato=1. Aggiungo due 0 davanti per avere le 3 cifre, quindi 1 diventa 001. Unisco le due cifre →010 + 001 = (21) 8 = 010001 in base 2
  • Fase di elaborazione dei dati in ingresso: si presenta il problema (immagine della folla)
  • Elaborazione: elabora i dati (ricerca del volto del terrorista nell’immagine)
  • Dati in uscita (si e no come risposta se trovo il terrorista o no)

Programmazione imperativa: trovare un algoritmo che segua una procedura sequenziale. Approccio simile alla procedura per la ricetta di una torta. Sequenza finita di azioni elementari che il calcolatore è in grado di effettuare. Lo stesso algorit- mo può essere rappresentato mediante diversi linguaggi. Nell’intelligenza artificiale invece si crea un modello matematico del nostro cervello. Modello di calcolo che viene addestrato per imparare come impariamo noi. Esempio: il cuoco scrive una ricetta come una serie di passi elementari da ese- guire uno dopo l’altro. Il cuoco è il programmatore. Noi seguiamo questa lista pedissequamente. Algoritmo (def.) Sequenza di passi non ambigui che trasforma i dati iniziali in dati finali utilizzando un insieme di azioni elementari che possono essere eseguite da un opportuno esecutore. Programma (def.) Specifica di un algoritmo utilizzando... Cosa è l’informazione? Tutto ciò che si trova all’interno di un computer viene rappresentato in maniera binaria. Cosa viene manipolato da un calcolatore:

  • I numeri che siamo abituati a rappresentare all’interno del nostro computer hanno 3 rappresentazioni differenti.
  • I caratteri: tabella di corrispondenza a cui a ciascun carattere viene associata una rappresentazione binaria.
  • Stringhe: sequenze di caratteri
  • Immagini
  • Suoni
  • Programmi: jpeg, png sono standard di codifica che fanno in modo che la nostra immagine venga rappresentata in binario. Immagine viene divisa in piccolissimi puntini, pixels, più ce ne sono meglio è. A ciascun colore secondo la codifica rgb vengono associati 3 numeri.

Numeri naturali: numeri che vanno da 0 a infinito.

3 Lezione 3 - Introduzione 2 (23 settembre 2022)

Python è un linguaggio che si definisce formale: linguaggio molto rigido, definito da una grammatica non ambigua. È anche un linguaggio ad alto livello: possiamo rappresentare sia le informa- zioni che gli algoritmi senza ricorrere al linguaggio binario oppure a informazioni che sono molto legate alla macchina sottostante.

L’interprete di python legge quello che noi abbiamo scritto (la frase nel linguaggio formale) e la traduce in un gruppo di operazioni elementari equivalenti in linguaggio macchina. Un file che contiene un programma python si chiama script. Bug: errore Debugging: operazione di ricerca degli errori in un programma. Vari tipi di errori:

  • Errori di sintassi
  • Errori di esecuzione: anche chiamati eccezioni (es 0 diviso 0)
  • Errori semantici: il programma funziona ma non fa quello che dovrebbe fare. Token: elementi costitutivi delle frasi del linguaggio. Elementi che vanno combinati nella maniera corretta per creare una frase. Il processo di analisi sintattica dell’interprete python si chiama parsing. Si va a creare un albero sintattico a partire dalla grammatica formata. Se c’è un problema viene segnalato in quale punto, in quale token, c’è un errore. Quando si usano linguaggi formali dobbiamo essere sempre molto precisi: se il linguaggio formale si aspetta un "a capo" dobbiamo andare a capo. Spesso molti errori sono dovuti a dettagli.
  • Il valore 5 è un valore intero (interi= numeri naturali più i negativi). type int.
  • "hello world" è una stringa perché è una sequenza di caratteri racchiusa da apici. type str
  • type: funzione che ci permette di estrarre il tipo di un valore
  • python mette a disposizione anche i numeri reali detti float (quelli con la virgola).
  • Assegnamento: un solo = tra un nome e un valore
  • Uguaglianza: due ==

4 Lezione 4 - Istruzioni ed espressioni (27 settembre

Istruzioni: possono esser combinate per combinare il nostro algoritmo. Abbiamo visto l’istruzione di assegnamento, la print e la type. Ci sono istruzioni come while e for che permettono di eseguire un’istruzione più volte. Istruzioni che permettono di scegliere come if e import che permette di inserire da tastiera. Un’istruzione è un ordine per l’interprete. Espressioni: l’espressione è una combinazione di valori e operatori esattamen- te come gli operatori matematici. Quello che fa l’interprete python di fronte ad un’espressione è quello di valutare il valore della funzione e poi stampare il risultato. Funzione len che serve per ottenere una lunghezza, ad esempio di una stringa se applicata ad una stringa. Se è presente una variabile in una espressione allora si prende il valore della variabile e si sostituisce alla chiamata.

Istruzione di input: istruzione che permette di farci dire qualcosa dall’utente, da tastiera. Restituisce sempre delle stringhe e permette di interagire con l’utente.

5 Lezione 5 - Costrutto FOR (30 settembre 2022)

Turtle: modulo di Python che permette di disegnare sullo schermo. import: istruzione che ci permette di importare un modulo di python che vogliamo utilizzare. Significa importare una nuova rappresentazione di un dato. Python è un linguaggio a oggetti. Quando importate un nuovo modulo impor- tate un nuovo tipo di dato e avete una serie di istruzioni elementari per lavorare con questo nuovo tipo di dato. Queste istruzioni elementari si chiamano metodi. Come definire una variabile che contiene questo nuovo tipo, ovvero un pennello per disegnare. time: modulo che permette di gestire il tempo all’interno del nostro programma. Facciamo in modo che il disegno avvenga in modo più lento. Funzione sleep che accetta un parametro che è il numero di secondi in cui il nostro programma si ferma prima di iniziare e andare avanti. Questo ci permette di vedere con più lentezza ogni passaggio del nostro programma e di vedere come si muove la freccia per fare il disegno. Alex: oggetto che ha dei metodi, ovvero delle operazioni che sa fare, come forward e left. Costrutto for: ci permette di iterare un certo insieme di istruzioni. Gli diamo una lista che contenga quanti valori quante sono le volte che vogliamo eseguire una serie di istruzioni. for è una parola riservata, non può essere usata come nome di variabile o altro. Il for è costituito da 3 parti:

  1. Nome di variabile, variabile di iterazione, loop variable. Questa variabile inte- ragisce con quello che viene dopo l’altra parola chiave, in
  2. In: parola chiave che indica che andiamo a lavorare dentro qualcosa
  3. Indica quali valori può prendere la variabile di interazione. Le parentesi quadre sono un costrutto di python che permettono di fare una lista di valori sui quali vogliamo lavorare.

Tutto quello che si trova nelle linee successive, spostato di un tab verso dx, rappresenta l’insieme di istruzioni che devono essere eseguite. Le linee 2 e 3 vengono eseguite 7 volte, una volta per ciascun valore contenuto nella lista. Istruzione break: interrompe il programma nel punto in cui viene messa. Istru- zione continue: anche se dopo c’è un’altra istruzione che dovrebbe essere ripetuta, quello che fa è far ripartire dall’inizio il ciclo for. Diagramma di flusso: modo per rappresentare un algoritmo.

  • Romboide: permette di fare domande e prendere decisioni in base alle risposte.
  • Quadrato: azione elementare che deve essere eseguita. Per specificare una lista che parte da 0 è va fino a n-1 è possibile utilizzare la funzione range: range(4)→va da 0 a 3 perché fa 0,1,2,3.

Funzione che permette anche di specificare che non vogliamo partire da 0 →range(1,5). Il primo numero è da dove partiamo (incluso), il secondo è dove arriviamo (escluso), quindi andiamo da 1 a 4. range(0,19,2) →il terzo numero indica il passo che ci dice il passo con cui dob- biamo contare. Questi numeri vanno da 0 a 19 con passo 2 quindi [0, 2, 4, 6, 8, 10, 12, 14, 16, 18].

6 Lezione 6 - Moduli Screen, Math e Random (

ottobre 2022)

Modulo Screen: mette a disposizione uno schermo. Modulo definito all’interno del modulo turtle. Modulo Math: permette di utilizzare funzioni matematiche. Modulo che non mette a disposizioni oggetti nuovi come lo schermo o la turtle, ma mette solo a disposizioni le funzioni matematiche più comuni. Nome modulo +. + nome della funzione all’interno della libreria →math.pi Es: print(math.pi)

Modulo random: permette di generare delle sequenze di numeri pseudo casuali.

  • random.random(): ritorna un numero con la virgola nell’intervallo [0.0, 1.0)
  • random.randrange(x,y): genera un intero tra il suo argomento più basso e quello più alto

Il primo numero della sequenza (si chiama SEME) viene deciso e poi quelli successivi vengono generati in maniera casuale. Tra le funzioni messe a disposizione dal modulo random, c’è anche la funzione seed che permette di definire il seme. Con il valore seed (seme) vengono avviati degli algoritmi pseudo-random e funzionano che ogni volta che chiediamo un nuovo numero ne otterremo uno basato sul seed corrente. Il seed è un attributo del gene- ratore. Se eseguiamo due volte con lo stesso seed, la sequenza di numeri che verrà generata a partire da quel seed sarà sempre la stessa

7 Lezione 7 - Esercizio Turtle (4 ottobre 2022)

Funzione: sequenza di istruzioni raggruppate insieme Esercizio Tartaruga a questo link.

1 import turtle 2 # vogliamo definire una funzione che disegni sullo schermo un quadrato che parte da una certa posizione della tartaruga 3 def drawSquare (t , sz ) : # parametro formale t che e ’ la nostra tartaruga 4 # parametro formale sz che e ’ il lato del quadrato 5 """ Make turtle t draw a square of with side sz. """ 6 for i in range (4) : # vogliamo ripetere per 4 volte , quindi da 0 a 3

di seguito invece di return y c’è print(y). Il valore y viene comunque restituito però non possiamo più utilizzarlo successivamente, infatti otterremo None.

1 def square ( x ) : 2 y = x * x 3 print ( y ) # Bad! should use return instead! 4 toSquare = 10 5 squareResult = square ( toSquare ) 6 print ( " The result of " , toSquare , " squared is " , squareResult )

Sia le variabili che i parametri all’interno di una funzione sono detti parametri locali, quindi li possiamo utilizzare dentro la funzione e vengono buttati via alla fine dell’esecuzione della funzione stessa. La variabile x è locale, e non può essere utilizzata quando usiamo delle istruzioni nel global frame o non nel frame della funzione. Le variabili definite a livello globale sono dette variabili globali e sono definite nel frame globale. In questo esempio non abbiamo solo le variabili locali all’interno di badsqua- re(), ma anche delle variabili globali come power (ERRORE: DA NON FARE ASSOLUTAMENTE).

1 def badsquare ( x ) : 2 y = x ** power 3 return y 4 power = 2 5 result = badsquare (10) 6 print ( result )

Se è presente sia una variabile globale che una locale con lo stesso nome, l’inter- prete python cerca all’interno del frame partendo dal basso, quindi quella locale si dice che fa ombra (shadow) alla variabile globale. Stack: nella visualizzazione più tradizionale cresce verso l’alto, quindi si dice che sono impilati.

Funzioni che chiamano altre funzioni Scomposizione funzionale: processo di dividere un problema in sotto-problemi più piccoli. Le funzioni sono anche molto utili quando vogliamo scrivere del codice che sia più generale. Quando scrivo un codice più generale dobbiamo scrivere più cose perché dobbiamo tenere in considerazione più cose. Dobbiamo fare attenzione a non scrivere un codice troppo generale. Esiste per l’appunto una tecnica usata nel software engineering chiamata pro- grammazione estrema che consiste nello scrivere sempre e comunque ciò che serve e mai troppo in generale. Si possono utilizzare delle funzioni per aiutarci a fare il testing. Ad esempio c’è la funzione testEqual che possiamo utilizzare per andare a vedere se due cose sono uguali. (Funzione non più disponibile!)

1 def testEqual (x , y ) : 2 if x == y : 3 print ( " Pass " ) 4 else : 5 print ( " Not Passing " ) 6 # qui stiamo stampando invece di generare un ’ eccezione e interrompere l ’ esecuzione

9 Lezione 9 - Algebra di Boole (10 ottobre 2022)

Un’algebra è un insieme di valori, di operazioni che si possono fare tra questi valori e un insieme di proprietà che sono soddisfatte da queste operazioni (esempio proprietà commutativa: A+B = B+A). Boole ha studiato un’algebra che rappresenta i valori di verità. Algebra diversa da quella descritta ora ma ha le stesse proprietà. Nella sua algebra i valori che abbiamo sono solo 2: true, false. Le operazioni sono not (negazione), and e or. Sono tutte operazioni che ci dicono come si possono combinare i valori. not: negazione a not risultato F T not(F)=T T F not(T)=F and: è vero quando le due condizioni messe nell’and sono vere entrambe. a b and F F F F T F T F F T T T or: vera quando uno dei due è vero, o anche quando sono veri tutti e due. a b or F F F F T T T F T T T T proprietà associativa: a & (b & c) = (a & b)& c proprietà commutativa: a & b=b & a

1 print ( type ( True ) ) # cosi e ’ un valore di verita ’ 2 print ( type ( " True " ) ) # e ’ una stringa

Un’espressione che ha come risultato solo vero o falso è un’espressione booleana.

10 Lezione 10 - Costrutto IF-ELSE (11 ottobre 2022)

Istruzioni condizionali Costrutto IF-ELSE: permette di scegliere tra 2 strade in base ad una condizione. Esempio:

1 x = 15 2 if x % 2 == 0: # parola chiave if + espressione booleana ( detta anche condizione ) 3 # L ’ espressione viene valutata : se e ’ vera si esegue cio ’ che e ’ presente al suo interno dopo i due punti , altrimenti si va a eseguire cio ’ che sta dopo i due punti della parola chiave ELSE. 4 print (x , " is even " ) 5 else : 6 print (x , " is odd " )

Un errore possibile all’interno del ciclo while è quello di scrivere programmi che non terminano. Il problema della terminazione è un problema famosissimo, studiato anche da Alan Turing già negli anni 30 del 900, ed è praticamente il primo problema che è stato dimostrato di essere insolubile. È stato dimostrato che i programmi che si possono scrivere sono tanti quanti i numeri naturali, i problemi invece sono tanti quanti i numeri reali, quindi molti di più. Questo problema di terminazione non si può fare perché si genera un paradosso logico. Il ciclo while è più complesso ma più potente.

12 Lezione 12 - 17 ottobre 2022

Con il return possiamo ritornare anche 3 valori ad esempio. Il return mi restituirà una ennupla. Es: return somma, massimo, minimo Se eseguo il risultato sarà della forma: (202 98 -23)

13 Lezione 13 - Prima Esercitazione (18 ottobre

14 Lezione 14 - Esercizi in classe (21 ottobre 2022)

15 Lezione 15 - Ricorsione (24 ottobre 2022)

Ricorsione: una funzione ricorsiva è una funzione che effettua una chiamata a sé stessa. Definizione induttiva: dice quale è il primo elemento e poi ti dice come calcolare gli altri elementi partendo dal primo. Fattoriale: n!: caso base passo induttivo 1 n*(n-1)! Questo è un primo esempio di ricorsione perché questa seconda definizione riusa sé stessa al suo interno. Sommatoria: Somma(n): caso base passo induttivo 1 n + Somma(n-1) Seconda definizione ricorsiva perché riusiamo la somma.

16 Lezione 16 - Seconda esercitazione (28 ottobre

17 Lezione 17 - Stringhe (4 novembre 2022)

Le stringhe, così come le liste, sono già strutture più complesse, chiamate col- lezioni. Sono insiemi con un ordinamento, che possono essere trattati in maniera univoca o si può andare a pescare elementi al loro interno. Stringa vuota: collezione senza nessun elemento.

  • Il + concatena due stringhe
  • Il * ha lo stesso risultato della moltiplicazione tra numeri. Quando facciamo un * tra stringhe facciamo una concatenazione di quella stringa un numero di volte pari a quello che inserisco.
  • Le parentesi quadre, con all’interno un numeretto, ci permettono di andare a selezionare uno degli elementi della collezione.
  • Le posizioni possono essere viste da sinistra verso destra partendo da 0, oppure da destra verso sinistra partendo da -1.

Operatore slice [n:m]→ritorna la parte della stringa dall’n-esimo carattere all’m- esimo, includendo il primo ma escludendo l’ultimo. Operatore in e not in →operatore in controlla se una stringa sta in un’altra stringa:

1 " heck " in " I ’ ll be checking for you. " # vale True. 2 " cheese " in " I ’ ll be checking for you. " # vale False

Le stringhe sono in realtà degli oggetti sui quali ci sono dei metodi messi a disposizione per lavorarci. Metodo upper: trasforma tutti i caratteri della stringa in lettere maiuscole Metodo lower: trasforma tutti i caratteri della stringa in lettere minuscole Essendo metodi si chiamano così:

1 ss = " Hello , World " 2 print ( ss. upper () ) 3 4 tt = ss. lower () 5 print ( tt )

18 Lezione 18 - Liste (7 novembre 2022)

Una lista è una collezione sequenziale di valori Python, dove ogni valore è iden- tificato da un indice. Le liste si scrivono con le parentesi quadre, all’interno delle quali possono anche essere scritte delle espressioni. Differenze stringhe – liste:

  • Nelle stringhe tutti gli elementi sono dello stesso tipo.

Tuple: hanno la caratteristica delle stringhe di essere NON mutabili. Dob- biamo creare una copia per modificarla. Hanno la caratteristica delle liste di poter contenere elementi di tipo diverso. Le tuple in realtà sono la struttura di dati fornita da Python per raccogliere informazioni su un gruppo di oggetti che condivi- dono un insieme di attributi comuni. Oltre a record, si usa anche campo o field. Possiamo usare l’operatore di indi- cizzazione [i] per andare a prendere un campo di una tupla. Altro esempio:

1 julia = ( " Julia " , " Roberts " , 1967 , " Duplicity " , 2009 , " Actress " , " Atlanta , Georgia " ) 2 print ( julia [2]) 3 print ( julia [2:6]) 4 print ( len ( julia ) ) 5 # si usa la concatenazione per andare a sostituire film e nome del film all ’ interno della tupla 6 julia = julia [:3] + ( " Eat Pray Love " , 2010) + julia [5:] 7 print ( julia )

Per creare una tupla soltanto col numero 5, dobbiamo scriverla con la virgola perché altrimenti per l’interprete python è un intero.

1 tup = (5 ,) # questa e ’ una tupla 2 print ( type ( tup ) ) 3 x = (5) # questo e ’ un intero 4 print ( type ( x ) )

L’assegnamento funziona anche con le tuple e permette a una tupla di variabili a sinistra di ottenere i valori della tupla di destra. Una funzione può anche ritornare una tupla mettendo le variabili tra parentesi tonde:

1 def circleInfo ( r ) : 2 # Return ( circumference , area ) of a circle of radius r. 3 c = 2 * 3.14159 * r 4 a = 3.14159 * r * r 5 return (c , a ) 6 print ( circleInfo (10) )

20 Lezione 20 - Debugging [Guidi 1](11 novembre

Ci sono 3 tipi di errori che possono succedere:

  1. Errori di sintassi. La sintassi si riferisce alla struttura del programma e alle regole per scriverlo correttamente.
  2. Errori di esecuzione. Gli errori di esecuzione sono così chiamati perché appaiono solo quando il programma viene eseguito. Questi errori sono anche chiamati eccezioni perché indicano che qualcosa di eccezionale (e negativo) è accaduto.
  1. Errori semantici. Se c’è un errore semantico, il codice verrà eseguito senza che il computer riporti errori, ma il risultato del programma non sarà corretto. Il programma calcola qualcosa di diverso da quello che ci aspettiamo. Tuttavia l’interprete sta facendo quello che gli abbiamo chiesto di fare.

I bug all’interno di un programma possono determinare un blocco del software o in alcuni casi un crash. E’ necessario per lo sviluppatore, trovare e correggere i bug. Un debugger è un programma che permette di eseguire un altro programma P in ambiente protetto. Il tipo di debugger più utilizzato generalmente è il debugger a runtime che consente la ricerca dei bug tramite funzionalità standard come brea- kpoint, control point o vista da watch.

E’ possibile fermare P durante la sua esecuzione per ispezionare:

  • il contenuto delle varibili
  • i frame delle funzioni/metodi nell’ambiente
  • capire dove c’è stato un problema (ritornato tramite un’eccezione)
  • molto altro

Il debugger permette di fissare dei "punti di fermata" (breakpoint) nel programma. Si può richiedere di eseguire:

  • fino ad un punto di fermata
  • una istruzione alla volta entrando o meno nelle funzioni e nei metodi (solita- mente detto step into o next)
  • fino al verificarsi di una condizione

Il debugging in Python è facilitato dall’utilizzo del modulo pdb (python debug- ger) che definisce un debugger interattivo. Il modulo pdb supporta breakpoints, avanzamento riga per riga, source code, valutazione del codice python.

Funzioni:

  • run(statement[,globals[,locals]]). Esegue l’istruzione statement (passata come stringa) sotto il controllo del debugger. Gli argomenti facoltativi globals e locals specificano l’ambiente nel quale il codice viene eseguito. Se non spscificato viene utilizzato il dizionario del modulo main.
  • runeval(expression[,globals[,locals]]. Valuta l’espressione expression (for- nita come stringa) sotto il controllo del debugger. Quando termina, questa fun- zione restituisce il valore dell’espressione. Altrimenti questa funzione è simile a run().
  • runcall(function[, argument, ...]). Esegue la funzione function con gli ar- gomenti forniti. Quando runcall() termina, la funzione restituisce qualunque cosa venga restituito dalla funzione chiamata. Il prompt del debugger appare al momento dell’entrata nella funzione.