Programmazione in Python Lezioni
Programmazione in Python Lezioni
in Python
Lezione 1
Python
• Linguaggio di programmazione di alto livello
• Sviluppato agli inizi degli anni ’90 da Guido Van Rossum
• Pensato per programmare velocemente e modificare i programmi
altrettanto velocemente
• Oggi è uno dei linguaggi più largamente utilizzati
• Accademia, applicazioni professionali, ecc.
• Sintassi più semplice di altri linguaggi
Useremo Python3
• Portabilità
Fasi dell’attività di programmazione
Codice
Sorgente Segnala messaggi di errori di sintassi
EDITOR DI
TRADUTTORE
TESTI
Scrivere il programma in un
linguaggio di alto livello
Programma eseguibile
Byte Code
Librerie
Segnala messaggi durante l’esecuzione
Python Virtual
Input dell’utente Machine
• Eseguire il programma
• Come fare dipende dall’ambiente utilizzato
• Viene eseguito usando l’interprete Python
• Shell interattiva
HELLO WORLD!
Programma
• Contiene istruzioni o enunciati
• Vengono tradotti ed eseguiti dall’interprete Python
• Attenzione alla distinzione tra maiuscole e minuscole
• Esempio: posso scrivere print(‘Ciao’) ma non Print(‘Ciao)
• Attenzione alla indentazione
• Gli enunciati all’interno di uno stesso blocco devono iniziare alla stessa
colonna
print(‘HELLO WORLD!’)
print(‘Non va bene’)
Errori
• Errori di sintassi
• Riconosciuti durante la fase di compilazione
• Non consentono la generazione del programma eseguibile
• Errori di esecuzione (o logici)
• Il programma eseguibile viene creato
• Una volta eseguito il programma termina inaspettatamente producendo
un’eccezione (ad esempio quando si divide per zero) oppure
• Produce un risultato inaspettato
• Segnale che qualcosa non va nella logica del programma
Il mio primo programma
Commento
>>> i=7
Operazione di
>>> t=s assegnamento
Quando si assegna un valore ad una variabile si effettua una operazione di assegnamento
La prima volta che si effettua questa operazione si parla di inizializzazione
Variabili
Quando in una istruzione (non di assegnamento) si incontra una
variabile, l’interprete cerca il valore associato alla variabile e si parla di
riferimenti ad una variabile
>>> a=32
Riferimenti ad a e b
>>> b=27 Cerca il loro valore e calcola il
>>> a+b risultato
59
Nomi di Variabili
• Devono iniziare con una lettera o un _
• Possono contenere lettere, cifre e altri caratteri di sottolineatura
• N1, pippo_7, io_sono_una_variabile
• Spesso si usa la forma cammellare
• ioSonoUnaVariabile
• Alcune parole sono riservate e non possono essere usate come nomi
• Case sensitive
• Pippo è diverso da pippo
Programmazione
in Python
Lezione 2
Ripassiamo commento utilizzato per
documentare il programma
File area.py
##
# questo programma calcola l'area di un
# triangolo avente base e altezza fissate
L’area è 6.0
base=3
Inizializzazione altezza=4 Commento di fine riga
delle variabili print("l'area è",base*altezza/2) # calcolo e stampo l’area
base e altezza
base=3
altezza=4
# calcolo e stampo l’area
print("l'area è",base*altezza/2)
• Python fornisce moltissimi funzioni utili, per gli scopi più vari
• Sono organizzate in librerie chiamate Moduli
• Es. il modulo math
• Per essere utilizzate devono essere importate dai rispettivi moduli
• Si può importare tutto il modulo
>>> import math Qui il nome della funzione va preceduto dal
qualificatore math seguito da .
>>> x=math.sqrt(16)
• Si possono importare solo le funzioni di interesse
>>> from math import sqrt,log10
>>> x=sqrt(16) Notare la differenza
>>> z=log10(100) nell’invocazione di sqrt
Funzioni e Moduli
• Si può consultare l’elenco delle risorse contenuto in un modulo
>>> import math
>>> dir(math)
['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos',
'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'comb',
'copysign', 'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp',
'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma',
'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt',
'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'perm',
'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan',
'tanh', 'tau', 'trunc']
Sono espressioni booleane, ossia espressioni il cui risultato può essere vero o falso (valore di
verità)
Enunciato composto
Se la condizione espressa
dalla condizione è vera
Semantica vengono eseguite tutte le
istruzioni presenti nel blocco,
altrimenti vengono ignorate
L’enunciato if
Sintassi:
selezione a due vie
selezione a una via
if condizione:
if condizione: blocco di istruzioni 1
blocco di istruzioni 1 else:
blocco di istruzioni 2
Esempio:
if voto >= 18:
print('complimenti! Hai superato l’esame')
else:
print('peccato! Riprova al prossimo appello')
Esercizio 1
• Scrivere un programma Python che dato in input un numero N,
verifica se N è pari
"""
File pari.py questo programma verifica se un numero N
preso da input è pari
"""
massimo=a
if massimo<b:
massimo=b
if massimo<c:
massimo=c E se fossero 5?
if massimo<d: Oppure 100?
massimo=d E se fossero N?
• Iterazione definita
• le azioni vengono ripetute un determinato numero di volte
• Es. ripeti le azioni N volte
• Iterazione indefinita
• le azioni vengono ripetute fintantoché durante l’esecuzione una certa condizione è vera
• Es. ripeti finché numero > 0 dove numero cambia durante l’esecuzione
• Enunciati di Iterazione
• for
• while
Ripetere istruzioni - L’enunciato while
E’ la prima riga
Intestazione dell’enunciato, termina
sempre con :
Enunciato composto
Gruppo di una o più
istruzioni tutte incolonnate
Blocco di enunciati
più a destra rispetto
all’intestazione
Fintantoché la condizione
espressa nell’intestazione è
Semantica vera, tutte le istruzioni
presenti nel blocco,
vengono ripetute
Il ciclo while
FALSO
Condizione
Sintassi:
VERO
Blocco di
while condizione:
istruzioni 1
blocco di istruzioni
Diagramma di flusso
Attenzione tra le istruzioni nel blocco ce ne devono essere alcune che aggiornano i
dati coinvolti nella condizione in modo che prima o poi la condizione diventa falsa e
si può interrompere la ripetizione.
Un ciclo progettato male può portare ad un numero di iterazioni «teoricamente»
infinito
Esercizio – il massimo tra N interi
N=int(input("Quanti interi vuoi confrontare ")) La condizione del
ciclo dipende dal
massimo=int(input("inserisci il primo numero "))
valore della
variabile cont
cont=1
while cont < N:
a = int(input("inserisci un altro numero "))
if massimo<a: La variabile cont
massimo=a viene aggiornata
cont=cont+1 all’interno del ciclo
Le istruzioni nel
print("Il massimo è",massimo)
blocco vengono
ripetute fino a Ciclo regolato da
quando cont non contatore
raggiunge N
Ciclo regolato da contatore
• L’esempio precedente mostra l’utilizzo di un ciclo while controllato da
una variabile contatore
• Questo accade quando le istruzioni devono essere ripetute un
determinato numero di volte e quindi è necessario contare le
iterazioni (iterazione definita)
Inizializzazione
cont=1 del contatore
while cont <= 10:
print(cont,end=' ') Condizione che dipende
cont=cont+1 dal valore del contatore
Aggiornamento
Stampa del contatore
1 2 3 4 5 6 7 8 9 10
Esercizi
• Scrivere un programma che stampa la somma di N numeri presi da
input
• Scrivere un programma che stampa la media di N numeri presi da
input
• Scrivere un programma che presi da input N numeri interi stampa la
somma di tutti i numeri positivi e la somma di quelli negativi
Ciclo controllato da un valore sentinella
Esercizio: Scrivere un programma che legga da input una sequenza di numeri interi
e ne stampi la somma. La lettura dei numeri in input deve andare avanti fino a
quando non viene introdotto il valore 0. Notare il punto in cui
il primo valore della
sequenza viene
somma=0
preso da input
a=int(input("inserisci un numero (0 per terminare): "))
while a!=0:
somma=somma+a
a=int(input("inserisci un numero (0 per terminare): "))
print("La somma è",somma)
inserisci un numero (0 per terminare): 10
inserisci un numero (0 per terminare): -15
0 è il valore sentinella inserisci un numero (0 per terminare): 15
inserisci un numero (0 per terminare): 0
Serve per indicare che la sequenza in input termina
La somma è 10
• Le istruzioni nel blocco vengono ripetute
fino a quando non si verifica un determinato
Ciclo evento (iterazione indefinita)
• Non si conosce a priori il numero di iterazioni
controllato che saranno effettuate
da un evento • Ad esempio, un ciclo regolato da un valore
sentinella è un caso di iterazione indefinita
Esercizio: Algoritmo di Euclide per il calcolo del
MCD tra due interi N ed M
Ripetere le seguenti istruzioni finchè M è diverso da 0
• Calcolare il resto della divisione tra N ed M
• Sostituire N con M
• Sosituire M con il resto
Il MCD sarà dato dall’ultimo valore di N
N=int(input("introduci un numero intero"))
M=int(input("introduci un altro intero"))
while M!= 0:
resto=N%M
N=M
M=resto
print("Il MCD è:",N)
Hand Tracing
• Nella fase di sviluppo di un programma, per verificarne il corretto
funzionamento, si può utlizzare la tecnica di Hand-Tracing
• Molto utile quando le istruzioni devono essere ripetute un determinato numero di volte
• Ad esempio, come nei cicli regolati da contatore
• L’utilizzo del for può essere legato all’utilizzo della funzione range
• range genera una sequenza di numeri interi
• Può essere invocata con uno, due oppure tre argomenti
• con un argomento Y, genera tutti i numeri interi da 0 a Y-1
• range(4) genera 0 1 2 3
• Con due argomenti X e Y, genera tutti i numeri compresi tra X e Y-1
• range(1,4) genera 1 2 3
• Con tre argomenti X, Y e P genera valori compresi tra X e Y-1 con un incremento di P tra un valore e
l’altro
• range(1,4,2) genera 1 3
• range(4,0,-1) genera i valori tra 4 e 1 in ordine decrescente 4 3 2 1
Il ciclo for
• Sintassi
for variabile in range(…):
blocco di istruzioni
dado1=randint(1,6)
dado2=randint(1,6)
print(dado1, dado2)
43
Stringhe
• Una stringa, diversamente da un numero intero, è una struttura dati
• è composta da una sequenza di caratteri
>>> frase="Natale si avvicina"
• La funzione len può essere utilizzata per conoscere la sua lunghezza
>>>len(frase) 18
• I caratteri sono numerati in base alla loro posizione nella stringa, partendo dal
primo che ha indice 0
N a t a l e s i a v v i c i n a
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
>>> primaOccorrenza=stringa.find("bla")
>>> print("La prima occorrenza di bla parte dall’indice",primaOccorrenza)
• Le stringhe sono sequenze di caratteri e perciò possono contenere lettere dell’alfabeto oppure cifre.
• Esistono dei metodi per analizzare e riconoscere la presenza di lettere e cifre all’interno delle
stringhe.
• Esempi:
• isalpha() restituisce true se la stringa è non vuota e contiene solo lettere
• isdigit() restituisce true se la stringa è non vuota e contiene solo cifre
• isalnum() restituisce true se la stringa è non vuota e contiene solo lettere o cifre
• islower() restituisce true se la stringa è non vuota e tutte le lettere che contiene sono
minuscole
• isupper()simile ad islower()ma controlla che le lettere siano tutte maiuscole
Programmazione
in Python
Lezione 6
Per semplicità si supponga che per ogni giorno
Problema: le temperature venga indicato un solo valore e per il calcolo
della media si usi la divisione intera
• Struttura Dati:
• raggruppa e organizza diversi dati in un’unità
• Es. Una stringa è una struttura dati che raggruppa sequenze di caratteri
• Lista:
• Struttura dati
• Consente di memorizzare raccolte di dati di qualsiasi tipo (elementi)
• Gli elementi sono disposti in ordine sequenziale
• Ogni elemento ha un indice che identifica la sua posizione (il primo ha indice pari a 0)
Liste
• Sequenza di dati separata da virgole, racchiusi tra parentesi quadre
• [1,18,22,44]
• ["fondamenti", "analisi", "inglese", "economia"]
• [] (lista vuota)
• Può essere assegnata ad una variabile
>>> esami = ["fondamenti", "analisi", "inglese", "economia"]
>>> esami
['fondamenti', 'analisi', 'inglese', 'economia']
• Si può accedere agli elementi tramite la loro posizione (come nelle stringhe)
>>> esami[2]
ATTENZIONE
'inglese’ l’indice deve essere valido:
Se la lista contiene n elementi
l’indice deve essere compreso tra
0 e n-1
Liste
• Per conoscere il numero di elementi di una lista si può utilizzare la funzione len
>>> esami = ["fondamenti", "analisi", "inglese", "economia"]
>>> len(esami)
4
• Si possono estrarre parti di lista utilizzando l’operatore di subscript e i due punti (:)
>>> esami[1:3]
['analisi', 'inglese']
• Si possono concatenare liste con gli operatori + e *
• Si possini confrontare con l’operatore == (si noti che la lista [1,3] è diversa da [3,1])
• Si possono creare liste di liste
>>> esami2 = ["linguaggi", "fisica", "architettura"]
>>> [esami,esami2]
[['fondamenti', 'analisi', 'inglese', 'economia’],['linguaggi',
'fisica’, 'architettura']]
Liste
Liste e stringhe hanno alcune similitudini ma anche alcune differenze:
media=somma//ngiorni
for i in range(0,ngiorni):
elenco.append(int(input()))
somma+=elenco[i]
media=somma//ngiorni
-3.5
parole=['ciao','luce','scivolo’]
concatenazione=""
for stringa in parole:
concatenazione+= stringa
print(concatenazione)
ciaolucescivolo
Funzioni per le liste
• Calcolare il massimo o il minimo degli elementi di una lista
• Si possono usare le funzioni max e min che ricevono la lista e restituiscono il
massimo e il minimo degli elementi, rispettivamente
• Gli elementi devono essere tutti numeri o tutte stringhe
>>> L=[1.5,-2,-3]
>>> max(L)
1.5
>>> min(L)
-3
>>> stringhe=["casa blu","albero","macchina gialla", "novembre"]
>>> max(stringhe)
‘novembre’
>>> min(stringhe)
‘albero’
Massimo e Minimo
stringhe=["casa blu","albero","macchina gialla", "novembre"]
max=stringhe[0]
for i in range(1,len(stringhe)):
if stringhe[i]>max:
max=stringhe[i]
print(max)
'novembre'
for i in range(3):
for j in range(4): 0123
print(j,end=" ") 0123
print() 0123
Esercizio
• Letto da input un numero intero positivo X, stampa un quadrato di
lato X di simboli@ @@@@
• Esempio: se X è 4, il programma stampa @@@@
@@@@
@@@@
X=int(input())
for i in range(X):
for j in range(X):
print("@",end='')
print()
Esercizio
• Letto da input un numero intero positivo X, stampa un quadrato di
lato X di numeri consecutivi come nell’esempio
• Esempio: se X è 4, il programma stampa 1234
2345
3456
4567
X=int(input())
for i in range(X):
for j in range(1,X+1):
print(j+i,end='')
print()
Esercizio
• Data una lista di interi terminata dal tappo 0 verificare se esistono due
elementi uguali tra loro
elenco=[]
N=int(input())
while N!=0:
elenco.append(N)
N=int(input())
if duplicati:
print("Esistono elementi duplicati")
Tabelle / Matrici
• I dati vengono disposti in due dimensioni, righe e colonne
• Esempio Lun Mar Mer Gio Ven Sab
1 0 1 2 3 4 5
Storia Italiano Ed. Fisica Italiano Musica Matematica
2
0 1 2 3 4 5
3 Geografia Musica Ed. Fisica Matematica Italiano Arte
4 0 1 2 3 4 5
mat=[]
for i in range(N):
mat.append([])
for j in range(N):
mat[i].append(int(input()))
diagonale=True
for i in range(N):
for j in range(N):
if i!=j and mat[i][j]!=0:
diagonale=False
if diagonale:
print("Matrice Diagonale")
Programmazione
in Python
Lezione 9
Esercizio
• Data una matrice di interi di N righe e N colonne verificare se si tratta
di una matrice triangolare superiore.
Una matrice triangolare superiore è una matrice quadrata che ha tutti
gli elementi nulli sotto la diagonale principale
Diagonale
Principale 1 0 3 4 1 0 0 0
0 -2 5 9 0 -2 0 0
Elementi 0 0 0 1 4 6 0 0
nulli sotto la
0 0 0 81 1 0 0 81
diagonale
mat=[]
for i in range(N):
mat.append([])
for j in range(N):
mat[i].append(int(input()))
triangolare=True
for i in range(N):
for j in range(N):
if j<i and mat[i][j]!=0:
triangolare=False
if triangolare:
print("Matrice triangolare superiore")
Esercizio - Matrice Triangolare Superiore –
versione 2
N=int(input())
mat=[]
for i in range(N):
mat.append([])
for j in range(N):
mat[i].append(int(input()))
triangolare=True
for i in range(1,N):
for j in range(0,i):
if mat[i][j]!=0:
triangolare=False
if triangolare:
print("Matrice triangolare superiore")
Esercizio
• Data una matrice di interi di N righe e N colonne calcolare la somma
degli elementi della diagonale secondaria.
Diagonale
Secondaria
1 0 3 4
0 -2 5 9 Somma 21 (12+0+5+4)
28 0 0 1
12 1 5 81
Cosa fa questo programma?
N1=int(input())
N2=int(input())
p1=True
p2=True
for i in range(2,N1//2+1):
if N1%i==0:
p1=False
for i in range(2,N2//2+1):
if N2%i==0:
p2=False
else:
print("NO")
Cosa fa questo programma?
N1=int(input())
N2=int(input())
N1=int(input())
N2=int(input())
def valoreAssoluto(N):
if N<0:
return -N
return N
N1=int(input())
N2=int(input())
p1=True
p2=True
for i in range(2,N1//2+1):
if N1%i==0:
p1=False
Codice Ripetuto
for i in range(2,N2//2+1):
if N2%i==0:
p2=False
Dettagli che
complicano la
if p1 and p2 and (N1-N2 == 2 or N2-N1 == 2): lettura del codice
print("SI")
else:
print("NO")
Progettare con le funzioni
Costituiscono un meccanismo di astrazione con molti vantaggi
• Consentono di nascondere i dettagli complessi
• Es.: la verifica di numero primo è nascosta nella funzione
if numeroPrimo(N1) and numeroPrimo(N2) and valoreAssoluto(N1-N2)==2:
• Consentono di evitare codice ridondante o duplicato
• Consentono di realizzare metodi generali per risolvere classi di problemi
• Es.: Si specifica come verificare che un qualsiasi N sia primo e poi si applica alle istanze N1 e N2
• Consentono di scomporre il problema in sotto-problemi da risolvere
indipendentemente dal resto
• Es.: Verificare che un numero è primo, calcolare il valore assoluto di un numero.
• Le soluzioni dei sotto-problemi vengono poi composte, per ottenere la soluzione del problema di
partenza
Funzioni
• Sono sequenze di istruzioni con un nome
• Possono ricevere argomenti
• Possono restituire un valore
docstring:
Intestazione: Documenta la
Contiene il nome della funzione (quadrato) funzione
e un elenco di parametri (X) help(quadrato)
def quadrato(X):
''' restituisce il quadrato di un numero '''
return X*X
return: Corpo:
Istruzione che restituisce il valore Elenco di istruzioni
calcolato dalla funzione
Funzioni
• Sono sequenze di istruzioni con un nome
• Possono ricevere argomenti
• Possono restituire un valore
return espressione
Interrompe l’esecuzione della funzione
restituendo al chiamante il valore di
espressione
Passaggio di parametri
• Quando si invoca la funzione vengono create delle variabili per i parametri formali
• I parametri formali vengono inizializzati con i valori dei parametri attuali
• L’assegnamento avviene secondo l’ordine in cui appaiono
• Il primo parametro formale con il primo attuale, il secondo con il secondo e così via.
def areaDelTriangolo(B,H):
''' restituisce l’area del triangolo ''' I nomi dei parametri attuali e
return B*H/2 quelli dei parametri formali
potrebbero anche essere
base = float(input()) uguali
altezza = float(input())
area = areaDelTriangolo(base,altezza)
print(area)
• Quando la funzione termina le variabili che sono state create con l’invocazione della funzione
vengono eliminate
Return
• Può essere presente più volte, in percorsi diversi (ad esempio in un if e un else)
def numeroPrimo(N):
for i in range(2,N//2+1):
if N%i==0:
return False
return True
• Nelle funzioni che non restituiscono valori in genere l’istruzione return manca
• Si può comunque usare return per interrompere prematuramente la funzione
def stampaQuadrato(lato):
if lato < 0:
return
for i in range(lato):
for j in range(lato):
print("@",end='')
print()
stampaQuadrato(x)
Funzioni nei programmi
• Un programma può utilizzare una o più funzioni
• L’invocazione di una funzione deve avvenire dopo che la funzione è
stata definita
N = int(input())
N2 = quadrato(N)#qui
quadrato(N) quadrato non è stata ancora definita
def cubo(X):
''' restituisce il cubo di un numero '''
La funzione cubo invoca
return quadrato(X)*X la funzione quadrato
N = int(input())
N2 = cubo(N)
Funzioni nei programmi
• Un programma può utilizzare una o più funzioni
• L’invocazione di una funzione deve avvenire dopo che la funzione è
stata definita
• All’interno di una funzione può essere invocata un’altra funzione
def cubo(X):
''' restituisce il cubo di un numero '''
return quadrato(X)*X
N = int(input())
N2 = cubo(N)
La funzione main
• Quando si scrivono programmi con funzioni, è utile che tutte le istruzioni siano
contenute all’interno di funzioni
• Una di queste funzioni sarà il punto di partenza dell’esecuzione
• Per uniformità con altri linguaggi questa funzione può essere chiamata main
def main():
N = int(input())
N2 = cubo(N)
def cubo(X):
''' restituisce il cubo di un numero '''
return quadrato(X)*X
main()
Ambito di visibilità delle variabili
• Parte di programma nella quale una variabile è accessibile
• Le variabili definite all’interno di una funzione si chiamano variabili
locali
• Sono visibili solo all’interno della funzione
• Una variabile non può essere usata al di fuori del suo ambito di visibilità
def prova():
N = 27
Errore
print(N)
Ambito di visibilità delle variabili
• È possibile avere variabili con lo stesso nome ma con ambiti di
visibilità diversa
• L’ambito di visibilità di una variabile può anche essere globale
• Una variabile globale è visibile dal punto in cui è definita fino alla fine del file
• Anche all’interno delle funzioni
def prova():
print(N)
N=36
prova()
print(N)
Variabili locali e globali
• Una variabile locale può avere lo stesso nome di una variabile globale
• In questo caso la variabile globale non è visibile nella funzione
def prova():
print(N)
N=27
Errore
N=36
prova()
print(N)
Variabili locali e globali
• Una variabile locale può avere lo stesso nome di una variabile globale
• In questo caso la variabile globale non è visibile nella funzione
• Se una funzione deve modificare il valore di una variabile globale
bisogna aggiungere una dichiarazione global
def prova():
global N
print(N)
N=27
N=36
prova()
print(N)
Norme di buona programmazione
L=[3,-3,5]
print(somma(L))
5
Funzioni e Liste
• Le funzioni possono anche operare su liste
• Le liste possono essere passate come parametro alla funzione
• Il contenuto della lista può essere modificato all’interno di una funzione
def prova(L,x):
if x not in L:
L.append(x)
L=[1,3]
prova(L,23)
print(L)
[1, 3, 23]
Funzioni e Liste
• Le funzioni possono anche operare su liste
• Le liste possono essere passate come parametro alla funzione
• Il contenuto della lista può essere modificato all’interno di una funzione
• Possono essere restituite da una funzione
def estraiPari():
pari=[]
for i in range(10):
x=int(input())
if x%2==0:
pari.append(x)
return pari
listaPari=estraiPari()
print(listaPari)
Se in input si inseriscono:
3579124689
Il programma stampa [2, 4, 6, 8]
Esercizio
• Scrivere un programma che, presa da input una sequenza di N numeri, utilizzando
una funzione, stampa i numeri TRIANGOLARI.
• Un numero si dice triangolare se può essere rappresentato graficamente come un
triangolo, ovvero, preso un insieme di elementi con cardinalità pari al numero in
oggetto, è possibile disporre i suoi elementi su una griglia regolare, in modo da
formare un triangolo equilatero o un triangolo isoscele.
*
* * *
* * * * * *
* * * * * * * * *
N=3 N=6 N=10
def main():
L=[1,3,5,2,4,9]
x=5
pos=ricercaLineare(L,x)
if pos==-1:
print(x, "non è presente in ", L)
else:
print(x, "è presente in ", L, "in
posizione",pos)
main()
Ricerca Binaria
def ricercaBinaria(V, x):
inf = 0
sup = len(V)-1
while inf <= sup:
mid = (inf + sup)//2 # Elemento centrale (circa)
if V[mid] == x:
return mid # x è presente in posizione mid
else:
if V[mid] < x: inf = mid + 1 # cerca a destra di mid
else: sup = mid -1 # cerca a sinistra di mid
return -1 # x non è presente
def main():
L=[1,3,5,12,14,29]
x=5 Si noti che l’elenco è ordinato
pos=ricercaBinaria(L,x)
if pos==-1: print(x, "non è presente in ", L)
else: print(x, "è presente in ", L, "in posizione",pos)
main()
Algoritmi di Ordinamento
• Ordinamento di dati secondo una relazione d’ordine
• Fondamentale per moltissime applicazioni informatiche
• elenchi telefonici, biblioteche, dizionari, magazzini, archivi, ecc.
• Facilita le ricerche successive di elementi all’interno dell’elenco
• Metodi semplci:
• Facili da capire e da realizzare
• Generalmente richiedono un numero di confronti dell’ordine di n2
• Rapidi per n abbastanza piccolo ma inutilizzabili per n grande
• Metodi avanzati:
• Tecniche più complesse e meno intuitive
• Richiedono, generalmente, un numero di confronti nell’ordine di nlog n
Bubble Sort
• Si effettuano una serie di passate sull’elenco fino a che esso non
risulti ordinato.
• Ad ogni passata, si confrontano coppie di elementi consecutivi e si
scambiano di posto gli elementi che non verificano l’ordinamento.
2 1 4 5 3 1 2 4 5 3 1 2 4 3 5 Passata 1
1 2 4 3 5 1 2 3 4 5 Passata 2
… …
Bubble Sort
def main():
Se N fosse 5 e l’elenco fosse 1 2 4 5 3 il programma stamperebbe
N=int(input())
sequenza=leggiSequenza(N)
passata 0 Elenco-> [1, 2, 4, 3, 5]
bubbleSort(sequenza)
print(sequenza) passata 1 Elenco-> [1, 2, 3, 4, 5]
passata 2 Elenco-> [1, 2, 3, 4, 5]
def leggiSequenza(N): passata 3 Elenco-> [1, 2, 3, 4, 5]
sequenza=[] passata 4 Elenco-> [1, 2, 3, 4, 5]
for i in range(N): [1, 2, 3, 4, 5]
sequenza.append(int(input()))
return sequenza
def bubbleSort(S):
for cont in range(len(S)):
for j in range(len(S)-1):
Si noti che l’elenco è ordinato
if S[j] > S[j+1]: già alla seconda passata
temp=S[j]
S[j]=S[j+1]
S[j+1]=temp Sono possibili ottimizzazioni
print("passata ",cont, "Elenco->", S)
main()
Bubble Sort – versione 2
• Per rendere più efficiente l’algoritmo si utilizza una variabile booleana scambi
che segnala se durante una passata sono stati effettuati o meno degli scambi.
• Se durante una passata non sono stati effettuati scambi ( e quindi la variabile
scambi è False) l’array è già ordinato e l’algoritmo termina.
def bubbleSort(S):
Se N fosse 5 e l’elenco fosse 1 2 4 5 3 il programma stamperebbe
i = len(S)
ordinato = False
Elenco-> [1, 2, 4, 3, 5] Alla terza passata non
while not ordinato:
ordinato = True; Elenco-> [1, 2, 3, 4, 5] avvengono scambi,
for j in range(i-1): Elenco-> [1, 2, 3, 4, 5] l’algoritmo termina
if S[j] > S[j+1]: [1, 2, 3, 4, 5]
temp=S[j] Ogni passata termina prima
S[j]=S[j+1] delle precedenti
S[j+1]=temp
ordinato = False; Esercizio: Ottimizzare ulteriormente
print("Elenco->", S) l’algoritmo in modo tale che ogni passata
i-=1 termini alla posizione dove è avvenuto
l’ultimo scambio nella passata precedente
Programmazione
in Python
Selection Sort
• Si cerca il minimo dell'array; si scambia l’elemento minimo con il
primo elemento dell’array; poi si cerca il minimo nell’array a partire
dal secondo elemento fino alla fine, e lo si scambia con l’elemento al
secondo posto, e così via
• Il costo non dipende da come è l'input ma dalla dimensione dell'array
• Su array ordinati o disordinati non cambia quasi niente.
• Utile per ordinare oggetti grandi poiché ogni oggetto viene spostato al
più una volta.
Selection Sort
def minIndex(S,i):
minIndex = i
for j in range(i+1, len(S)):
if S[j] < S[minIndex]:
minIndex = j
return minIndex
def selectionSort(S):
for i in range(len(S)-1):
posMin=minIndex(S,i)
S[i], S[posMin] = S[posMin], S[i] #scambia gli elementi
print(S)
[1, 2, 3, 5, 4]
[1, 2, 3, 5, 4] Esegue sempre N passate per
[1, 2, 3, 5, 4] calcolare il minimo sull’array
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
Tuple
• In python una tupla è una sequenza di elementi immutabile
• Si differenzia dalle liste perché gli elementi sono racchiusi tra parentesi tonde
• Una volta creata, una tupla non si può modificare
tuplaInteri = (1,3,5,7)
• Si possono usare sulle tuple le funzioni che si usano sulle liste purchè non ne
modifichino il contenuto
• Le tuple si possono usare per assegnare più valori a più variabili
(A, B) = (1,2) A=1
B=2
• Le parentesi tonde si possono omettere
Tuple
• Le tuple possono essere usate per fare in modo che una funzione
restituisca più valori
• La funzione restituisce una tupla di valori
def funzione():
A = input()
B = int(input())
return (A,B)
Tupla=funzione()
print(Tupla)
Tuple
• Le tuple possono essere usate per definire funzioni che ricevono un
numero variabile di argomenti
• To Be Continued ;-)
La ricorsione
• E’ una tecnica di programmazione
• Il problema da risolvere viene suddiviso in
sotto-problemi simili a quello originale, ma
generalmente più piccoli e più semplici.
• Si studia il problema e si identificano dei
La ricorsione casi base, casi più semplici che possono
essere risolti facilmente;
• La soluzione del problema originale viene
ottenuta combinando la soluzione di uno o
più problemi sotto-problemi.
Funzioni Ricorsive
n! = n * ( n – 1 ) * ( n – 2 ) * … * 1
Soluzione Iterativa
def fattoriale(n):
fatt = 1
for i in range(n,1,-1):
fatt = fatt* i
return fatt
n= int(input())
print(fattoriale(n))
Il fattoriale – approccio ricosivo
• IDEA: Si riconduce il problema del calcolo di n! ad un sotto-problema simile al
problema di partenza ma su un input più piccolo, ossia al calcolo di (n-1)!
n! si può scrivere come n * ( n – 1 )!
5! = 5 * 4!
4! = 4 * 3!
• Ci sono dei casi più semplici che possono essere risolti direttamente
CASI BASE
1! = 0! = 1
n= int(input())
print(fattorialeRicorsivo(n))
Esempio di Invocazione per 4!
La soluzione di 4! si ottiene dalla soluzione di 3! che a sua volta
dipende dalla soluzione di 2! e così via
fattorialeRicorsivo(4)
24
return 4 * fattorialeRicorsivo(3)
6
return 3 * fattorialeRicorsivo(2)
2
return 2 * fattorialeRicorsivo(1)
1
return 1
I numeri di Fibonacci
return 1 return 1
Esempio di Invocazione per fibonacci di 6
f(6)
f(5) f(4)
f(2) f(1)
Iterazione vs Ricorsione
• Ripetizione
• Iterazione: ciclo esplicito
• Ricorsione: chiamate ripetute alla funzione
• Terminazione
• Iterazione: fallisce la condizione nel ciclo
• Ricorsione: raggiungimento del caso base
• In entrambe si può entrare in “cicli infiniti”
Bilancio tra
performance (iterazione) e
una buona ingegneria del software (ricorsione)
Programmazione
in Python
Esempio: Potenza di un numero
• Calcolo ricorsivo di NM (con M>0)
• IDEA: Si riconduce il problema del calcolo di NM al problema del
calcolo di NM-1
Formulazione
Ricorsiva
Infatti NM si può scrivere come N* NM-1
Casi Base
N0=1 è un caso risolvibile direttamente
(ma anche N1=N)
Potenza di un Numero
Caso Base
def potenzaRic(N,M):
if M==0:
return 1 Chiamata Ricorsiva
return N*potenzaRic(N,M-1)
def main():
N,M=int(input()),int(input())
print(potenzaRic(N,M)) Prima Invocazione
main()
Esempio: Ricerca del massimo in una lista
Caso Base
def massimoRicorsivo(L, inf, max): (non ci sono elementi)
if inf==len(L):
return max
if max < L[inf]: Si aggiorna il valore del
max =L[inf] massimo corrente
return massimoRicorsivo(L,inf+1,max)
Chiamata Ricorsiva
Si richiama la funzione per cercare il
def main(): massimo da inf+1 in avanti
L=[-7,-3,52,4]
print(massimoRicorsivo(L,1,L[0]))
Prima Invocazione
main() Si suppone che il massimo
è il primo elemento
Esempio di Invocazione
L=[-7,-3,52,4]
massimoRicorsivo(L,1,-7)
return massimoRicorsivo(A,2,-3)
return massimoRicorsivo(A,3,52)
return massimoRicorsivo(A,4,52)
return 52
Esempio: Somma della diagonale di una
matrice
• Scrivere una funzione ricorsiva che data una matrice M quadrata calcoli la somma
degli elementi sulla diagonale principale di M
def somma_ricorsiva (M,i):
if i>=len(M):
return 0
else: 1 2 5 3
return M[i][i] + somma_ricorsiva(M,i+1) 0 2 0 2
def main(): 0 2 3 2
M=[[1,2,5, 3],[0,2,0,2],[0,2,3,2],[1,2,3,4]] 1 2 3 4
print(somma_ricorsiva(M,0))
main()