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
Un blocco di codice diventa una funzione se
- è troppo lungo, più di 20/30 righe
- non riesco più a immaginare come funziona
- devo scorrere continuamente le schermate
- si ripete più volte nello stesso progetto
- riscrivendo il codice potrei commettere errori
- il codice finale sarà molto più corto se non ci sono ripetizioni
- voglio utilizzarlo in un altro progetto
- faccio copia e incolla della funzione
- voglio condividerlo con altre persone
- passo la funzione chiavi in mano, garantita funzionante
inoltre
- il codice è più leggibile, comprensibile, modificabile
- si può fare più facilmente testing and debugging (meglio controllare 10 righe che 1000)
- non dovrò più controllarlo in futuro (diventa un pezzo dei LEGO)
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.

#---------------------- FUNZIONI
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
#---------------------- MAIN
...
attività_a()
...
attività_b()
...
attività_c()
...
Il blocco principale non ha l’esclusiva di fare le chiamate, ogni funzione può chiamare qualsiasi funzione

#---------------------- FUNZIONI
def attività_a():
...
def attività_b():
...
attività_a()
...
def attività_c():
...
#---------------------- MAIN
...
attività_a()
...
attività_b()
...
attività_c()
...
Il main chiama la funzione b() che chiama a sua volta la funzione a()