Speaker:
Repository github per questi tutorial:
Materiale tratto dal libro SoftPython
Esc)if¶Come eseguire codice solo se una condizione è vera?
Riferimenti: SoftPython - if
fatto_colazione, lavato_denti = True, True
if fatto_colazione and lavato_denti:
print("fatto tutto !")
print("posso uscire di casa.")
print("Fine.")
fatto tutto ! posso uscire di casa. Fine.
if ESPRESSIONE_BOOLEANA:
BLOCCO ISTRUZIONI
Cosa fare se la condizione è falsa?
fatto_colazione, lavato_denti = True, False
if fatto_colazione and lavato_denti:
print("fatto tutto !")
print("posso uscire di casa.")
else:
print("NON posso uscire di casa.")
print("Fine.")
NON posso uscire di casa. Fine.
if ESPRESSIONE_BOOLEANA:
BLOCCO ISTRUZIONI
else:
ALTRO BLOCCO ISTRUZIONI
if: Attenzione¶RICORDATI I DUE PUNTI : ALLA FINE DELLA LINEA DEL FOR !!!
Per indentare, usa SEMPRE 4 spazi bianchi
Sequenze di 2 soli spazi per quanto consentite non sono raccomandate.
Il comportamento di TAB dipende dal tuo editor
A seconda dell'editor che usi, premendo TAB potresti ottenere:
if - valori logici¶In Python, gli oggetti 'vuoti' hanno valore logico False:
0, oggetto None, la stringa vuota "", lista vuota [], ...Tutto ciò che non è 'vuoto' è considerato True:
if ['Che', 'tempo', 'farà', 'domani?']:
print("Sole!")
else:
print("Pioggia")
Sole!
Per altre cose 'strane', vedere: SoftPython - Booleani - Ordine di valutazione
if annidati¶Si può anche mettere un if dentro l'altro (nested if).
Esempio (funziona esattamente come il precedente):
fatto_colazione, lavato_denti = True,True
if fatto_colazione:
if lavato_denti: # NOTA: Questo blocco è indentato
print("fatto tutto !") # rispetto all'if esterno
print("posso uscire di casa!") #
else:
print("NON posso uscire di casa")
else:
print("NON posso uscire di casa")
fatto tutto ! posso uscire di casa!
elif¶caramelle = 3
if caramelle > 10:
print('tante caramelle!')
elif caramelle > 5:
print('abbastanza caramelle!')
elif caramelle > 0:
print('poche caramelle!')
else:
print('Non ci sono caramelle!')
poche caramelle!
caramelle = 0
if caramelle > 10:
print('tante caramelle!')
elif caramelle > 5:
print('abbastanza caramelle!')
elif caramelle > 0:
print('poche caramelle!')
else:
print('Non ci sono caramelle!')
Non ci sono caramelle!
match (menzione)¶oggetto = "Voglio un caffè"
match oggetto:
case "Voglio un caffè":
print("Preparo la moka...")
case "Voglio una brioche":
print("Scaldo la brioche..")
case altro:
print("Non ho capito cos'è", altro)
Preparo la moka...
if complicatiCome compiere azioni su ogni elemento di una sequenza?
animali = ['cani', 'gatti', 'scoiattoli']
for animale in animali:
print("Nella lista ci sono:")
print(animale)
Nella lista ci sono: cani Nella lista ci sono: gatti Nella lista ci sono: scoiattoli
animaleper ogni elemento nella lista animali:
animale assume il valore dell'elementorange¶range(5)
range(0, 5)
range(n) rappresenta una sequenza con i primi numeri da 0 incluso a n escluso
la sequenza è 'congelata'
Per materializzare i numeri, convertire esplicitamente a list:
list(range(5))
[0, 1, 2, 3, 4]
Come incrementare un contatore ad ogni ciclo?
Possiamo usare range
Il for scorre automaticamente la sequenza:
for indice in range(5):
print(indice)
0 1 2 3 4
for in range? 1/2¶Per leggere da una lista possiamo usare gli indici:
animali = ['cani', 'gatti', 'scoiattoli']
for indice in range(len(animali)):
print(animali[indice])
cani gatti scoiattoli
for in range? 2/2¶Per MODIFICARE celle esistenti di una lista, dobbiamo usare gli indici:
animali = ['cani', 'gatti', 'scoiattoli']
for indice in range(len(animali)):
animali[indice] = animali[indice].upper()
print(animali)
['CANI', 'GATTI', 'SCOIATTOLI']
Senza indici, non funziona:
animali = ['cani', 'gatti', 'scoiattoli']
for animale in animali:
animale = animale.upper() # SBAGLIATO, NON FA NULLA
print(animali)
['cani', 'gatti', 'scoiattoli']
COMANDAMENTO: Non aggiungerai o toglierai mai elementi da una sequenza che iteri con un for !
lista = ['a','b','c','d','e']
for el in lista:
lista.remove(el) # PESSIMA IDEA
lista # RISULTATO IMPREVEDIBILE !!!!
['b', 'd']
Per saperne di più: SoftPython - Modificare durante l'iterazione
Espressione per generare una NUOVA lista a partire da una sequenza
animali = ['cani', 'gatti', 'scoiattoli', 'alci']
nuova_lista = [animale.upper() for animale in animali ]
nuova_lista
['CANI', 'GATTI', 'SCOIATTOLI', 'ALCI']
animali
['cani', 'gatti', 'scoiattoli', 'alci']
[ ESPRESSIONE for VARIABILE in SEQUENZA ]
Riferimenti: SoftPython - Sequenze
Per filtrare con le comprehension:
animali = ['cani', 'gatti', 'scoiattoli', 'alci']
[animale.upper() for animale in animali if len(animale) == 4]
['CANI', 'ALCI']
if ESPRESSIONE_BOOLEANA speciale alla finei = 1
while i < 4:
print('Ho contato fino a', i)
i += 1
print('Ciclo finito !')
Ho contato fino a 1 Ho contato fino a 2 Ho contato fino a 3 Ciclo finito !
Blocco di codice eseguito ripetutamente fintantochè una condizione booleana è vera
Riferimenti: SoftPython - cicli while
Altrimenti, consigliamo il for
Riferimenti: SoftPython - while - Modificare sequenze
while - cerca e togli in sequenza¶Pesca carte da mazzo (da destra) finchè trova cuori
mazzo = ['3 di cuori','2 di picche','9 di cuori','5 di quadri','8 di fiori']
carta = ''
print("mazzo:", mazzo)
while len(mazzo) > 0 and 'cuori' not in carta:
carta = mazzo.pop() # rimuove ultima carta dal mazzo
print("pescato", carta)
print("mazzo:", mazzo)
print("Uscito dal ciclo!")
mazzo: ['3 di cuori', '2 di picche', '9 di cuori', '5 di quadri', '8 di fiori'] pescato 8 di fiori mazzo: ['3 di cuori', '2 di picche', '9 di cuori', '5 di quadri'] pescato 5 di quadri mazzo: ['3 di cuori', '2 di picche', '9 di cuori'] pescato 9 di cuori mazzo: ['3 di cuori', '2 di picche'] Uscito dal ciclo!
Python è un linguaggio intepretato -> lento..
for)while)✪✪ Requisiti: stringhe, liste, if, for
Dato un testo di caratteri con diversa capitalizzazione, metti nella variabile tradotto il testo con la capitalizzazione invertita e poi STAMPALO
.islower()Esempio - dato:
testo = "CiAo QuEsTo E' uN TeStO sToRto"
dopo il tuo codice dovrebbe risultare:
>>> print(tradotto)
cIaO qUeStO e' Un tEsTo StOrTO
testo = "CiAo QuEsTo E' uN TeStO sToRto" # cIaO qUeStO e' Un tEsTo StOrTO
#testo = "gInGillo" # GiNgILLO
tradotto = ''
# scrivi qui
✪✪ La compagnia mineraria Trivellum ha scoperto un pozzo di cobalto. Nel pozzo si trovano diversi strati, ognuno contenente una lega di diversa composizione: una volta trivellato, lo strato viene suddiviso in blocchi che vengono poi issati su un carrello per il successivo trasporto.
Scrivi del codice che MODIFICA la variabile pozzo togliendo gli strati, e MODIFICA la variabile carrello aggiungendo i vari blocchi scavati.
whilepozzo nè carrello (quindi niente pozzo = ... o carrello = ...)vedi slide successiva...
Esempio - dati:
pozzo = ['███','▓▓▓','▒▒▒', '░░░'] # <-- cima del pozzo
carrello = []
Il tuo programma deve stampare:
il pozzo è: ['███', '▓▓▓', '▒▒▒', '░░░']
Trivello lo strato ░░░ e lo divido nei blocchi ['░', '░', '░']
il pozzo è: ['███', '▓▓▓', '▒▒▒']
Trivello lo strato ▒▒▒ e lo divido nei blocchi ['▒', '▒', '▒']
il pozzo è: ['███', '▓▓▓']
Trivello lo strato ▓▓▓ e lo divido nei blocchi ['▓', '▓', '▓']
il pozzo è: ['███']
Trivello lo strato ███ e lo divido nei blocchi ['█', '█', '█']
Il pozzo finale è : []
Il carrello finale è: ['░', '░', '░', '▒', '▒', '▒', '▓', '▓', '▓', '█', '█', '█']
carrello = []
pozzo = ['███','▓▓▓','▒▒▒', '░░░'] # <-- cima del pozzo
#pozzo = ['┼┼','┤├','┐┌', '╗╔', '║║'] # ['║', '║', '╗', '╔', '┐', '┌', '┤', '├', '┼', '┼']
# scrivi qui
Una funzione prende dei parametri e li usa per effettuare cambiamenti nel sistema o produrre qualche risultato.
Riferimenti: SoftPython - funzioni
def mia_stampa(x,y):
print('Ora stamperemo la somma di due numeri')
print('La somma è %s' % (x + y))
Possiamo chiamare la funzione così:
mia_stampa(3,5)
Ora stamperemo la somma di due numeri La somma è 8
Per definire una funzione, possiamo usare la parola chiave def:
Ricordati i due punti : alla fine della riga !!
Una funzione ha side effects quando modifica l'ambiente
Esempi:
printdef mia_somma(x,y):
s = x + y
return s
risultato = mia_somma(3,5)
risultato
8
Per restituire un valore usabile fuori dalla funzione:
usa la parola chiave return seguita da una ESPRESSIONE
return ?¶def mia_somma_sbagliata(x,y):
x + y
risultato = mia_somma_sbagliata(5,3)
risultato # Jupyter non mostra niente!
print(risultato) # forziamo stampa con print
None
def mia_somma_corretta(x,y):
return x + y
risultato = mia_somma_corretta(5,3)
print(risultato)
8
def ordina(lista):
"""MODIFICA lista in modo che sia ordinata in-place
"""
lista.sort()
numeri = [7,4,9,8]
ordina(numeri)
print(numeri)
[4, 7, 8, 9]
def pesca(lista):
"""MODIFICA lista rimuovendo l'ultimo elemento e lo RITORNA
"""
return lista.pop()
mazzo = ["9 di quadri","4 di picche","6 di cuori","7 di fiori"]
carta = pesca(mazzo)
print(carta)
7 di fiori
print(mazzo)
['9 di quadri', '4 di picche', '6 di cuori']
Si possono aggiungere argomenti di default alla fine:
def ripeti(stringa, volte=3):
return stringa * volte
Quando si chiama la funzione si può:
ripeti('Rotola') # omettere l'argomento di default
'RotolaRotolaRotola'
ripeti("Rotola", volte=7) # specificarlo per nome
'RotolaRotolaRotolaRotolaRotolaRotolaRotola'
ripeti("Rotola", 2) # scriverlo direttamente
'RotolaRotola'
ATTENZIONE: NON mettere argomenti di defaut mutabili
Lo stesso oggetto verrà condiviso da tutte le invocazioni della funzione!
def tragedia(lista=[]):
lista.append('occhio!')
print(lista)
tragedia() # prima invocazione: sembra a posto..
['occhio!']
tragedia() # seconda invocazione: guai!
['occhio!', 'occhio!']
def meglio(lista=None):
if lista == None:
lista = []
lista.append('ok')
print(lista)
meglio() # prima invocazione
['ok']
meglio() # seconda invocazione
['ok']
Da dentro una funzione, possiamo leggere variabili esterne:
muro = "bianco"
def guarda():
print('Vedo un muro', muro)
guarda()
Vedo un muro bianco
Ma se proviamo a riassegnare, Python crea una NUOVA variabile!
muro = "bianco"
def dipingi():
print('Dipingo....')
muro = 'arancione' # OCCHIO
print('Esco')
dipingi()
print('Adesso il muro è', muro)
Dipingo.... Esco Adesso il muro è bianco
global¶Per evitare problemi, bisogna dichiarare la variabile esterna come global:
muro = "bianco"
def dipingi():
global muro # CORRETTO
print('Dipingo....')
muro = 'arancione'
print('Esco')
dipingi()
print('Adesso il muro è', muro)
Dipingo.... Esco Adesso il muro è arancione
len
<function len(obj, /)>
len("rosa") # invocazione
4
Proviamo a creare una var mia_var che punta all'oggetto len:
mia_var = len
NOTA: non abbiamo aggiunto parametri a len!
Adesso possiamo usare mia_var esattamente come usiamo la funzione len:
mia_var("rosa")
4
Per creare una funzione 'al volo', usa la parola chiave lambda:
lambda x, y: x + y
<function __main__.<lambda>(x, y)>
defreturnUna funzione lambda è un oggetto -> si può assegnare ad una variabile:
mia_somma = lambda x, y: x + y
mia_somma(3,5)
8
Queste due scritture sono completamente equivalenti:
def mia_somma(x, y):
return x + y
mia_somma = lambda x, y: x + y
Aspettative di vita di animali:
animali = [('cane', 12),
('gatto', 14),
('pellicano', 30),
('acquila', 25),
('scoiattolo', 6)]
Come fare a ordinare per anni?
sorted(animali) # SBAGLIATO
[('acquila', 25),
('cane', 12),
('gatto', 14),
('pellicano', 30),
('scoiattolo', 6)]
Così è alfabetico...
key¶Possiamo passare al parametro key una funzione che:
Scriviamo una lambda per estrarre aspettativa di vita:
sorted( animali, key=lambda tup: tup[1] )
[('scoiattolo', 6),
('cane', 12),
('gatto', 14),
('acquila', 25),
('pellicano', 30)]
✪✪ Requisiti: funzioni, stringhe, for, if
Il nostro eroe dei labirinti incontra un gruppo di bulli che per prenderlo in giro iniziano a cantilenargli il suo iconico verso, storpiandolo: INVECE di "waka waka waka waka waka" gli cantano "waekai waekai waekai waekai"
ed altre storpiature simili ottenute AGGIUNGENDO lettere al verso normale.
nobulli che pulisca dalle storpiature.print nella funzione!Esempio:
>>> bullo1 = "waekai waekai waekai waekai"
>>> res1 = nobulli(bullo1)
>>> print(res1)
waka waka waka waka
nobulli(stringa) che assume che i caratteri desiderati da mantenere siano sempre 'w','a','k','a'nobulli2(stringa, mantieni) che prende anche in ingresso una stringa coi caratteri da mantenere(vedi slide successiva)
# scrivi la funzione
# NON TOCCARE, queste linee devono funzionare
bullo1 = "waekai waekai waekai waekai"
bullo2 = "bwaka rwaka swaka twaka zwaka mmmwatka"
bullo3 = "eweaekea zwxarkma qwoagkpa"
res1 = nobulli(bullo1) # Deve RITORNARE il verso pulito "waka waka waka waka"
print(res1)
res2 = nobulli(bullo2) # Deve RITORNARE il verso pulito "waka waka waka waka waka waka"
print(res2)
res3 = nobulli(bullo3) # Deve RITORNARE il verso pulito "waka waka waka"
print(res3)
waka waka waka waka waka waka waka waka waka waka waka waka waka
✪✪ Tornato a casa, per consolarsi dalle offese, PacMan si butta su una scatola di biscotti (di quelle con la confezione di latta rotonda).
Nella scatola ci sono 8 diversi tipi di biscotti e dopo averne mangiati un po' si accorge con orrore che ha lasciato che rimanesse un numero dispari di biscotti per alcune tipologie.
Ovviamente l'offesa va sanata: scrivi una funzione mangia che data una lista la MODIFICA per mangiare (e quindi togliere) un biscotto di tutti i tipi rimasti dispari.
return nè print nella funzione!Esempio:
>>> scatola = [2, 5, 3, 8, 6, 24, 5, 3, 9]
>>> mangia(scatola)
>>> print(scatola)
[2, 4, 2, 8, 6, 24, 4, 2, 8]
(vedi slide successiva..)
# scrivi la funzione
# NON TOCCARE, queste linee devono funzionare
scatola1 = [3, 3, 3, 3, 3]
scatola2 = [1, 3, 5, 7, 9]
scatola3 = [19, 3, 14, 1, 10, 9, 2, 16, 8, 7, 13, 11, 18, 17, 6, 5, 4, 12, 20, 15]
mangia(scatola1) # deve MODIFICARE scatola1
mangia(scatola2)
mangia(scatola3)
print(scatola1) # Deve stampare [2, 2, 2, 2, 2]
print(scatola2) # Deve stampare [0, 2, 4, 6, 8]
print(scatola3) # Deve stampare [18, 2, 14, 0, 10, 8, 2, 16, 8, 6, 12, 10, 18, 16, 6, 4, 4, 12, 20, 14]
print(mangia([2,4,5,7])) # DEVE stampare None. Perchè ?
[2, 2, 2, 2, 2] [0, 2, 4, 6, 8] [18, 2, 14, 0, 10, 8, 2, 16, 8, 6, 12, 10, 18, 16, 6, 4, 4, 12, 20, 14] None