Il 0% ha trovato utile questo documento (0 voti)
250 visualizzazioni

Programmazione in Python Lezioni

programmazione in Python (ingegneria informatica)

Caricato da

Isabel Portas
Copyright
© © All Rights Reserved
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
250 visualizzazioni

Programmazione in Python Lezioni

programmazione in Python (ingegneria informatica)

Caricato da

Isabel Portas
Copyright
© © All Rights Reserved
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 181

Programmazione

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

Segnala messaggi durante l’esecuzione


SISTEMA
Input dell’utente RUN-TIME

Output del programma


Fasi dell’attività di programmazione in Python
INTERPRETE
Source Code Controllore Segnala messaggi di errori di sintassi
EDITOR DI
sintattico e
TESTI
traduttore

Byte Code
Librerie
Segnala messaggi durante l’esecuzione
Python Virtual
Input dell’utente Machine

Output del programma


Programmare in Python
• Scrivere il programma con l’ausilio di un editor di testo o di un
ambiente di sviluppo integrato
# il mio primo programma
print(‘HELLO WORLD!’)

• 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

# il mio primo programma


print(‘HELLO WORLD!’) Stampa la riga di testo
Hello World!
stringa
Sintassi
print(valore1,…,valoren)
• print è una Funzione Stampa
La somma di 3 e 2 è 5
• valore1,…,valoren sono gli argomenti
• Esempio print('La somma di 3 e 2 è', 3+2)
I valori utilizzati all’interno di un programma
possono essere di tipi diversi
• In Python ogni valore è di uno specifico tipo
• Il tipo di dato associato ad un valore
specifica
Il tipo di dato • La rappresentazione e memorizzato all’interno
del calcolatore
• Le operazioni possibili
• I tipi messi a disposizione dal linguaggio
sono detti primitivi
• E’ possibile utilizzare dati definiti dall’utente
I tipi primitivi in Python
• Alcuni dei tipi di dati supportati da Python
• Numeri
• Stringhe di testo
• File
• Contenitori
• Tra i numeri abbiamo
• Numeri interi (Es. 5, -27, 0): int
• Quali? Dipende dall’implementazioni, generalmente tra -231-1 e +231
• Numeri decimali in virgola mobile (floating point) (Es. 3.57, 0.28, -7.890): float
• Quali? Dipende dall’implementazioni, generalmente tra -10308 e +10308 e utilizzano 16
cifre per la precision
Operazioni sui valori - espressioni
Espressioni aritmetiche con operatori aritmetici
** elevamento a potenza: es. a**b
– cambio di segno: es. –a
* moltiplicazione: es. a*b
/ divisione: es. a/b
// quoziente: es. a//b
% resto (o modulo): es. a%b
+ addizione: es. a+b
- sottrazione: es. a-b
Precedenza degli operatori nelle espressioni aritmetiche: si applicano le regole
dell’algebra
• Le operazioni di uguale precedenza sono associative a sinistra
• L’elevamento a potenza è associativo a destra
• 2**3**2 equivale a 2**9 – (2**3)**2 equivale a 8**2
Le variabili
• Un identificatore di variabile o semplicemente variabile è un nome dato ad un valore
>>> s=‘pippo’
Nomi Valori
s da questo momento riferirisce al valore ‘pippo’ Riferisce a
s ‘pippo’
>>> s t ‘pluto’
produce‘pippo’ Operazione di
i 7
>>> t=‘pluto’ inizializzazione

>>> 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

Funzione che si occupa della Espressione che calcola l’area


stampa come numero con la virgola
Ripassiamo docstring: commento multilinea
utilizzato per documentare e
creare una guida su moduli,
File area.py """ funzioni, oggetti.
questo programma calcola l'area di un
triangolo avente base e altezza fissate
"""
L’area è 6.0
base=3
Inizializzazione altezza=4
delle variabili # calcolo e stampo l’area Commento di fine riga
base e altezza print("l'area è",base*altezza/2)

Funzione che si occupa della Espressione che calcola l’area


stampa come numero con la virgola
Prendere dati in input
"""
File area.py questo programma calcola l'area di un
triangolo avente base e altezza fissate
"""

base=3
altezza=4
# calcolo e stampo l’area
print("l'area è",base*altezza/2)

Vogliamo generalizzare il problema:


Scrivere un programma che dati in input i valori di base e altezza, calcola l’area del triangolo
Prendere dati in input
>>> s = input(‘Inserisci il tuo nome: ’)

Inserisci il tuo nome: simona

>>> s Funzione input


• Riceve un argomento di tipo stringa
‘simona’ • Sintassi input(stringa)
• visualizza la stringa ricevuta
>>> print(s) • Restituisce la stringa digitata da tastiera
• L’argomento è opzionale input()
simona
Prendere dati interi in input
int
• Funzione per la conversione di
>>> numero1=int(input('Inserisci un numero:'))
una stringa in un numero
Inserisci un numero: 38 intero

>>> numero2=int(input'Inserisci un altro numero:'))

Inserisci un altro numero: -47


Funzione input
>>> numero1+numero2 • Riceve un argomento di tipo stringa
• Sintassi input(stringa)
-9 • visualizza la stringa ricevuta
• Restituisce la stringa digitata da tastiera
• L’argomento è opzionale input()
Prendere dati interi in input
• Che succede se dimentichiamo int prima di input?
• I numeri inseriti vengono trattati come stringhe
>>> numero1=input(‘Inserisci un numero:’)
Inserisci un numero: 38
>>> numero1
'38'
>>> numero2=input(‘Inserisci un altro numero:’)
Inserisci un altro numero: -47
>>> numero1+numero2
Qui l’operatore + non è la somma tra
'38-47'
interi, perché opera su due stringhe,
e produce la concatenazione
Esercizio - l’area del triangolo
Scrivere un programma che dati in input i valori di base e altezza, calcola l’area del triangolo

""" Notate l’uso di '


File area.py questo programma calcola l'area di un oppure di " per
triangolo con base e altezza presi da input racchiudere le
""" stringhe

base=int(input('Inserisci la base: '))


altezza=int(input("Inserisci l'altezza: "))
# calcolo e stampo l’area
print("L'area è",base*altezza/2) Inserisci la base: 7
Inserisci l'altezza: 5
L'area è 17.5
Altro sulle stringhe
• Sequenze di escape
• Usate per esprimere caratteri speciali
• Esempi \n (carattere di a capo), \t tabulazione, \’ virgoletta semplice etc.
>>> stringa='le foglie dell\'albero'
>>> stringa
"le foglie dell'albero"
• Concatenamento di stringhe
• Operatore +
>>> "ciao " + "mondo!"
'ciao mondo'
• Operatore * concatena ripetizioni di una stringa
>>> 2*'ciao'
'ciaociao'
I caratteri nelle stringhe
• Una stringa è una sequenza di caratteri UNICODE
• Si può accedere ad ogni carattere tramite il suo indice
• Nella stringa 'simona' s è il carattere di indice 0, i di indice 1, e così via fino ad a di
indice 5
>>> nome='simona'
>>> nome[3]
'o'
• Si può usare la funzione len per determinare la lunghezza di una stringa
>>> frase = input('Introduci una frase:')
Introduci una frase: la vita è bella
>>> lunghezza = len(frase)
>>> print("L’ultimo carattere di",frase,"è",frase[lunghezza-1]
L’ultimo carattere di la vita è bella è a
Aritmetica con tipi di dati misti
• Che succede se si scrive un’espressione aritmetica su dati i cui tipi sono diversi?
Esempio: somma tra un intero e un decimale
>>> -98.32 + 27
Il tipo meno generale int viene automaticamente
-71.32
convertito (temporaneamente) nel tipo più generale float

• Si possono effettuare conversioni di tipo utilizzando delle funzioni di conversione


• int(argomento) e float(argomento) - L’argomento può essere un numero o una stringa
>>> int(3.5)
3 L’interprete controlla il valore degli operandi prima di
effettuare un’operazione e segnale errore nel caso in cui un
>>> int('-47')-3
valore non sia appropriato
-50
Le conversioni di tipo
• Funzioni di conversione verso tipi numerici int(argomento) e float(argomento)
• L’argomento può essere un numero o una stringa
>>> float(3)
3.0
>>> float('-32.5’)+2.4
-30.1

• Funzione di conversione verso tipo stringa str(argomento)


• L’argomento può essere un valore qualsiasi
>>> str(34+15)
'49'
Funzioni e Moduli
• Una funzione è un blocco di codice, al quale viene assegnato un nome, che svolge un
determinato compito
• Può ricevere degli argomenti, ossia dati necessari per svolgere il compito
• Es. print(valore1,…,valoren)
Si può consultare la documentazione di
• Può restituire un valore una funzione usando la funzione help
• Es. a=input('messaggio’) Es. help(round)
• Es. x=round(3.6)
• Alcune funzioni possono avere argomenti facoltativi e altri obbligatori
• Es. a=input() #OK, non produce nessun messaggio
• Es. x=round() #NO, errore
• Es. x=round(3.789,2) #OK, x diventa 3.79
Funzioni e Moduli A volte i programmatori usano
from math import *
Per evitare l’uso del qualificatore

• 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']

• Si può consultare la documentazione di tutto il modulo o di una singola risorsa


>>> help(math)
>>> help(math.sqrt)
Programmazione
in Python
Lezione 3
Prendere decisioni
• I programmi visti finora sono composti da istruzioni (anche molte) ma
che devono essere eseguite tutte, una dopo l’altra
• A volte invece potrebbe diventare necessario prendere delle decisioni e
scegliere tra due possibili azioni alternative
• Per questo è necessario esaminare e valutare se una determinata
condizione è vera o falsa e in base al risultato ottenuto seguire una
strada piuttosto che un’altra
ISTRUZIONI DI
• Es. Il voto preso all’esame è maggiore di 18? SELEZIONE
• Sì, stampa "complimenti! Hai superato l’esame"
• No, stampa "peccato! Riprova al prossimo appello"
Le istruzioni di selezione - Rappresentazione grafica
Diagramma di flusso di una istruzione di selezione a una via Diagramma di flusso di una istruzione di selezione a due vie

VERO FALSO VERO FALSO


Condizione Condizione

Blocco di Blocco di Blocco di


istruzioni 1 istruzioni 1 istruzioni 2
Il termine deriva dal nome del

Le condizioni Matematico inglese George


Boole (XIX secolo)

Sono espressioni booleane, ossia espressioni il cui risultato può essere vero o falso (valore di
verità)

Spesso richiedono di confrontare valori tramite operatori relazionali

• A>B operatore maggiore


• A >=B operatore maggiore uguale
• A<B operatore minore
• A <= B operatore minore uguale
• A == B operatore uguale
• A != B operatore diverso

Possono essere utilizzati per confrontare sia numeri che stringhe

Hanno una precedenza più bassa degli operatori aritmetici


Prendere decisioni - L’enunciato if

E’ la prima riga dell’enunciato,


Intestazione
termina sempre con :

Enunciato composto

Gruppo di una o più istruzioni


Blocco di enunciati tutte incolonnate più a destra
rispetto all’intestazione

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
"""

N=int(input('Inserisci un numero: '))


# verifico se N è un numero pari
if N%2 == 0:
print(N,"è un numero pari")
else:
print(N,"NON è un numero pari")
Esercizio 2
• Scrivere un programma Python che dati in input due numeri A e B,
verifica se A è divisibile per B
File """
divisibili.py questo programma prende da input due interi
A e B e verifica se A è divisibile per B
"""

A=int(input('Inserisci un numero: '))


B=int(input('Inserisci un numero: '))
# verifico se A è divisibile per B
if A%B == 0:
Inserisci un numero: 14
print(A,"è divisibile per",B)
Inserisci un numero: 2
else:
14 è divisibile per 2
print(A,"non è divisibile per",B)
Esercizio 2
• Scrivere un programma Python che dati in input due numeri A e B,
verifica se A è divisibile per B
File """
divisibili.py questo programma prende da input due interi
A e B e verifica se A è divisibile per B
"""
Che succede se
A=int(input('Inserisci un numero: ')) per B si introduce
B=int(input('Inserisci un numero: ')) 0?
# verifico se A è divisibile per B
if A%B == 0: Inserisci un numero: 14
print(A,"è divisibile per",B) Inserisci un numero: 0
else:
print(A,"non è divisibile per",B)
Esercizio 2
• Scrivere un programma Python che dati in input due numeri A e B,
verifica se A è divisibile per B
File """
divisibili.py questo programma prende da input due interi
Errore in se
A e B e verifica faseAdi è
esecuzione
divisibile per B
"""
Che succede se
A=int(input('Inserisci un numero: ')) per B si introduce
Traceback (most recent call last):
B=int(input('Inserisci un numero: ')) 0?
File "C:/Users/Simona/Documents/Didattica/PythonProgs/divisibili.py",
# verifico se A è divisibile per B
line 8, in <module>
if A%B == 0: Inserisci un numero: 14
if A%B == 0:
print(A,"è divisibile per",B) Inserisci un numero: 0
ZeroDivisionError: integer division or modulo by zero
else:
print(A,"non è divisibile per",B)
Esercizio 2 """
questo programma prende da input due interi
File
divisibili.py
A e B e verifica se A è divisibile per B
"""
• Aggiungiamo un
controllo A=int(input('Inserisci un numero: '))
B=int(input('Inserisci un numero: '))
• Eseguiamo la if B != 0:
divisione solo se # verifico se A è divisibile per B
if A%B == 0:
B è diverso da 0 print(A,"è divisibile per",B)
else:
print(A,"non è divisibile per",B)
else:
print('non è possibile dividere per 0')
If innestati
Inserisci un numero: 14
Inserisci un numero: 0
non è possibile dividere per 0
If innestati
• All’interno di un enunciato if si può inserire un altro enunciato if
• Si parla di if innestati o annidati
A=int(input('Inserisci un numero: '))
B=int(input('Inserisci un numero: '))
if B != 0:
Occhio
# verifico se A è divisibile per B
all’indentazione
if A%B == 0:
print(A,"è divisibile per",B)
else:
print(A,"non è divisibile per",B)
else:
print('non è possibile dividere per 0')
If a più vie
• A volte è necessario prendere decisioni tra più possibili alternative
• Esempio: convertire un voto da 0 a 10 in giudizio
• Se il voto è minori di 5 stampare insufficiente,
• Altrimenti, se il voto è 6 stampare sufficiente,
• Altrimenti, se il voto è 7 stampare discreto,
• Altrimenti, se il voto è 8 stampare buono,
• Altrimenti, se il voto è 9 stampare distinto,
• Altrimenti, stampare ottimo
If a più vie
voto=int(input('Inserisci il voto (un numero tra 0 e 10)'))
if voto<=5:
print('Insufficiente')
else:
if voto==6:
print('Sufficiente')
else:
if voto==7:
print('Discreto') Una lunga catena di if-else
else:
if voto==8:
print('Buono')
else:
if voto==9:
print('Distinto')
else:
print('Ottimo')
If a più vie
voto=int(input('Inserisci il voto (un numero tra 0 e 10)'))
if voto<=5:
print('Insufficiente')
elif voto==6:
print('Sufficiente')
elif voto==7:
print('Discreto')
elif voto==8: Si può riscrivere in maniera
print('Buono') più compatta utilizzando un if
elif voto==9: a più vie
print('Distinto')
else:
print('Ottimo')
If a più vie
voto=int(input('Inserisci il voto (un numero tra 0 e 10)'))
if voto<=5:
print('Insufficiente')
Sintassi:
elif voto==6:
print('Sufficiente')
if condizione 1:
elif voto==7:
blocco di istruzioni 1
print('Discreto')
elif condizione 2: Si può riscrivere in maniera
elif voto==8:
blocco di istruzioni 2 più compatta utilizzando un if
print('Buono')
… a più vie
elif voto==9:
elif condizione n:
print('Distinto')
blocco di istruzioni n
else:
else:
print('Ottimo')
blocco di istruzioni di default
Le espressioni booleane composte
• Due o più espressioni booleane possono essere combinate per ottenere
una espressione booleana composta
• Si utilizzano gli operatori logici and, or e not
• and e or sono operatori binari
• A and B
• L’espressione composta è vera se sia A che B sono vere
• A or B
• L’espressione composta è vera se almeno una tra A e B è vera
• not è un operatore unario
• not A
• L’espressione composta è vera se A è falso
• Hanno una precedenza più bassa degli operatori di confronto
Tavole di verità per gli operatori and, or e not
A B A and B A B A or B A Not A
Vero Vero Vero Vero Vero Vero Vero Falso
Vero Falso Falso Vero Falso Vero Falso Vero
Falso Vero Falso Falso Vero Vero
Falso Falso Falso Falso Falso Falso
Esempio:
Si noti l’utilizzo dell’operatore or
voto=int(input('Inserisci il voto '))
if voto < 0 or voto > 30:
print('voto non valido')
elif voto >= 18:
print('Esame Superato')
else:
print('Bocciato')
Valutazione di Cortocircuito

A volte è possibile conoscere il valore


Le espressioni composte vengono di verità dell’espressione composta
valutate da sinistra verso destra prima che tutte le sue componenti
siano state valutate

Nella valutazione di A and B, viene valutata prima A. Se A è falsa, la valutazione


di B non viene effettuata perché l’espressione composta è certamente falsa.
Analogamente, nella valutazione di A or B, viene valutata prima A. Se A è vera, la
valutazione di B non viene effettuata perché l’espressione composta è
certamente vera.
Valutazione di Cortocircuito
• Il cortocircuito può essere utile in molti casi
• Ad esempio
if n != 0 and m%n == 0:
print('m è multiplo di n')

Se n è pari a 0 la prima parte della condizione è falsa e la


seconda viene saltata evitando così la divisione per 0
Il tipo bool
• E’ possibile assegnare il risultato di una espressione booleana ad una variabile.
>>> n=int(input('inserisci un numero: ‘))
Inserisci un numero: 38

>>> pari = n%2==0


>>> pari
True

• La variabile pari è una variabile booleana


• può assumere solo due valori: False e True
• Il tipo corrispondente è bool
Programmazione
in Python
Lezione 4
Esercizio – il massimo tra tre interi
Scrivere un programma che, dati in input tre numeri interi, determina e stampa il valore più grande

a=int(input("inserisci il primo numero ")) Versione 1


File b=int(input("inserisci il secondo numero ")) Notate l’uso di if
massimo.py c=int(input("inserisci il terzo numero ")) innestati e if a più
vie
if a>b:
if a>c:
print("Il massimo è",a)
else:
print("Il massimo è",c)
elif b>c:
print("Il massimo è",b)
else:
print("Il massimo è",c)
Esercizio – il massimo tra tre interi
Scrivere un programma che, dati in input tre numeri interi, determina e stampa il valore più grande

a=int(input("inserisci il primo numero ")) Versione 2


File b=int(input("inserisci il secondo numero ")) Notate l’uso della
massimo.py c=int(input("inserisci il terzo numero ")) variabile massimo e
i due if
massimo=a
if massimo<b:
massimo=b
if massimo<c:
massimo=c

print("Il massimo è",massimo)


Esercizio – il massimo tra quattro interi
Cosa cambia se gli interi sono 4?
a=int(input("inserisci il primo numero "))
b=int(input("inserisci il secondo numero "))
File c=int(input("inserisci il terzo numero "))
massimo.py d=int(input("inserisci il quarto numero ")) 4 variabili e 3 if

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?

print("Il massimo è",massimo)


Esercizio – il massimo tra N interi
• Scrivere un programma che, preso da input un numero intero N e altri N numeri
interi, determina e stampa il valore più grande
• Occorre generalizzare il metodo risolutivo dell’esercizio precedente
• Possiamo avere una variabile per ogni numero in input?
• Possiamo avere un enunciato if per ogni numero in input?
• Quali problemi vedete?
• E’ possibile individuare un insieme di operazioni che si ripetono
• Ad, esempio, potrei riscrivere il programma che calcola il massimo tra 4 numeri,
usando una sola variabile, e ripetendo alcune istruzioni più volte
Esercizio – il massimo tra 4 interi
massimo=int(input("inserisci un numero "))

a=int(input("inserisci un numero "))


if massimo<a: 3 gruppi di
massimo=a istruzioni che si
ripetono in maniera
identica
a=int(input("inserisci un numero "))
if massimo<a:
massimo=a

a=int(input("inserisci un numero "))


if massimo<a:
massimo=a

print("Il massimo è",massimo)


L’iterazione
• Per ripetere una o più azioni un certo numero di volte, si utilizzano gli enunciati
di Iterazione, anche detti cicli

• 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

• Si esegue mentalmente una istruzione dopo l’altra e si tiene traccia


del valore iniziale delle variabile e di come queste cambino durante
l’esecuzione
Esercizi
• Scrivere un programma che presa da input una sequenza di numeri
terminata da un valore <0 stampa la somma dei numeri pari
• Scrivere un programma che presa da input una sequenza di numeri
terminata da un valore <0 stampa "almeno un numero pari" se nella
sequenza è contenuto almeno un numero pari
• Scrivere un programma che dato in input un numero stampa le sue
cifre al contrario
Programmazione
in Python
Lezione 5
Il ciclo for

• 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

• Ad ogni iterazione, la variabile indicata nell’intestazione assume uno dei valori


indicati da range, in ordine dal primo all’ultimo
• Esempi: Stampa dei numeri da 1 a 10 con while (sinistra) e for(destra)

cont=1 for cont in range(1,11):


print(cont,end=' ') Notare la
while cont <= 10:
compattezza
print(cont,end=' ')
del for
cont=cont+1
Esempio – somma di N numeri con ciclo for
N=int(input("Quanti interi vuoi sommare "))

somma=0 La variabile cont


assumerà tutti i
valori da 0 ad N-1
for cont in range(N):
somma=somma+int(input("Inserisci un numero"))

print("La somma è",somma)


Operatori di assegnamento incrementale
E’ possibile combinare l’operatore di assegnamento con operatori
aritmetici e di concatenamento
>>> a=3
>>>a+=2 Sta per a=a+2 Esempi:
*=
>>>a +=
5 %=
-=
>>> corso='fondamenti di'
>>> corso+=' programmazione 1'
>>> corso
fondamenti di programmazione 1
Numeri casuali

• A volte, specialmente nei giochi, è richiesto la gestione della casualità


• Es. lancio dei dadi, lancio di una moneta, ecc.
• La casualità può essere SIMULATA nella programmazione e spesso i linguaggi forniscono opportune
risorse per gestirle
• Python fornisce una serie di funzionalità disponibili nel modulo random
• Ad esempio, la funzione randint può essere usata per generare numeri interi pseudocasuali
• Riceve due argomenti a e b e restituisce un numero pseudocasuale compreso tra a e b (estremi inclusi)
>>> randint(1,6)
5
Simulare il lancio dei dadi
from random import randint

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

• Si può accedere ad ogni carattere tramite l’operatore subscript


>>>frase[5] 'e'
Sottostringhe
• Sono porzioni della stringa di partenza
• Ad esempio "tale si a" è una sottostringa della stringa "Natale si avvicina"
• Si possono estrarre sottostringhe utilizzando l’operatore di subscript e i due punti (:)
>>> frase="Natale si avvicina"
>>> frase[2:11]
'tale si a'
>>> frase[2:]
'tale si avvicina'
>>> frase[:11]
'Natale si a'
>>> frase[-4:]
'cina'
>>> frase[:-4]
'Natale si avvi'
Cercare una sottostringa
• Per verificare se una sottostringa è presente in una stringa data si può
usare l’operatore in (lo stesso che si usa nel for)
frase="Natale si avvicina"
daCercare="tale"
if daCercare in frase:
print(daCercare,"è presente in",frase)

tale è presente in Natale si avvicina


startswith ed endswith
• Sono metodi che possono essere utilizzati per verificare se una stringa
inizi o finisca con una determinata sottostringa.
• Vengono invocati su una stringa S, ricevono come argomento la
sottostringa da cercare SS e restituiscono un valore booleano
• Esempio:
>>>presente=s.endswith(SS) Si tratta di metodi
non di funzioni.
Qual è la
differenza?
frase="Natale si avvicina"
if frase.startswith("Natale"):
print(frase,"cominicia con","Natale")
Altri metodi per stringhe e sottostringhe
>>> stringa = "blablabla" Il metodo count
>>> conta=stringa.count("bla") conta il numero di
occorrenze di una
>>> print("bla è presente",conta,"volte") sottostringa

bla è presente 3 volte

>>> primaOccorrenza=stringa.find("bla")
>>> print("La prima occorrenza di bla parte dall’indice",primaOccorrenza)

La prima occorrenza di bla parte dall’indice 0

Il metodo find restituisce l’indice dal quale inizia la


prima occorrenza di una sottostringa
Se la sottostringa non è presente restituisce -1
Stringhe, lettere e cifre

• 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

Data una sequenza di valori interi che rappresentano le temperature registrate in


una città in un mese stampi: La media è 3
• La temperatura media giorno 7: 4°
• L’elenco dei giorni in cui la temperatura è stata più alta della media giorno 13: 4°
giorno 14: 6°
giorno 17: 4°
giorno 18: 6°
Esempio: se le temperature fossero giorno 19: 7°
-5, 2, 0, -3, 1, 2, 4, -2, 0, 2, 3, 2, 4, 6, -1, 0, 4, 6, 7, 6, 10, 13, 12, 6, 5, 2, -1, 0, 4, 6, -1 giorno 20: 6°
giorno 21: 10°
giorno 22: 13°
E’ necessario analizzare tutti i dati giorno 23: 12°
almeno due volte, una volta per I dati vanno giorno 24: 6°
calcolare la media e una volta per memorizzati tutti giorno 25: 5°
identificare i giorni da stampare giorno 29: 4°
giorno 30: 6°
Memorizzare raccolte di dati: le liste

• 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:

La lista e’ una struttura dati Mutabile : struttura e contenuto possono


cambiare
• È possibile inserire nuovi elementi
• È possibile eliminare elementi
• È possibile sostituire gli elementi già esistenti

La stringa è una struttura dati Immutabile: struttura e contenuto NON


possono cambiare
Liste
>>> esami = ["fondamenti", "analisi", "inglese", "economia"]
>>> esami[3]="fisica"
>>> esami
['fondamenti', 'analisi', 'inglese', 'fisica']

>>> parola "economia"


>>> parola[0]="E"

Traceback (most recent call last):


File "<pyshell#42>", line 1, in <module>
parola[0]="E"
TypeError: 'str' object does not support item assignment
Metodi di lista per inserimento ed eliminazione
• L.append(elemento)
• Inserisce un elemento alla fine della lista
• L.insert(indice,elemento)
• Inserisce un elemento alla posizione corrispondente ad indice, se indice è minore della
lunghezza di L, altrimenti inserisce alla fine della lista
>>> L=[1,3,5]
>>> L.insert(2,4)
>>> L
[1,3,4,5]

La lista non deve


• L.pop() essere vuota
• Elimina e restituisce l’elemento alla fine della lista
• L.pop(indice) indice deve essere
un valore tra 0
• Elimina e restituisce l’elemento alla posizione corrispondente ad indice
len(L)
Scansione degli elementi della lista
• Si possono scandire gli elementi di una lista con un ciclo
• Accedendo ad ogni elemento tramite il proprio indice
0 1
>>> L=[1,5,7,8,2,-9] 1 5
2 7
>>> for i in range (len(L)):
3 8
print(i , L[i]) 4 2
5 -9
• Accedendo direttamente agli elementi
>>> for elemento in L:
1
print(elemento) 5
7
8
2
-9
Problema: le temperature
ngiorni=31
elenco=[]
for i in range(0,ngiorni):
elenco.append(int(input())) Possiamo evitare un ciclo for
somma=0
for i in range(0,ngiorni):
somma+=elenco[i]

media=somma//ngiorni

print("La media è", media)


for i in range(0,ngiorni):
if elenco[i] > media:
print("giorno ", i+1, ": ", elenco[i], "°", sep='')
Problema: le temperature
ngiorni=31
elenco=[]
somma=0

for i in range(0,ngiorni):
elenco.append(int(input()))
somma+=elenco[i]

media=somma//ngiorni

print("La media è", media)


for i in range(0,ngiorni):
if elenco[i] > media:
print("giorno ", i+1, ": ", elenco[i], "°", sep='')
Programmazione
in Python
Lezione 7
Ricerca di un elemento in una lista
• Per verificare se un elemento è presente in una lista si può utilizzare l’operatore in
>>> lista=[90,2,9,4,9]
>>> if 9 in lista:
print("il 9 è presente")
• Se è necessario conoscere la posizione in cui l’elemento è presente, di può utilizzare il metodo index
• Restituisce la posizione della prima occorrenza
• Può essere invocato se l’elemento è presente, altrimenti si ha un’eccezione
Si può utilizzare in un
• Riceve come argomento l’elemento da cercare
ciclo per conoscere le
>>> if 9 in lista:
posizioni di tutte le
print("il 9 è presente in posizione ",lista.index(9))
occorrenze
il 9 è presente in posizione 2

• Può ricevere l’indice della posizione da cui iniziare la ricerca


>>> print("il 9 è presente in posizione ",lista.index(9,3))
il 9 è presente in posizione 4 Attenzione che qui almeno un
elemento deve essere
presente dopo la posizione 3
Eliminare un elemento
• Per rimuovere un elemento data la sua posizione si usa il metodo pop
• lista.pop()rimuove l’ultimo
• lista.pop(x) rimuove l’elemento in posizione x
• Si può rimuovere un elemento in base al suo valore, senza conoscerne prima il
suò valore
• Si usa il metodo remove
>>> lista=[1,4,6,4]
>>> if 4 in lista:
lista.remove(4)
>>> lista Attenzione che anche qui
l’elemento da rimuovere deve
[1, 6, 4]
essere presente
Riferimenti ad una lista (alias)
>>> lista1=[47,92,0] lista1 47 92 0 19

• La variabile lista1 contiene un riferimento alla lista


>>> lista2= lista1 lista2

• Ora anche la variabile lista2 contiene un riferimento alla lista


• Si dice che lista2 è un alias per lista1
>>> lista2.append(19)
>>> lista1
[47, 92, 0, 19]
Copia di una lista
>>> L=[1,2,3]
• Si vuole creare una nuova lista C che contiene gli stessi elementi di L
Metodo1:
>>> C=[] C inizialmente è vuota e poi
>>> for elemento in L: vengono inseriti uno alla
C.append(elemento) volta gli elementi di L
Metodo2:
>>> C=L[:] Si assegna a C la lista
estratta da L
Metodo3:
• Si usa la funzione list
La funzione list
• Crea una nuova lista concatenando tutti gli elementi di una sequenza
>>> L=[1,2,3] Qui list concatena la
>>> C=list(L) sequenza di elementi
>>> C presenti nella lista L
[1, 2, 3]
>>> nome="Simona" Qui list concatena la
>>> caratteri=list(nome) sequenza di caratteri
>>> caratteri presenti nella stringa nome

['s', 'i', 'm', 'o', 'n', 'a']


Qui list concatena la
>>> listanumeri=list(range(10,31)) sequenza di numeri generati
>>> listanumeri dalla funzione range
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]
Identità degli oggetti ed Equivalenza Strutturale
• L’operatore == restituisce True se le liste sono una un alias dell’altra
• Si parla di Identità Strutturale
• L’operatore == restituisce True se due liste differenti contengono gli stessi oggetti
• Si parla di Equivalenza Strutturale
• Si può verificare l’identità strutturale tramite l’operatore is
>>> lista1=["fond","analisi"]
>>> lista2=["fond","analisi"]
>>> lista1==lista2
True
>>> lista2 is lista1
False
Funzioni per le liste
• Calcolare la somma degli elementi di una lista
• Si può usare la funzione sum che riceve la lista e restituisce la somma dei suoi
argomenti
• Gli elementi devono essere tutti numeri
>>> L=[1.5,-2,-3]
>>> somma=sum(L)
>>> somma
-3.5
Sommare o concatenare gli elementi in una
lista
L=[1.5,-2,-3]
somma=0.0
for element in L:
somma+=element
print(somma)

-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'

L=[1.5,-2,-3, 849, -81, 25.37, -91.2]


min=L[0]
for i in range(1,len(L)):
if L[i]<min:
min=L[i]
print(min)
'-91.2'
Programmazione
in Python
Lezione 8
Cicli annidati
• A volte è necessario utilizzare un ciclo all’interno del blocco di
istruzioni di un altro ciclo
• Si parla di cicli annidati (nested loop)
• Ad ogni iterazione del ciclo più esterno si eseguono tutte le iterazioni
del ciclo più interno

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())

duplicati =False Notare l’uso dei cicli innestati:


for i in range(len(elenco)-1): Per ogni elemento della lista
for j in range(i+1,len(elenco)): Si controllano tutti gli elementi successivi
if elenco[i] == elenco[j]:
duplicati=True

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

8:30 Italiano Arte Matematica Italiano Tecnologia Storia

9:30 Matematica Italiano Matematica Inglese Geografia Storia

10:30 Storia Italiano Ed. Fisica Italiano Musica Matematica

11:30 Geografia Musica Ed. Fisica Matematica Italiano Arte

12:30 Inglese Inglese Tecnologia Matematica Inglese Italiano

• In python si possono rappresentare tramite le liste


• Si crea una lista, i cui elementi (le righe) sono delle liste
Tabelle / Matrici
orario=[
["Italiano", "Arte", "Matematica","Italiano", "Tecnologia", "Storia"],
["Matematica", "Italiano", "Matematica","Inglese", "Geografia", "Storia"],
["Storia", "Italiano", "Ed. Fisica","Italiano", "Musica", "Matematica"],
["Geografia", "Musica", "Ed. Fisica","Matematica", "Italiano", "Arte"],
["Inglese", "Inglese", "Tecnologia","Matematica", "Inglese", "Italiano"]
]

Italiano Arte Matematica Italiano Tecnologia Storia


0 1 2 3 4 5
orario 0 Matematica Italiano Matematica Inglese Geografia Storia

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

Inglese Inglese Tecnologia Matematica Inglese Italiano


0 1 2 3 4 5
Accedere agli elementi di una matrice
• Si accede ad ogni elemento tramite due indici (riga e colonna)
>>> print(orario[1][3])
Inglese
• Per scandire una matrice si usa un ciclo annidato
for i in range(5):
for j in range(6):
print(orario[i][j],end=' ‘)
print()

Italiano Arte Matematica Italiano Tecnologia Storia


Matematica Italiano Matematica Inglese Geografia Storia
Storia Italiano Ed. Fisica Italiano Musica Matematica
Geografia Musica Ed. Fisica Matematica Italiano Arte
Inglese Inglese Tecnologia Matematica Inglese Italiano
Creazione di una tabella di dimensione N*M
Per creare una tabella con M righe e N colonne di valori interi pari a 0

Si crea una lista vuota


M=3
N=4
matrice=[]
Si inseriscono nella lista M righe
for i in range(M):
matrice.append([0]*N)

Ogni riga è una lista con N zero


Esercizio
• Stampare le lezioni del giovedì
orario=[
["Italiano", "Arte", "Matematica","Italiano", "Tecnologia", "Storia"],
["Matematica", "Italiano", "Matematica","Inglese", "Geografia", "Storia"],
["Storia", "Italiano", "Ed. Fisica","Italiano", "Musica", "Matematica"],
["Geografia", "Musica", "Ed. Fisica","Matematica", "Italiano", "Arte"],
["Inglese", "Inglese", "Tecnologia","Matematica", "Inglese", "Italiano"]
]

for i in range(5): Italiano


print(orario[i][3]) Inglese
Italiano
Matematica
Matematica
Esercizio
• Data una matrice di interi di N righe e N colonne verificare se si tratta
di una matrice diagonale.
una matrice diagonale è una matrice quadrata in cui solamente i valori
della diagonale principale possono essere diversi da 0
Diagonale
Principale 1 0 0 0 1 0 0 0
0 -2 0 0 0 -2 0 0
0 0 0 0 0 6 0 0
0 0 0 81 0 0 0 81

Matrice Diagonale Matrice Non Diagonale


Esercizio - Matrice Diagonale
N=int(input())

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

Matrice Triangolare Superiore Matrice Non Triangolare


Esercizio - Matrice Triangolare Superiore –
versione 1
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(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

if p1 and p2 and (N1-N2 == 2 or N2-N1 == 2):


print("SI")

else:
print("NO")
Cosa fa questo programma?

N1=int(input())
N2=int(input())

if numeroPrimo(N1) and numeroPrimo(N2) and (N1-N2 == 2 or N2-N1 == 2):


print("SI")
else:
print("NO")
Cosa fa questo programma?

N1=int(input())
N2=int(input())

if numeroPrimo(N1) and numeroPrimo(N2) and valoreAssoluto(N1-N2)==2:


print("SI") # sono primi gemelli
else:
print("NO") # non sono primi gemelli
Cosa fa questo programma?
def numeroPrimo(N):
for i in range(2,N//2+1):
if N%i==0:
return False
return True

def valoreAssoluto(N):
if N<0:
return -N
return N

N1=int(input())
N2=int(input())

if numeroPrimo(N1) and numeroPrimo(N2) and valoreAssoluto(N1-N2):


print("SI") # sono primi gemelli
else:
print("NO") # non sono primi gemelli
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
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

X si chiama parametro formale Invocazione:


Si specifica il nome della funzione seguito dagli
argomenti su cui la funzione deve essere
def quadrato(X): invocata
''' restituisce il quadrato di un numero '''
return X*X
Il valore restituito dalla funzione viene usato nel
N = int(input()) programma
N2 = quadrato(N)

N si chiama parametro attuale


Se l’istruzione return manca, il

Funzioni controllo passa al chiamante


dopo che è stata eseguita
l’ultima istruzione del corpo e
• Sono sequenze di istruzioni con un nome viene restituito il valore
speciale None
• Possono ricevere argomenti
• Possono restituire un valore
parametro1,…, parametron sono i
• Sintassi: parametri formali

def nomedellafunzione (parametro1,…, parametron):


corpo

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 quadrato(X): Questo genera un errore di compilazione


''' restituisce il quadrato di un numero ''' Traceback (most recent call last):
return X*X File "<pyshell#14>", line 1, in <module>
N2=quadrato(N)
NameError: name 'quadrato' is not defined
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 quadrato(X):
''' restituisce il quadrato di un numero '''
return X*X

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

def quadrato(X): Non è importante l’ordine


in cui vengono scritte le
''' restituisce il quadrato di un numero '''
funzioni
return 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

def quadrato(X): Il programma contiene


''' restituisce il quadrato di un numero ''' solo l’invocazione della
return X*X funzione main

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

Le variabili globali non dovrebbero Usare molte variabili globali


essere usate all’interno di funzioni
Utilizzare i parametri complica la comprensione del codice
per la comunicazione con l’esterno è spesso fonte di errori
Programmazione
in Python
Lezione 10
Funzioni e Liste
• Le funzioni possono anche operare su liste
• Le liste possono essere passate come parametro alla funzione
def somma(L):
somma=0
for i in range(len(L)):
somma+=L[i]
return somma

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

Sono formati dalla somma di numeri consecutivi partendo da 1


Esercizio
def main():
x=int(input())
while x!=0:
Per ogni numero della
if triangolare(x):
sequenza si rimanda alla
print(x)
funzione la verifica della
x=int(input())
proprietà di essere
def triangolare(N): triangolare
somma=0
i=1
while somma<N:
somma+=i Si sommano i numeri
i+=1 consecutivi partendo da 1,
return somma==N finchè non si raggiunge o
supera N
main()
Esercizio
• Scrivere un programma che, letta da input una sequenza di N
elementi, determinare il massimo e stampa l’elenco dei numeri
contenuti nella sequenza con il relativo scarto dal massimo.
• Es. Se N è 7 e la sequenza è 13, 12, 9, -7, 5, 14, 2 il programma
dovrebbe stampare
13 Scarto 1
12 Scarto 2
9 Scarto 5
-7 Scarto 21
5 Scarto 9
14 Scarto 0
2 Scarto 12
Esercizio
• Quali sotto-problemi possiamo inidividuare?
• Creazione della sequenza con N valori presi da input
• Calcolo del massimo della sequenza
• Stampa ogni valore della sequenza con il relativo scarto dal massimo
• Progettiamo la soluzione affidando ogni sotto-problema ad una
funzione
• Pseudocodice
• Leggi da input N
• Assegna ad una lista S una sequenza di N numeri presi da input
• Assegna ad M il massimo della lista S
• Stampa gli scarti da M degli elementi di S
def main():
N=int(input())
sequenza=leggiSequenza(N)
massimo=max(sequenza)
stampaScarti(sequenza,massimo)
def leggiSequenza(N):
sequenza=[]
for i in range(N): Notare la corrispondenza
sequenza.append(int(input())) con lo pseudo codice
return sequenza
def stampaScarti(S, max):
for i in range(len(S)):
print(S[i],"Scarto", max-S[i]);
def max(S):
max=S[0]
for i in range(len(S)):
if S[i]>max:
max=S[i]
return max;
main()
Ricerca di un element in un elenco:
Ricerca Lineare e Ricerca Binaria
• Dato un elemento x ed un elenco, verificare se x è presente e determinare la sua posizione
• Ricerca lineare
• Confronta ogni elemento dell’elenco con quello da cercare
• Utile per elenchi di piccole dimensione e nei quali gli elementi non seguono alcun ordine
• Se gli elementi dell’elenco sono n, sono necessary al massimo n passi per rispondere
• Ricerca Binaria
• Si può utilizzare solo su array i cui elementi seguono un qualche ordine
• Confronta l’elemento da cercare con quello da cercare
• Se sono uguali, l’elemento è presente
• Altrimenti, se l’elemento da cercare è più piccolo di quello centrale, si riperte la ricerca nella prima metà dell’elenco
• Se invece è più piccolo, la ricerca si ripete sulla parte destra
• Molto veloce: in un elenco di n elementi, sono necessary al massimo log2 n passi per rispondere
• Su 30 elementi impiega al massimo 5 passi
Ricerca Lineare
def ricercaLineare(V, x):
for i in range(len(V)):
if V[i] == x:
return i # x e' presente in posizione i
return -1; # x non e' presente

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)

Se N fosse 5 e l’elenco fosse 1 2 4 5 3 il programma stamperebbe Si noti come avviene lo scambio

[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

Sono funzioni che richiamano se stesse

Devono essere progettate in maniera tale che:


• alcuni casi speciali più semplici siano risolti direttamente (casi base)
• ogni invocazione ricorsiva semplifica in qualche modo l'elaborazione,ossia:
• risolve un sotto-problema più semplice
• si avvicina sempre di più a un caso base

Attenzione: una cattiva progettazione può portare ad una ricorsione infinita


Funzioni Diretta e Indiretta
• Ricorsione diretta: all’interno del corpo della funzione è presente una chiamata alla
funzione stessa
def funzione (parametro1,…, parametron):

funzione(p1,…,pn)
• Ricorsione indiretta: all’interno del corpo della funzione è presente una chiamata ad
un’altra funzione che a sua volta richiama la funzione di partenza
def funzione1(parametro1,…, parametron):

funzione2(q1,…,qm)

def funzione2(parametro1,…, parametrom):



funzione1(p1,…,pn)
Esempio: il fattoriale
• Il fattoriale di un numero n è definito come:

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

• Il calcolo di n! si riconduce al calcolo di (n-1)! che a sua volta verrà ricondotto a


(n-2)! e così via fino a quando non si raggiunge un caso base.

• La soluzione del problema originario si ottiene combinando le soluzioni dei vari


sottoproblemi.
Soluzione Ricorsiva
Casi Base
def fattorialeRicorsivo(n):
if n==0 or n==1:
return 1 Chiamata Ricorsiva
return n*fattorialeRicorsivo(n-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

• Ogni numero è la somma dei due precedenti


• 0, 1, 1, 2, 3, 5, 8...

Sono elementi della successione così definita


fib(1) = 1
fib(2) = 1
fib(n) = fib(n-1) + fib(n-2) per ogni n!=1 e n!=2
Funzione Ricorsiva per calcolare i numeri di Fibonacci
def fibonacci(n):
if n==1 or n==2: Casi base
return 1
else:
return fibonacci(n-1)+fibonacci(n-2)

Il calcolo di fibonacci(n) è ricondotto alla


risoluzione di due sottoproblemi
fibonacci(n-1) e fibonacci(n-2)
Esempio di Invocazione per fibonacci di 3
fibonacci(4)

return fibonacci(3) + fibonacci(2) Alcune chiamate


vengono ripetute più
volte
return fibonacci(2) + fibonacci(1) return 1

return 1 return 1
Esempio di Invocazione per fibonacci di 6
f(6)

f(5) f(4)

f(4) f(3) f(3) f(2)

f(3) f(2) f(2) f(1) f(2) f(1)

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()

Potrebbero piacerti anche