

























































Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
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
1 / 65
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!


























































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
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
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:
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 da base X a base 10:
Conversione da base X a base 2:
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:
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:
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:
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.
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.
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.
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:
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:
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 debugger permette di fissare dei "punti di fermata" (breakpoint) nel programma. Si può richiedere di eseguire:
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: