Un programma può diventare molto lungo e complesso (si perde il controllo…)
istruzione_1
istruzione_2
istruzione_3
...
istruzione_100
...
istruzione_1000
...
Per migliorare la leggibilità si aggiungono linee vuote e commenti
#-------------- Attività A (n1 istruzioni)
istruzione_a_1
istruzione_a_2
...
istruzione_a_n1
#-------------- Attività B (n2 istruzioni)
istruzione_b_1
istruzione_b_2
...
istruzione_b_n2
#-------------- Attività C (n3 istruzioni)
istruzione_c_1
istruzione_c_2
...
istruzione_c_n3
Una parte di codice diventa una funzione se
- è riconoscibile (svolge un compito specifico)
- si ripete più volte nello stesso progetto
- è troppo lunga (più di 20/30 righe?)
- vogliamo utilizzarla in un altro progetto
- vogliamo condividerla
- …
def attività_a():
istruzione_a_1
istruzione_a_1
...
istruzione_a_n1
def attività_b():
istruzione_b_1
istruzione_b_2
...
istruzione_b_n2
def attività_c():
istruzione_c_1
istruzione_c_2
...
istruzione_c_n3
Per passare il controllo a una funzione è necessario chiamarla.
Dopo l’esecuzione dell’ultima istruzione all’interno della funzione il controllo ritorna alla prima istruzione successiva alla chiamata.

def attività_a():
istruzione_a_1
istruzione_a_2
...
istruzione_a_n1
def attività_b():
istruzione_b_1
istruzione_b_2
...
istruzione_b_n2
def attività_c():
istruzione_c_1
istruzione_c_2
...
istruzione_c_n3
...
attività_a()
...
attività_b()
...
attività_c()
...
Il blocco principale non ha l’esclusiva di fare le chiamate, ogni funzione può chiamare qualsiasi funzione

def attività_a():
...
...
...
def attività_b():
...
attività_a()
...
...
attività_a()
...
attività_b()
...
...