Vai al contenuto

Le funzioni

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

  1. Una funzione area_cerchio(raggio) che usa math.pi (ricorda import math).
  2. Una funzione che genera una password casuale di una lunghezza data, usando random.choice() e string.ascii_letters + string.digits.
  3. Riprendi la lista della spesa della lezione 1 e dividila in funzioni: aggiungi(), togli(), mostra().