In questa lezione impari a
- definire e chiamare una funzione
- passare dati con i parametri e restituire risultati con return
- usare parametri con valore predefinito e argomenti con nome
- capire dove "vivono" le variabili
Una funzione è un blocco di codice con un nome, che puoi richiamare tutte le volte che vuoi. Ne usi già molte: print(), len(), input(). Ora impari a scriverne di tue.
Le funzioni servono a non ripetere codice (si dice principio DRY, Don't Repeat Yourself) e a dividere un problema grande in pezzi piccoli e comprensibili.
Definire e chiamare una funzione
def saluta():
print("Ciao!")
print("Benvenuto nel corso")
saluta() # la chiamata: esegue il codice della funzione
saluta()
def crea la funzione, il codice indentato sotto è il suo corpo. Finché non la chiami, la funzione non fa nulla.
Parametri e argomenti
I parametri sono le variabili tra parentesi nella definizione. Gli argomenti sono i valori che passi quando la chiami.
def saluta(nome): # nome è il parametro
print(f"Ciao {nome}!")
saluta("Anna") # "Anna" è l'argomento
saluta("Luca")
Restituire un risultato con return
print() mostra un valore sullo schermo; return lo restituisce a chi ha chiamato la funzione, che può usarlo per altri calcoli.
def area_rettangolo(base, altezza):
return base * altezza
a = area_rettangolo(5, 3)
print(a) # 15
print(area_rettangolo(2, 4) + 10) # 18
Attenzione: dopo
returnla funzione termina, le righe successive non vengono eseguite.
Valori predefiniti e argomenti con nome
Un parametro può avere un valore predefinito, usato se non passi l'argomento:
def converti(euro, cambio=1.08):
return round(euro * cambio, 2)
print(converti(100)) # 108.0: usa il cambio predefinito
print(converti(100, 1.10)) # 110.0
Puoi anche passare gli argomenti per nome, in qualunque ordine:
def presenta(nome, classe):
print(f"{nome} frequenta la {classe}")
presenta(classe="3B", nome="Marta")
Dove vivono le variabili
Le variabili create dentro una funzione sono locali: esistono solo lì dentro e spariscono quando la funzione finisce.
def calcola():
risultato = 42
return risultato
calcola()
print(risultato) # ERRORE: NameError, risultato esiste solo dentro calcola()
Per portare fuori un valore si usa return.
Esercizi
Esercizio 1 – Lo sconto. Scrivi una funzione prezzo_scontato(prezzo, sconto) che restituisce il prezzo scontato arrotondato ai centesimi.
Mostra la soluzione
def prezzo_scontato(prezzo, sconto):
return round(prezzo * (1 - sconto / 100), 2)
print(prezzo_scontato(80, 25)) # 60.0
Esercizio 2 – Contare le vocali. Scrivi una funzione che riceve una frase e restituisce quante vocali contiene.
Mostra la soluzione
def conta_vocali(frase):
conteggio = 0
for lettera in frase.lower():
if lettera in "aeiou":
conteggio += 1
return conteggio
print(conta_vocali("Ciao a tutti")) # 6
conteggio += 1 è un modo breve per scrivere conteggio = conteggio + 1.
Esercizio 3 – Da secondi a ore. Scrivi una funzione che riceve un numero di secondi e restituisce una stringa nel formato ore:minuti:secondi, per esempio 3725 diventa 1:02:05.
Mostra la soluzione
def formatta_tempo(secondi):
ore = secondi // 3600
minuti = (secondi % 3600) // 60
sec = secondi % 60
return f"{ore}:{minuti:02d}:{sec:02d}"
print(formatta_tempo(3725)) # 1:02:05
:02d scrive il numero su due cifre, con lo zero davanti se serve.
Esercizio 4 – Numero primo. Scrivi una funzione e_primo(n) che restituisce True se n è primo. Usala per stampare tutti i primi fino a 50.
Mostra la soluzione
def e_primo(n):
if n < 2:
return False
for divisore in range(2, int(n ** 0.5) + 1):
if n % divisore == 0:
return False
return True
primi = [n for n in range(51) if e_primo(n)]
print(primi)
Basta controllare i divisori fino alla radice quadrata di n: se ce ne fosse uno più grande, ce ne sarebbe anche uno più piccolo.
Da fare da solo
- Una funzione
area_cerchio(raggio)che usamath.pi(ricordaimport math). - Una funzione che genera una password casuale di una lunghezza data, usando
random.choice()estring.ascii_letters + string.digits. - Riprendi la lista della spesa della lezione 1 e dividila in funzioni:
aggiungi(),togli(),mostra().