Python ha due oggetti built-in che hanno i valori logici True
e False
:
a = True
print(a)
int(a)
type(a)
b = False
print(b)
type(b)
Possiamo operare su questi valori usando la logica di Boole, per esempio con l'operazione and
:
True and True #logical and operation
True and False
False and True
True and True
c = a and b
print(c)
Ci sono anche l'or logico (or
) e la negazione (not
):
True or False
not True
not False
True and not False
Nel codice si ha spesso la necessità di valutare delle espressioni che possono essere vere oppure false (Talvolta dette “predicati”). Gli operatori ==
, !=
, >
,>=
, <
, <=
servono a confrontare i valori di due oggetti.
Restituiscono True
oppure False
.
Per esempio:
x = 30 # assegna 30 to x
x > 15 # x è più grande di 15?
x > 42
x == 30 # x è uguale a 30?
x == 42
not x == 42 # x è diverso da 42? ("not" nega il risultato del confronto x == 42)
x != 42 # x è diverso da 42?
x >= 30 # x è più grande di oppure uguale a 30?
Non è necessario che i due oggetti siano dello stesso tipo. Per esempio:
a = 1.0; b = 1
type(a)
type(b)
a == b
I test logici possono essere combinati con and
or
e not
:
a = 7
b = -3
print( a > b and b > 0 )
print( a > b and not b**2 < a )
print( a < b or b < 0 )
Per verificare se due oggetti sono identici, ovvero se puntano alla stessa locazione di memoria, possiamo usare l'operatore is
;
x = [0, 1, 2]
y = x
x is y
Alternativamente possiamo confrontare gli id
dei due oggetti:
id(x) == id(y)
La costruzione if
permette di eseguire del codice in modo condizionato. Dopo la parola chiave if
deve essere presente una condizione seguita da due punti (:
). Nella riga successiva inizia un nuovo blocco di comandi (che quindi deve essere indentato!) che viene eseguito se la condizione è True.
a = -34
if a > 0:
print("a is positive")
La costruzione if
può avere un branch else
che viene eseguito se la condizione è falsa:
a = -34
if a > 0:
print("a is positive")
else:
print("a is non-positive (i.e. negative or zero)")
Infine, esiste la costruzione elif
(significa “else if”) che permette di di verificare più di due possibilità esclusive. Le verifiche vengono eseguite nell'ordine in cui compaiono. Non appena una delle condizioni è verificata il codice corrispondente viene eseguito e le possibilità seguenti vengono ignorate:
a = 0
if a == 0:
print("a is zero")
elif a < 0:
print("a is negative")
else:
print("a is positive")
Le condizioni possono essere combinate:
a = 5
b = 21
if a > 10 and b > 20:
print("A is greater than 10 and b is greater than 20")
a = 5
b = -21
if a > 10 or b < -5:
print("Either a is greater than 10, or "
"b is smaller than -5, or both.")
I for
-loop permettono di iterare su una sequenza (per esempio una stringa o una lista). Ecco un esempio:
for animal in ['dog','cat','mouse']:
print(animal, animal.upper())
Usando il comando range()
(lezione 3), è possibile iterare su degli interi crescenti o decrescenti:
import math
a =[] # lista vuota
for i in range(5,10):
a.append(math.sin(i*math.pi/2))
print(a)
I for-loop possono essere usate in modo più conciso per creare facilmente sequenze utilizzando la cosiddetta list comprehension:
a = tuple(i**2 for i in range(10)) # ntupla
a
b = [i**0.5/3. for i in range(3,9,2)] # lista
b
c ={i:(i**3-2*i+1) for i in range(4)} # dizionario
c
Se è necessario utilizzare contemporaneamente l'indice e il valore di un elemento di una lista, si può utilizzare la funzione enumerate
:
for i, animal in enumerate(['dog','cat','mouse']):
print(animal*(i+1))
Un esempio che utilizza un dizionario:
order = {} # create an empty dictionary
#add orders as they come in
order['Peter'] = 'Pint of bitter'
order['Paul'] = 'Half pint of Hoegarden'
order['Mary'] = 'Gin Tonic'
#deliver order at bar
for person in order.keys():
# for person in order: shortcut: in a dictionary defaults to the keys
print(person, "requests", order[person])
Un altro esempio per dimostrare il possibile vantaggio nell'uso di un dizionario piuttosto che una coppia di liste:
dic = {} #create empty dictionary
dic["Hans"] = "room 1033" #fill dictionary
dic["Andy C"] = "room 1031" #"Andy C" is key
dic["Ken"] = "room 1027" #"room 1027" is value
for key in dic.keys():
print(key, "works in", dic[key])
Senza usare un dizionario:
people = ["Hans","Andy C","Ken"]
rooms = ["room 1033","room 1031","room 1027"]
#possible inconsistency here since we have two lists
if not len( people ) == len( rooms ):
raise RuntimeError("people and rooms differ in length")
for i in range( len( rooms ) ):
print(people[i],"works in",rooms[i])
a = []
for i in range(3):
for j in range(3):
a.append(i+10*j)
print(a)
Oppure, più concisamente:
[ i + 10*j for i in range(3) for j in range(3)]
La parola chiave while
permette di ripetere una operazione mentre una condizione è vera. Dopo la parola chiave while
deve essere presente una condizione seguita da due punti (:). Nella riga successiva inizia un nuovo blocco di comandi (che quindi deve essere indentato!) che viene eseguito se la condizione è True.
Supponiamo di voler sapere per quanti anni è necessario tenere 100 euro in un conto bancario per arrivare a 200 euro grazie ad un interesse del 5% annuo. Ecco un programma che lo calcola:
mymoney = 100 # in euro
growth_factor = 1.05 # 5% interesse. Fattore di crescira annuale
years = 0
while mymoney < 200: # ripeti fino a raggiungere 200 euro
mymoney = mymoney * growth_factor
years = years + 1
print('We need', years, 'years to reach', mymoney, 'euros.')
Un classico: qual'è la più piccola potenza di 1/2 che posso aggiungere a 1 senza modificarne la rappresentazione come numero reale?
r0 = 1.
r2 =1/2
n=1
while r0 - r2 != r0:
r2 = r2/2
n = n + 1
print(n)
print(f"{r2:e}")
Test:
print(1.-1/2**(n-1))
print(1.-1/2**n)
if
¶Spesso è necessario estrarre da una lista gli elementi che soddisfano una certa condizione. Lo si può ottenere con un if
all'interno della definizione della lista:
my_list = list(range(5,20))
my_list
Per selezionare solo gli elementi divisibile per 3:
[i for i in my_list if i % 3 == 0]
tuple(i for i in my_list if i % 3 == 0)
{i:i**2 for i in my_list if i % 3 == 0}
Per selezionare solo gli elementi pari, maggiori di 6 e minori di 17:
[i for i in my_list if i % 2 == 0 and i > 6 and i < 17]
È possibile applicare un filtro direttamente quando si crea una lista:
my_list = [i**2 for i in range(21) if i%2 == 0]
my_list
my_dict = {i:i**2 for i in range(21) if i%2 == 0}
my_dict
La keyword in
serve anche a testare se un oggetto è presente in una lista/stringa/ntupla:
a = 3
my_list = [5,3,-1,'pie']
a in my_list
'pippo' in my_list
get
artigianale.¶l = [1,2,3]
l[10] if 10 < len(l) else 'fail'
Se è necessario interrompere il loop prima della sua conclusione naturale, si può usare il comando break
che termina le operazioni all'interno del loop e passa ad eseguire il primo comando successivo al loop. Un paio di esempi:
for letter in 'Python': # Primo Esempio
if letter == 'h':
break
print ('Current Letter :', letter)
var = 10 # Secondo Esempio
while var > 0:
print ('Current variable value :', var)
var = var -1
if var == 5:
break
print ("Good bye!")
Se è necessario interrompere l'esecuzione di uno dei passi del loop (per esempio perchè uno dei dati non è valido) e passare al caso successivo, si può usare il comando continue
. Un esempio:
for letter in 'Python':
if letter == 'h':
continue
print ('Current Letter :', letter)