Sei sulla pagina 1di 125

Unità P3:

Decisioni
DECISIONI, CONDIZIONI BOOLEANE, ANALISI
DI STRINGHE, VALIDAZIONE DEGLI INPUT
Capitoli 2 e 3

This Photo by Unknown Author is licensed under CC BY-SA


Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 1
Obiettivi dell’Unità
 Input di dati numerici e testuali (stringhe)
 Formattazione dell’output
 Implementare decisioni con l’istruzione if
 Confrontare numeri (interi e floating-point) e stringhe
 Scrivere istruzioni usando dati di tipo booleano
 Validare l’input
In questa Unità imparerete a codificare in Python
decisioni semplici e complesse. Imparerete inoltre ad
applicare quanto appreso al controllo dei dati forniti in
input e alla validazione dei risultati.

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 2


Contenuti
 Input di dati e formattazione dell’output
 L’istruzione if
 Operatori relazionali
 Decisioni annidate
 Condizioni con scelta multipla
 Variabili e operatori booleani
 Analisi di stringhe
 Applicazione: validazione degli input

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 3


Input 2.5

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 4


Input e Output
Il tuo programma Python
in esecuzione
nell’interprete Python
Output
Input
Python Console
(Terminale, Prompt dei
comandi)

Utente
Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 5
Input e output
 Puoi leggere una stringa dalla console con la funzione input():
o name = input("Inserisci il tuo nome")
 Se serve un input numerico (invece che una stringa), si deve
convertire la stringa in un numero (intero o virgola mobile)
ageString = input("Inserisci la tua età: ") # String
age = int(ageString) # Conversione a int
 …si può fare in una singola istruzione:
age = int(input("Inserisci la tua età: "))
price = float(input("Inserisci il prezzo: "))

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 6


Output Formattato 2.5

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 7


Output formattato
 Talvolta è opportuno inserire dei valori numerici in stringhe di testo
in modo da ottenere un output più chiaro e ordinato da
visualizzare
 Python offre diverse soluzioni:
o print() con più parametri separati da ,
o concatenazione di stringhe
o f-Strings Non saranno trattati in dettaglio
o l’operatore di formattazione % • utili per chi programmerà in C
o il metodo .format() • vedere https://pyformat.info/
per informazioni

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 8


Confronto dei metodi
pi = 3.14
r = 2
area = (r**2) * pi
print("L'area di un cerchio di raggio", r, 'è', area)
print("L'area di un cerchio di raggio " + str(r) + ' è ' +
str(area))
print(f"L'area di un cerchio di raggio {r} è {area}")
print('L'area di un cerchio di raggio %f è %f' % (r, area))
print('L'area di un cerchio di raggio {r} è {a}'.format(r=r,
a=area))

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 9


f-String (stringhe formattate)
 Una stringa formattata o f-String è una stringa preceduta dal
carattere 'f' o 'F'
 Queste stringhe possono contenere dei campi sostituibili, nella
forma di espressioni racchiuse tra parentesi graffe {}.
 Mentre le stringhe classiche hanno normalmente un valore
costante, le f-String sono praticamente espressioni valutate al
momento dell’esecuzione.
 Le f-String non sono trattate nel libro. Per approfondimenti:
https://docs.python.org/3/reference/lexical_analysis.html#f-strings
https://realpython.com/python-f-strings/

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 10


f-string: sintassi
 In una f-string, le parentesi graffe possono contenere:
o variabili definite nelle linee di codice precedenti
f"il risultato è {result}"
il risultato è 5
o espressioni aritmetiche che coinvolgono una o più variabili o valori definiti
nelle linee di codice precedenti
f"la somma è {a + b}"
la somma è 15

 Aggiungendo il simbolo =, è inserito anche il nome della variabile


o utile per debug
f"il risultato è {result=}"
il risultato è result=5

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 11


Formattazione nelle f-string
 La stampa di numeri floating point può sembrare strana:
o Prezzo per litro: 1.21997
 È possibile modificare il formato in cui vengono stampati i valori,
utilizzando degli specificatori di formato
 Gli specificatori di formato possono essere inclusi tra le graffe,
separati dal simbolo :
prezzo = 1.21997
f"il prezzo per litro è {prezzo:8.2}"

il prezzo per litro è 1.22

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 12


Specificatori di formato nelle f-string
 Tutti gli specificatori dopo il carattere ':' sono opzionali:
o carattere di riempimento (solo se è specificato l'allineamento): es. _*?
o allineamento: < > ^
o segno: + - spazio
o #: forma ‘alternativa’
o ampiezza: es. 20
o carattere di raggruppamento delle migliaia: , _
o '.' e precisione: es. .2
o tipo di conversione: es. f
 Per approfondimenti:
o https://docs.python.org/3/library/string.html#formatspec
o http://cis.bentley.edu/sandbox/wp-content/uploads/Documentation-on-f-strings.pdf

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 13


Opzioni di allineamento
Option Meaning
Forces the field to be left-aligned within the available space (this is the default for most
'<'
objects).
Forces the field to be right-aligned within the available space (this is the default for
'>'
numbers).
Forces the padding to be placed after the sign (if any) but before the digits. This is used for
'=' printing fields in the form ‘+000000120’. This alignment option is only valid for numeric
types.
'^' Forces the field to be centered within the available space.

https://docs.python.org/3/library/string.html#formatspec
Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 14
Opzioni di segno

Option Meaning
'+' indicates that a sign should be used for both positive as well as negative numbers.
'-' indicates that a sign should be used only for negative numbers (this is the default behavior).
indicates that a leading space should be used on positive numbers, and a minus sign on
space
negative numbers.

https://docs.python.org/3/library/string.html#formatspec
Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 15
Tipo di conversione
Value Type Meaning
str 's' String format. This is the default type for strings and may be omitted.
'b' Binary format. Outputs the number in base 2.
'c' Character. Converts the integer to the corresponding unicode character before printing.
'd' Decimal Integer. Outputs the number in base 10.
int
'o' Octal format. Outputs the number in base 8.
'x' / 'X' Hex format. Outputs the number in base 16, using lower/upper-case letters
'n' Number. Same as 'd', except that it uses the current locale setting to insert the appropriate number separator characters.
'e' / 'E' Exponent notation. Prints in scientific notation using the letter ‘e’ or ‘E’ to indicate the exponent. Default precision is 6.
'f' Fixed-point notation. Displays as a fixed-point number. Default precision is 6.
'F' Fixed-point notation. Same as 'f', but converts nan to NAN and inf to INF.
General format. For a given precision p, rounds the number to p significant digits and then formats the result in either fixed-point
'g'
format or in scientific notation, depending on its magnitude. Default precision is 6.
float
'G' General format. Same as 'g' except switches to 'E' if the number gets too large.
'n' Number. Same as 'g', except that it uses the current locale setting to insert the appropriate number separator characters.
'%' Percentage. Multiplies the number by 100 and displays in fixed ('f') format, followed by a percent sign.
Similar to 'g', except that fixed-point notation, when used, has at least one digit past the decimal point. The default precision is as
None high as needed to represent the particular value.

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 16


Operatore di formattazione %
 L’operatore % permette di controllare il modo in cui un numero è
rappresentato
"string with %format specifiers" % ( value, value, … )
 Esempio: "Prezzo per litro: %.2f" % (price)
o Ogni indicatore di formato viene sostituito, nell’ordine, da un valore
calcolato o presente in una variabile
o La formattazione è controllabile dall’utente.

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 17


Principali specificatori di formato
 %s – Stringa (o altri oggetti rappresentabili come stringa, ad
esempio numeri)
 %d – Numero intero
 %f – Numero in floating point
 %.<number of digits>f – Numero floating point con un numero
fisso di cifre dopo il punto decimale
 %x/%X – Numero intero rappresentato in base 16 (hex)
(minuscolo/maiuscolo)

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 18


Altri specificatori di formato
 %c – Carattere Unicode corrispondente al valore numerico
 %b – Numero intero rappresentato in binario
 %o – Numero intero rappresentato in ottale
 %n – come %d, ma usa il separatore decimale delle impostazioni
locali
 %e oppure %E – Numero rappresentato in notazione esponenziale
(minuscolo/maiuscolo)
 %g oppure %G – Formato generale, approssima il numero alla p-
esima cifra decimale, di default p = 6 (minuscolo/maiuscolo)
 % – percentuale: moltiplica per 100 e aggiunge '%' al termine

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 19


Output formattato
 Esempi
print("Prezzo per litro %.2f" %(price))
Prezzo per litro 1.22
print("Prezzo per litro %10.2f" %(price))
Prezzo per litro 1.22

10 spazi 2 spazi

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 20


Sintassi: operatore di formattazione

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 21


Indicatori di formato: esempi
 Giustifica una stringa a sinistra:
print("%-10s" %("Total:"))

 Giustifica a destra un numero con due cifre decimali


print("%10.2f" %(price))

 È possibile usare indicatori multipli per stampare più dati:


print("%-10s%10.2f" %("Total: ", price))

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 22


Indicatori di formato: esempi

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 23


Indicatori di formato: regola generale
 Carattere '%'
 Flag di conversione (opzionale) – es. -
 Lunghezza minima del campo (opzionale) – es. 20
 '.' e "precisione" (opzionale) – es. .2
 Un carattere che indica il tipo di conversione – es. f

https://docs.python.org/3/library/string.html#formatspec
Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 24
Indicatori di formato: carattere di conversione
Carattere Significato
'd' / 'i' Signed integer decimal.
'o' Signed octal value.
'x' / 'X' Signed hexadecimal (lowercase/uppercase).
'e' / 'E' Floating point exponential format (lowercase/uppercase).
'f' / 'F' Floating point decimal format.
Floating point format. Uses lowercase exponential format if exponent is less than -4 or not less
'g' / 'G'
than precision, decimal format otherwise.
'c' Single character (accepts integer or single character string).
'r' String (converts any Python object using repr()).
's' String (converts any Python object using str()).
'a' String (converts any Python object using ascii()).
'%' No argument is converted, results in a '%' character in the result.

https://docs.python.org/3/library/string.html#formatspec
Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 25
Indicatori di formato: flag di conversione
Flag Meaning
'#' The value conversion will use the “alternate form”.
'0' The conversion will be zero padded for numeric values.
'-' The converted value is left adjusted (overrides the '0' conversion if both are given).
(a space) A blank should be left before a positive number (or empty string) produced by a
' '
signed conversion.
'+' A sign character ('+' or '-') will precede the conversion (overrides a “space” flag).

https://docs.python.org/3/library/string.html#formatspec
Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 26
Esempio: volume2.py
##
# Visualizza il prezzo per oncia di una confezione di sei lattine
#
# Definisce una constante per la dimensione della confezione.
CANS_PER_PACK = 6
# Acquisisce il prezzo per confezione e il volume di una lattina.
userInput = input("Please enter the price for a six-pack: ")
packPrice = float(userInput)

userInput = input("Please enter the volume for each can (in ounces): ")
canVolume = float(userInput)

# Calcola il volume di una confezione.


packVolume = canVolume * CANS_PER_PACK

# Calcola e visualizza il prezzo per oncia.


pricePerOunce = packPrice / packVolume
print("Price per ounce: %8.2f" % pricePerOunce)

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 27


Confronto tra metodi di formattazione
OPERATORE % F-STRING

 "your age is %d" % (age)  f"your age is {age}"


 Stringa di formato  Stringa preceduta dalla lettera "f"
 % placeholder  {…} placeholder
o Specifica il tipo di dato e le opzioni di o Specifica quale variabile andrà a
formattazione sostituire
o Può anche contenere un’espressione o Può anche contenere un’espressione
 Il valore è inserito prendendolo  {age} è una variabile esistente
dai numeri in %(val, val,…) nel codice Python in esame
rispettando l’ordine

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 28


Esercizio
Dal modulo math abbiamo importato la costante pi = 3.141592653...
Indicare le istruzioni corrette per stampare il seguente messaggio,
con 2 sole cifre decimali: "Valore approssimato: 3.14"
o print("Valore approssimato: " + round(pi, 2))
o print("Valore approssimato: ", pi)
o print(f"Valore approssimato: {pi:4.2f}")
o print(f"Valore approssimato: {pi:5.2f}")
o print(f"Valore approssimato: {pi:.2f}")
o print(f"Valore approssimato: {pi:?^-#4.2f}")
https://fbr.io/join/lqavm

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 29


L’istruzione if 3.1

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 30


L’istruzione if
 In un programma è sovente necessario prendere delle decisioni in
base al valore di ingresso o di variabili interne
 Per esempio, nella costruzione dei palazzi (in America) si “salta”
spesso il 13° piano, e così devono fare gli ascensori
o Ad esempio il 14° piano è in realtà il 13° piano
o Quindi il numero di ogni piano sopra al 12°, è in realtà ‘piano – 1’.
o In pseudo-codice: if floor > 12, actual_floor = floor - 1
 Le due keyword che realizzano un costrutto condizionale sono:
o if
L’istruzione if permette a un programma
o else
di fare cose diverse in base al valore dei
dati che sta elaborando.

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 31


Flowchart dell’istruzione if
 Uno solo dei due rami è eseguito: Diramazione VERA (if) o
Diramazione FALSA (else)

Indentazione:
Le istruzioni da eseguire
nella diramazione if o
else devono essere
indentate di alcuni spazi

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 32


Flowchart con il solo ramo VERO
 Un’istruzione if può comparire da sola (senza il ramo ‘Falso’)

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 33


Sintassi 3.1: L’istruzione if

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 34


Esempio: elevatorsim.py
##
# Questo programma simula il pannello di comando di un
# ascensore che salta il tredicesimo piano.
#
# Acquisisce il numero del piano come numero intero.
floor = int(input("Floor: "))

# Corregge il numero del piano, se necessario.


if floor > 13:
actualFloor = floor - 1
else:
actualFloor = floor

# Visualizza il risultato.
print("The elevator will travel to the actual floor", actualFloor)

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 35


Esecuzione del programma
 Indicare il risultato eseguendo il programma con diversi valori in
input
o Prova con valori minore di 13
o Esegui il programma con un valore maggiore di 13
o Cosa succede se viene inserito il numero 13?

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 36


I Compound Statement
 Alcuni costrutti Python sono compound statement (istruzioni
composte).
o L’istruzione if è un esempio di compound statement
 I compound statement si sviluppano su più di una riga di codice e
consistono di un header (intestazione) e di blocco di istruzioni
 I compound statement richiedono un “:” alla fine dell’ header:
if <condition>: header
<instr 1>
compound statement <instr 2> blocco di istruzioni

<instr n>
else:

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 37


I Compound Statement
 Il blocco di istruzioni è un insieme di una o più istruzioni, tutte con la
stessa indentazione
 Il blocco di istruzioni
o Inizia sulla riga successiva all’header
o Contiene tutte le istruzioni indentate rispetto all’header
o Si conclude quando si trova un’istruzione con un livello di indentazione inferiore
 Quasi tutti gli IDE indentano automaticamente i blocchi.
if <condition>: header
<instr 1>
compound statement <instr 2> statement block

<instr n>
else:

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 38


I Compound Statement
 I blocchi di istruzioni possono essere annidati all’interno di altri
blocchi di istruzioni
 Nel caso dell’istruzione if il blocco di istruzioni specifica:
o Le istruzioni che devono essere eseguite se la condizione è vera
o … o saltate se la condizione è falsa
 I blocchi di istruzioni sono indentati anche per fornire all’utente un
aiuto visivo nel capire la logica e il flusso del programma

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 39


Consigli sull’indentazione dei blocchi
 Lascia che sia PyCharm ad indentare … (menu: Code – Auto-Indent lines)

 Questo codice è chiamato “strutturato a blocchi”. Indentare


correttamente non solo è obbligatorio in Python, ma permette anche
di rendere il codice più leggibile.
Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 40
Errore comune
 Bisogna evitare di duplicare il codice nelle diramazioni
 Se lo stesso codice è eseguito in entrambe le diramazioni, allora si
può muovere fuori dall’ if.

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 41


L’operatore condizionale
 Una “scorciatoia” che potreste trovare in Python
o Non è usata in questo corso
o Può essere utilizzata ovunque serva inserire un valore

True branch Condition False branch

La complessità non è utile quando si programma….


Questa “scorciatoia” è difficile da leggere e può creare confusione

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 42


Operatori relazionali
3.2

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 43


Operatori relazionali
 Ogni istruzione if è associata a una condizione che generalmente
confronta due valori con un operatore

if floor > 13:


..
if floor >= 13:
..
if floor < 13:
..
if floor <= 13:
..
if floor == 13:
..
if floor != 13:
..

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 44


Modifica del programma elevatorsim.py
 Modificare il codice in modo che il programma controlli l’input
dell’utente
o Se l’input è 13, setti il valore a 14 e stampi un messaggio
 L’operatore di uguaglianza è “==”
Avvertenza:
Non confondere = con ==
= dichiara una variabile
= assegna un valore
== confronta due valori

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 45


Assegnazione vs. Test di uguaglianza
 Assegnazione:
floor = 13

 Test di uguaglianza: controlla che qualcosa sia vero


if floor == 13:
Mai confondere
=
con
==

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 46


Confronto di stringhe
 Verificare se due stringhe sono uguali
if name1 == name2:
print("The strings are identical")

 Verificare se due stringhe sono diverse


if name1 != name2:
print("The strings are not identical")

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 47


Verifica di uguaglianza fra stringhe
 Se uno qualunque dei caratteri è diverso, le stringhe non sono
uguali:

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 48


L’ordine alfabetico
 Per confrontare due stringhe alfabeticamente si usa un operatore
relazionale:
o string1 < string2
 L’ordine delle lettere è definito dal codice Basic Latin (ASCII) Subset
of Unicode
o Le lettere MAIUSCOLE vengono prima delle minuscole
• ‘A’ viene prima di ‘a’, ma anche ‘Z’ viene prima di ‘a’
o Lo ‘spazio’ viene prima di tutti i caratteri stampabili
o I numeri (0-9) vengono prima delle lettere
o L’ordine delle lettere accentate non è sempre logico né corretto….

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 49


Operatori relazionali: esempi

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 50


Esempio: compare.py (1)
##
# Questo programma effettua confronti tra numeri e tra stringhe
#
from math import sqrt
# Confronti tra numeri interi
m = 2 Eseguire il programma
n = 4
if m * m == n: con diversi input.
print("2 times 2 is four.")

# Confronti tra numeri in virgola mobile (floating-point).


x = sqrt(2)
y = 2.0
if x * x == y:
print("sqrt(2) times sqrt(2) is 2")
else:
print("sqrt(2) times sqrt(2) is not two but %.18f" % (x * x))

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 51


Esempio: compare.py (2)
EPSILON = 1E-14
if abs(x * x - y) < EPSILON:
print("sqrt(2) times sqrt(2) is approximately 2")

# Confronti tra stringhe


s = "120"
t = "20"
if s == t:
comparison = "is the same as"
else:
comparison = "is not the same as"
print("The string '%s' %s the string '%s'." % (s, comparison, t))

u = "1" + t
if s != u:
comparison = "not "
else:
comparison = ""
print("The strings '%s' and '%s' are %sidentical." % (s, u, comparison))
Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 52
Errore comune: Floating Point
 I numeri in floating-point hanno una precisione limitata (dal
numero di bit) e i calcoli su di essi possono introdurre errori di
approssimazione.
 Bisogna tenere conto di questi errori quando si confrontano
numeri in floating-point.

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 53


Errore comune: Floating Point (2)
 Esempio: il codice moltiplica la radice quadrata di 2 per se stessa.
r = sqrt(2.0)
if r * r == 2.0:
print("sqrt(2.0) squared is 2.0")
else:
print("sqrt(2.0) squared is not 2.0 but", r * r)

 Ci aspetteremmo 2 come risultato, ma:


Output:
sqrt(2.0) squared is not 2.0 but 2.0000000000000004

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 54


Soluzione 1: uso di una costante EPSILON
 Si può utilizzare una valore molto piccolo per verificare se la
differenza tra due numeri floating-point è ‘abbastanza piccola’
 Considero i due numeri uguali se la loro differenza è minore di un
certo limite EPSILON: x e y sono "uguali" se | x – y | < ε

EPSILON = 1E-14
r = sqrt(2.0)
if abs(r * r - 2.0) < EPSILON:
print("sqrt(2.0) squared is approximately 2.0")

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 55


Soluzione 2: uso di math.isclose()
 Il confronto a meno di un errore può essere ottenuto anche con la
funzione isclose() del modulo math
from math import isclose
if isclose( r*r, 2.0 ):
 Opzionalmente, si può indicare l’errore assoluto (scrivendo
rel_tot = x) e/o l’errore relativo (abs_tot = x)

𝑎 − 𝑏 ≤ max 𝑟𝑒𝑙𝑡𝑜𝑡 ∙ max 𝑎 , 𝑏 , 𝑎𝑏𝑠𝑡𝑜𝑡

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 56


Precedenze degli operatori
 Gli operatori aritmetici hanno la precedenza sugli operatori
relazionali.
 Il calcolo è fatto PRIMA del confronto
 Nella maggior parte dei casi i calcoli sono a destra dell’operatore di
confronto o assegnazione.
Calcolo

actualFloor = floor + 1

if floor > height + 1:

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 57


Esempio: vendite
 Un negozio di computer propone per la giornata del 24 ottobre
un'offerta chiamata "Kilobyte Day sale". L’offerta garantisce uno
sconto dell’8% su tutti gli accessori per computer il cui prezzo è
inferiore a $ 128, e del 16% se il prezzo è almeno $ 128.
 Scrivere un programma che dato il prezzo di un accessorio, ne
fornisce il prezzo scontato.

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 58


Esempio – Vendite - Suggerimenti
1) Definire la condizione di diramazione dei rami dell’esecuzione
o Original price < 128 ?
2) Scrivere lo pseudo-codice per il ramo "vero"
o Discounted price = 0.92 * original price
3) Scrivere lo pseudo-codice per il ramo "falso"
o Discounted price = 0.84 * original price

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 59


Esempio – Vendite - Suggerimenti
4) Controllare più volte gli operatori di confronto
o Test con valori uguali, minori e superiori al confronto (127, 128, 129)
5) Rimuovere duplicazioni di codice
o Discounted price = _____ * original price
6) Pensare ai test per controllare entrambi i rami dell’esecuzione
o Discounted price = 0.92 * 100 = 92
o Discounted price = 0.84 * 200 = 168
7) Scrivere il codice Python

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 60


Soluzione: sale.py
##
# Calcola lo sconto per un determinato acquisto.
#

# Acquisisce il prezzo originale.


originalPrice = float(input("Original price before discount: "))

# Determina la percentuale di sconto da applicare.


if originalPrice < 128:
discountRate = 0.92
else:
discountRate = 0.84

# Calcola e visualizza il prezzo scontato.


discountedPrice = discountRate * originalPrice
print("Discounted price: %.2f" % discountedPrice)

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 61


Verifica della soluzione
 Si esegua il programma diverse volte provando:
o Prezzi minori di $ 128
o Prezzi maggiori di $ 128
o Prezzo uguale a $ 128
o Prezzi non validi (ad esempio negativi)

 Che risultati ottengo?


if originalPrice < 128:
discountRate = 0.92
else:
discountRate = 0.84
discountedPrice = discountRate * originalPrice

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 62


Decisioni annidate
3.3

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 63


Flowchart di un if annidato
Ask for order  L'if-else è annidato
all’interno di un
True
ramo true.
False
Wine? Check ID  Ci sono tre cammini
diversi.
Serve non- False >= True
alcoholic 21?
drink

Read law Serve wine

Done
Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 64
Diramazioni annidate
 È possibile annidare un if all’interno di una delle due diramazioni di
un altro if.
 Semplice esempio: Ordinare una bevanda (pseudo codice)
Ask the customer for his/her drink order
if customer orders wine
Ask customer for ID
if customer’s age is 21 or over
Serve wine
IF annidato
else
Politely explain the law to the customer
else
Serve customer a non-alcoholic drink

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 65


Esempio Tasse: if annidati
 Quattro possibilità (rami)

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 66


Esempio Tasse - Flowchart
 Quattro rami

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 67


Esempio: taxes.py (1)
##
# Calcola le tasse sul reddito usando uno schema semplificato.
#

# Inizializza costanti per le aliquote e per i limiti degli scaglioni.


RATE1 = 0.10
RATE2 = 0.25
RATE1_SINGLE_LIMIT = 32000.0
RATE1_MARRIED_LIMIT = 64000.0

# Legge il reddito e lo stato civile.


income = float(input("Please enter your income: "))
maritalStatus = input("Please enter s for single, m for married: ")

# Calcola le tasse dovute.


tax1 = 0
tax2 = 0

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 68


Esempio: taxes.py (2)
if maritalStatus == "s":
if income <= RATE1_SINGLE_LIMIT:
tax1 = RATE1 * income
else:
tax1 = RATE1 * RATE1_SINGLE_LIMIT
tax2 = RATE2 * (income - RATE1_SINGLE_LIMIT)
else:
if income <= RATE1_MARRIED_LIMIT:
tax1 = RATE1 * income
else:
tax1 = RATE1 * RATE1_MARRIED_LIMIT
tax2 = RATE2 * (income - RATE1_MARRIED_LIMIT)

totalTax = tax1 + tax2

# Visualizza il risultato
print("The tax is $%.2f" % totalTax)

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 69


Ramo ‘Vero’ in Taxes.py
 Ci sono due ulteriori rami all’interno del ramo ‘vero’

if maritalStatus == "s":
if income <= RATE1_SINGLE_LIMIT:
tax1 = RATE1 * income
else:
tax1 = RATE1 * RATE1_SINGLE_LIMIT
tax2 = RATE2 * (income - RATE1_SINGLE_LIMIT)

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 70


Ramo ‘Falso’ in Taxes.py
 Ci sono due ulteriori rami all’interno del ramo ‘falso’

else:
if income <= RATE1_MARRIED_LIMIT:
tax1 = RATE1 * income
else:
tax1 = RATE1 * RATE1_MARRIED_LIMIT
tax2 = RATE2 * (income - RATE1_MARRIED_LIMIT)

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 71


Esempio Tasse - esecuzione
 Si esegua il programma più di una volta utilizzando valori diversi
per reddito e stato civile:
o Si usi un reddito minore di $32,000
o Si usi un reddito superiore a $64,000
o Si metta “&” come stato civile
 Che risultati si ottengono? Perché?

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 72


Modifica del programma elevatorsim.py
 Modificare il programma dell’ascensore in modo che consideri
anche il numero 17 come numero sfortunato
o Il programma salta sia il 13 che il 17 nella "numerazione" dei piani.

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 73


Hand-tracing (tracciare a mano)
 L’Hand-tracing è un metodo che aiuta a capire se un programma
funziona correttamente. Consiste nel tracciare a mano su un foglio
l’evoluzione delle variabili.
 Crea una tabella della variabili più importanti
o Tieni traccia dei loro valori (con carta e penna)
 Utilizza il codice (o lo pseudocodice) per tracciare l’esecuzione del
programma
 Utilizza dati di input di esempio che:
o generino un risultato prevedibile e noto
o testino tutti i rami del codice

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 74


Hand-tracing - Esempio Tasse (1)
Setup:
 Tabella delle variabili
 Valori inziali

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 75


Hand-tracing - Esempio Tasse (2)
Variabili di input:
 Lette dall’utente
 Aggiornare la tabella

Siccome marital status non è “s”, eseguiamo solo il ramo else alla riga 19

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 76


Hand-tracing - Esempio Tasse (3)
 Dato che il reddito non è <= 64000, il codice va alla linea 28
o Aggiornare le variabili delle righe 29 e 30
o Usare le costanti definite nel codice

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 77


Scelte multiple 3.4

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 78


Scelte multiple
 Come comportarsi se ci sono più di due alternative (vero/falso)?
 Esempio: determinare gli effetti di un terremoto in base al valore
della sua intensità in base alla scala Richter
o 8 (o superiore)
o Da 7 a 7.99
o Da 6 a 6.99
o Da 4.5 a 5.99
o Inferiore a 4.5

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 79


Flow-chart di scelte
multiple

Bisogna testare le
condizioni più generali
dopo le condizioni più
specifiche.

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 80


Scelte multiple con if
Che cosa non va con questo codice?
if richter >= 8.0:
print("La maggior parte delle strutture cade")
if richter >= 7.0:
print("Molti edifici vengono distrutti")
if richter >= 6.0:
print("Molti edifici vengono significativamente \
danneggiati e alcuni collassano")
if richter >= 4.5:
print("Danni a edifici costruiti in modo non adeguato")
if richter < 4.5:
print("Nessun edificio distrutto")

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 81


Scelte multiple con if, else
if richter >= 8.0: # gestisce il 'caso speciale' per primo
print("La maggior parte delle strutture cade")
else:
if richter >= 7.0:
print("Molti edifici vengono distrutti")
else:
if richter >= 6.0:
print("Molti edifici vengono significativamente \
danneggiati e alcuni collassano")
else:
if richter >= 4.5:
print("Danni a edifici costruiti in modo non adeguato")
else: # il 'caso generale' è gestito alla fine
print("Nessun edificio distrutto")

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 82


Istruzione elif
 Abbreviazione di: else, if…
 Appena una delle condizioni di test è vera, il relativo blocco di
istruzioni viene eseguito
o I rimanenti test non vengono valutati
 Se nessun test ha successo, viene eseguito l’else finale

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 83


Scelte multiple con if, elif
if richter >= 8.0: # gestisce il 'caso speciale' per primo
print("La maggior parte delle strutture cade")
elif richter >= 7.0:
print("Molti edifici vengono distrutti")
elif richter >= 6.0:
print("Molti edifici vengono significativamente \
danneggiati e alcuni collassano")
elif richter >= 4.5:
print("Danni a edifici costruiti in modo non adeguato")
else: # il 'caso generale' è gestito alla fine
print("Nessun edificio distrutto")

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 84


Soluzione – terremoto.py
##
# Questo programma visualizza la descrizione di un terremoto,
# data la sua magnitudo sulla scala Richter.

# Acquisisce la magnitudo dall'utente.


richter = float(input("Enter a magnitude on the Richter scale: "))
# Visualizza la descrizione
if richter >= 8.0: Eseguire il programma
print("La maggior parte delle strutture cade") con diversi input.
elif richter >= 7.0:
print("Molti edifici vengono distrutti")
elif richter >= 6.0:
print("Molti edifici vengono significativamente danneggiati e \
alcuni collassano")
elif richter >= 4.5:
print("Danni a edifici costruiti in modo non adeguato")
else:
print("Nessun edificio distrutto")

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 85


Istruzione pass
 Nello sviluppo del codice, può risultare conveniente scrivere prima
lo ‘scheletro’ della logica di funzionamento, per poi ‘riempire’ le
istruzioni in un secondo momento
o Dal punto di vista sintattico, però, non è possibile avere un blocco if:, else:,
elif: senza alcuna istruzione
if num > 0:
 pass è un’istruzione ‘speciale’, che non # caso positivo
fa nulla, ma permette la scrittura pass
sintatticamente corretta (in fase di sviluppo), elif num < 0:
e prima o poi sarà sostituita da codice ‘vero’ # caso negativo
pass
else:
# caso nullo
pass

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 86


Variabili e Operatori
Booleani 3.7

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 87


La logica Booleana degli elaboratori elettronici
 Nel 1847 George Boole introdusse un nuovo tipo di formalismo
logico, basato esclusivamente su enunciati che potevano essere
veri o falsi.
 Gli elaboratori utilizzano la logica booleana

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 88


Variabili Booleane
 Una variabile Booleana può solo essere Vera o Falsa (1 o 0)
 bool è un tipo di dato in Python (può avere i valori True e False)
 Una variabile Booleana è spesso utilizzata come flag 🏁 (indicatore)
proprio perché può essere solo vera o falsa
o trovato = True
 La condizione di un’istruzione if è un valore Booleano
 Più condizioni Booleane possono essere combinate insieme
tramite (uno o più) operatori Booleani
 Gli operatori Booleani principali sono tre: and, or, not
o Sono gli unici operatori Booleani predefiniti in Python.

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 89


Condizioni multiple: and
 Combinare condizioni Booleane è utile, ad esempio, nel controllare
se un valore cade in un certo intervallo
if temp > 0 and temp < 100:
print("Liquid")

 Entrambe le condizioni in un and devono


essere VERE affinché il risultato sia VERO
 C'è una sola riga nella tavola di verità
in cui A and B è vero: quando entrambe
le variabili sono vere.

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 90


Flowchart dell’operatore and
 E' una forma di ‘range checking’
o Utilizzato per verificare se un valore cade in
un certo intervallo

if temp > 0 and temp < 100:


print("Liquid")

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 91


Operatori di confronto concatenati
 Linguaggio corrente: “Se la temperatura è tra 0 e 100 …”
 In matematica: 0 ⩽ temp ⩽ 100
 In Python: 0 <= temp and temp <= 100
 Si può anche scrivere: 0 <= temp <= 100
o Python permette l’uso di operatori relazionali concatenati
o La maggior parte degli altri linguaggi di programmazione non lo permette
 Gli operatori relazionali possono essere combinati a piacimento
o a < temp > b corrisponde a temp > a and temp > b

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 92


Condizioni multiple: or
 Si utilizza l’or se una delle condizioni deve essere Vera affinché la
condizione multipla sia Vera:
if temp <= 0 or temp >= 100:
print("Not liquid")

 Se una qualunque delle condizioni è vera,


il risultato è Vero.
 C'è una sola riga nella tavola di verità
in cui A or B è falso: quando entrambe
le variabili sono false.

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 93


Flowchart dell’or
 Un’altra forma di ‘range checking’
o Controlla se il valore è FUORI
dall’intervallo

if temp <= 0 or temp >= 100:


print("Not Liquid")

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 94


L’operatore not
 Se c’è bisogno di invertire una variabile booleana o il risultato di un
confronto, si deve utilizzare il not
if not attending or grade < 60:
print("Drop?")

if attending and not(grade < 60):


print("Stay")

 Per chiarezza, provare a rimpiazzare il not con altri operatori


o if not(grade < 60): è equivalente a if grade >= 60:
o if not(a == b): è equivalente a if a != b:

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 95


Ricordarsi una condizione
 Le variabili Booleane possono essere usate per ‘ricordarsi’ una
certa condizione, e testarla più avanti.

isLiquid = temp > 0 and temp < 100


if temp > 0 and temp < 100: # Boolean value True/False
print("Liquid")
if isLiquid:
print("Liquid")

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 96


Esempio: compare2.py
##
# Questo programma confronta numeri usando espressioni booleane.
#
x = float(input("Enter a number (such as 3.5 or 4.5): "))
y = float(input("Enter a second number: "))
if x == y:
print("They are the same.")
else:
if x > y:
print("The first number is larger") Eseguire il programma
else:
print("The first number is smaller") con diversi input.
if -0.01 < x - y and x - y < 0.01:
print("The numbers are close together")
if x > 0 and y > 0 or x < 0 and y < 0:
print("The numbers have the same sign")
else:
print("The numbers have different signs")

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 97


Esempio di Operatori Booleani

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 98


Errori comuni con le condizioni Booleane
 Confondere and con or
o È un errore sorprendentemente comune confondere and e or.
o Un valore cade tra 0 e 100 se vale almeno 0 and al più 100.
o È fuori dall’intervallo se è minore di 0 or maggiore di 100.
 Non c’è una regola fissa. Bisogna pensarci con attenzione.

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 99


Valutazione delle condizioni: and
 Condizioni multiple sono valutate da sinistra a destra
 Se la parte sinistra di una condizione and è falsa, è inutile valutare
la parte destra.
if temp > 0 and temp < 100:
print("Liquid")

Done!

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 100


Valutazione delle condizioni: or
 Se la parte sinistra dell’or è vera, è inutile valutare la parte destra.

if temp <= 0 or temp >= 100:


print("Not Liquid")

Done!

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 101


Qualche proprietà
 Commutativa:
o A and B = B and A
o A or B = B or A
 Associativa:
o A and B and C = (A and B) and C = A and (B and C)
o A or B or C = (A or B) or C = A or (B or C)
 Distributiva:
o A and (B or C) = A and B or A and C
o A or (B and C) = (A or B) and (A or C)

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 102


Dimostrazione
 Se due espressioni booleane hanno la stessa tavola di verità, allora
sono equivalenti.
o l'ordine di righe e colonne è indifferente
 Esempio: A and B e B and A sono equivalenti
A B A and B B A B and A
0 0 0 0 0 0
0 1 0 0 1 0
1 0 0 1 0 0
1 1 1 1 1 1

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 103


La legge di De Morgan
 La legge di De Morgan spiega come negare una combinazione di
and e or:
o not(A and B) è la stessa cosa di not(A) or not(B)
o not(A or B) è la stessa cosa di not(A) and not(B)
 Esempio: Una spedizione al di fuori degli USA o per AK (Alaska) e
HI (Hawaii) è più costosa.
if not (country == "USA" if (country != "USA"
and state != "AK" or state == "AK"
and state != "HI"): or state == "HI"):
shippingCharge = 20.00 shippingCharge = 20.00

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 104


Indicare il valore delle espressioni Booleane
 A or 1
 A or 0
 A and 0
 A and 1
 A and A
 A and (not A)
 A or (not A)
 A or (A and B)
 A or (not A and B) https://fbr.io/LQAVM

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 105


Analisi di Stringhe 3.8

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 106


L’operatore in
 Per sapere se una stringa contiene al suo interno una certa
sottostringa si usa l'operatore in.
 name = "John Wayne"
"Way" in name
L'espressione restituisce Vero perché la sottostringa "Way"
appare all’interno della variabile name
 L’operatore not in è l’inverso dell’operatore in

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 107


Sottostringhe: suffissi
 Supponiamo di avere un nome di un file in una stringa, e di dover
verificare che abbia la corretta estensione
if filename.endswith(".html"):
print("This is an HTML file.")

 Il metodo endswith() applicato a una stringa, restituisce Vero se


la stringa termina con la sottostringa fornita come parametro,
altrimenti restituisce Falso.

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 108


Operazioni per analizzare sottostringhe

Per l'elenco completo dei metodi:


https://docs.python.org/3/library/stdtypes.html#text-sequence-type-str

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 109


Esempio: substrings.py
##
# Questo programma illustra vari metodi che verificano
# proprietà di sottostringhe.

# Chiede all’utente una stringa e una sottostringa.


theString = input("Enter a string: ")
theSubString = input("Enter a substring: ")

if theSubString in theString:
print("The string does contain the substring.")

howMany = theString.count(theSubString)
print("It contains", howMany, "instance(s)")

where = theString.find(theSubString)
print("The first occurrence starts at position", where)

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 110


Esempio: substrings.py (2)
if theString.startswith(theSubString):
print("The string starts with the substring.")
else:
print("The string does not start with the substring.")

if theString.endswith(theSubString):
print("The string ends with the substring.")
else:
print("The string does not end with the substring.")

else:
print("The string does not contain the substring.")

Eseguire il programma e testarlo con diverse stringhe e sottostringhe

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 111


Metodi: Testare le caratteristiche di una stringa

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 112


Confronto e Analisi di stringhe

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 113


Validazione degli input
3.9

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 114


Validazione degli input
 Accettare un input senza controllarlo è in generale pericoloso
 Esempio: programma dell’ascensore
o si assuma che il pannello dell’ascensore abbia solo i bottoni da 1 a 20 (ma
senza il 13).
o vogliamo che il programma visualizzi un messaggio d’errore e termini la
propria esecuzione se l'input non è valido.

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 115


Primo controllo: input numerico
 Ci sono due possibilità per controllare se l'input è una sequenza di
cifre numeriche
1. acquisire l'input come stringa e applicare un metodo per l'analisi
delle stringhe.
userInput = input("Floor: ")
if userInput.isdigit():
floor = int(userInput)

else:
print("Error: the input is not numeric")
2. usare il meccanismo delle eccezioni (verrà trattato nel Capitolo 7)

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 116


Secondo controllo: intervallo di valori corretto
 Il numero 13
if floor == 13:
print("Error: There is no thirteenth floor.")

 Zero o un valore negativo


 Un numero maggiore di 20
if floor <= 0 or floor > 20:
print("Error: The floor must be between 1 and 20.")

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 117


Esempio: elevator_inputCheck.py
##
# Questo programma simula il pannello di comando di un ascensore
# che salta il tredicesimo piano, con verifica del dato ricevuto.
#
userInput = input("Floor: ") Testare il programma
if userInput.isdigit(): con vari input, tra cui:
floor = int(userInput)
# Controlla che il dato ricevuto sia valido. • 12
if floor == 13: • 14
print("Error: There is no thirteenth floor.")
elif floor <= 0 or floor > 20: • 13
print("Error: The floor must be between 1 and 20.") • -1
else:
# Ora sappiamo che il dato è valido. • 0
actualFloor = floor • 23
if floor > 13:
actualFloor = floor - 1 • 19
print("The elevator will travel to the actual floor", actualFloor)
else:
print("Error: the input is not numeric")

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 118


Regola generale
 Non fidarsi MAI dell’input dell’utente (non assumere mai che sia
corretto né sensato)
 Quando si legge un input dall’utente, controllare sempre che
contenga valori accettabili, prima di continuare l’esecuzione
 Se il valore letto non è accettabile, stampare un messaggio e:
o Richiedere di inserire nuovamente il valore (vedi i cicli, unità P4)
o Uscire del programma:
from sys import exit
exit("Valore non accettabile") È impossibile rendere tutto il
programma a prova di stupido perchè
gli stupidi sono molto ingegnosi
(variante della legge di Murphy)

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 119


Esempio con exit: elevator_exit.py
##
# Questo programma simula il pannello di comando di un ascensore
# che salta il tredicesimo piano, con verifica del dato ricevuto.
#
from sys import exit
userInput = input("Floor: ")
if not userInput.isdigit():
exit("Error: the input is not numeric")
floor = int(userInput)
# Controlla che il dato ricevuto sia valido.
if floor == 13:
print("Error: There is no thirteenth floor.")
elif floor <= 0 or floor > 20:
print("Error: The floor must be between 1 and 20.")
else:
# Ora sappiamo che il dato è valido.
actualFloor = floor
if floor > 13:
actualFloor = floor - 1
print("The elevator will travel to the actual floor", actualFloor)

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 120


Sommario

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 121


Sommario: istruzione if
 L’istruzione if permette a un programma di eseguire azioni
diverse a seconda dei dati che sta processando.
 Gli operatori relazionali ( < <= > >= == != ) vengono utilizzati
per confrontare numeri e stringhe.
 Le stringhe sono confrontate in ordine alfabetico.
 if multipli possono essere combinati per valutare decisioni
complesse.
 Quando si utilizzino if multipli, si devono prima testare le
condizioni più generali e poi quelle più specifiche.

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 122


Sommario: Bool
 Il tipo di dato booleano ha solo due possibili valori, Vero e Falso
 Python ha due operatori booleani che permettono di combinare
condizioni booleane: and e or.
 Per invertire una condizione, si usa l’operatore not.
 Gli operatori and e or valutano le condizioni da sinistra a destra
o Appena il valore Vero viene determinato, le condizioni rimanenti non sono
valutate.
 La legge di De Morgan spiega come negare condizioni multiple con
and e or.

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 123


Sommario: input/output
 Si utilizzi la funzione input() per leggere dati dal tastiera.
 Se l’input non è una stringa, si usino le funzioni int() o float()
per convertire il testo inserito in numero
 Si utilizzino le definizioni di formato per specificare come i valori
dovrebbero essere formattati (quando si stampano).
 Si utilizzino le f-string per una formattazione ancora più agevole.

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 124


Autovalutazione
https://kahoot.it/
 Studenti PBA – PIRE
Inserire il codice 02097689
 Studenti PIRI – QUAR
Inserire il codice 04955423

 I quiz rimangono aperti fino a lunedì 25 ottobre


 Al termine di ciascun quiz è fornita la risposta corretta.

Politecnico di Torino, 2021/22 INFORMATICA / COMPUTER SCIENCES 125

Potrebbero piacerti anche