Molto spesso si ha che fare con problemi che possono essere scomposti in problemi più piccoli, oppure vi sono delle operazioni che vengono eseguite un numero elevato di volte, allora è molto più conveniente spezzare il nostro problema in blocchi e richiamare questi blocchi quando ne abbiamo bisogno. Non solo il programma sarà più leggibile, ma ridurremo anche la possibilità di commettere errori dovendo cambiare il nostro codice nello stesso modo in più parti. Le funzioni o subroutine sono lo strumento che permette di svolgere questo compito. Di solito ci si riferisce a funzioni quando l'esecuzione di esse restituisce un valore utilizzabile (per esempio y=cos(x)), e a subroutine quando non si ha un ritorno diretto (per sempio print_header()). Di seguito non faremo questa distinzione e le chiameremo indistintamente tutte con il termine funzioni. In Python esse vengono definite utilizzando la parola chiave def davanti al nome della funzione che vogliamo implementare, parentesi tonde che indicano la funzione e i : che definiscono il termine della dichiarazione della funzione e l'inizio del blocco di istruzioni che è rappresentato da tale funzione.
>>> def newline(): ... print # va a capo di una riga ... >>> newline() >>>Molto importante: in Python l'indentazione ha un ben preciso significato. Per indentazione si intende il portare una determinata riga di istruzione un certo numero di colonne più a destra (o a sinistra) rispetto alle istruzioni precedenti (o successive). Come si vede dall'esempio precedente quando definisco un blocco, che in questo caso è la nostra funzione, allora tutte le istruzioni che appartengono a tale blocco devono essere indentate della stesso numero di colonne rispetto all'inizio della definizione del blocco (questo sarà vero anche per il controllo del flusso e per i cicli).
Ad una funzione si possono passare dei valori che poi si possono utilizzare all'interno della funzione stessa. Per esempio se scriviamo il file triangle.py (eseguendolo in uno dei vari modi possibili) contenente
#!/usr/bin/env python # File triangle.py # def triangle(b,h): ''' return triangle area''' # (1) return 0.5*b*h # main program # base=input('triangle base = ') height=input('triangle height = ') area=triangle(base,height) #(2) print "The area is ",areavediamo che b ed h, sono i parametri generici della funzione triangle(b,h) a cui di volta in volta si possono passare i valori di nostro interesse. In modo più esplicito avremmo potuto scrivere la chiamata #(2) come area = triangle(b=base,h=height). Perticolarmente importante è il punto #(1). Se esiste una stringa immediatamente sotto la definizione di funzione (come in #(1)) questa sarà trattata come documentazione, sarà cioè il testo descrittivo che accompagna la funzione. Se infatti si scrive tale funzione all'interno dell'ambiente python si può ottenere la stringa utilizzando triangle.__DOC__. Ritorneremo in seguiro con ulteriori esempi di funzioni.