In Python una funzione si definisce ricorrendo alla parola chiave "def", seguita dal nome della funzione e dai parametri di ingresso racchiusi tra parentesi tonde separate da una virgola. Il parametro di output di una funzione è uno e uno soltanto e non viene riportato esplicitamente nel prototipo. Il prototipo di una funzione, quindi, ha solo il nome e i parametri d'ingresso. Scriviamo ad esempio una funzione, la nostra era una funzione. def stringa, accetta un unico parametro di ingresso. Così come avviene per le variabili, che non hanno bisogno di essere dichiarate all'interno del programma Python, così anche i parametri: non c'è bisogno di dichiarazione quindi non c'è la necessità di specificare a tempo di compilazione il tipo del dato e quindi il tipo del parametro in questo caso, che andrà ad essere valorizzato a run time. Definizione, questo è il prototipo. I due punti separano il prototipo della funzione da quello che è il corpo della funzione, la sequenza di istruzioni che ne realizzano la sua implementazione. Possiamo inserire una o più stringhe iniziali che hanno un significato particolare, le docstring. Sono stringhe che forniscono l'help in linea, che danno informazioni generali sulla funzione. Sarà possibile andare a richiamare queste stringhe utilizzando da prompt Python il comando help, parentesi tonde, col suo parametro, il nome della funzione per la quale si vuole avere l'help in linea. Help della funzione stringa. Ovviamente il programmatore inserirà le informazioni che riterrà più opportune. La docstring è assolutamente opzionale. Nel caso la mettessimo sappiate che la nostra funzione può essere corredata di un'opportuna documentazione che può essere visualizzata da prompt mediante l'istruzione help, lo vediamo. Questa funzione banalissima effettua solo la stampa della stringa prima di uscire. Return è l'istruzione che si utilizza per chiudere la funzione, per restituire il flusso di controllo all'ambiente che ha invocato la funzione. Return opzionalmente può avere un parametro. Questo parametro è il valore di ritorno della funzione. È possibile quindi assegnare ad una variabile, variabile uguale funzione dei parametri. Il valore di ritorno della funzione sarà assegnato a questa variabile. Innanzitutto è possibile effettuare l'help in linea. Questo è della stringa che è l'help del tipo del dato stringa, che già ci viene dato, oserei dire gratis, dalle librerie standard di Python. Help della nostra funzione che abbiamo chiamato stringa e otteniamo proprio questa, che è la descrizione che abbiamo dato noi. È possibile invece invocare la nostra funzione stringa di "ciao". Banalmente, il corpo della funzione richiedeva che stampasse "ciao". Così come possiamo anche andare a definire una nuova funzione che possa ad esempio lavorare non sulle stringhe, ma rimanendo sempre nell'insieme dei toy example, di insiemi che servono a scopi didattici, ad esempio possiamo definire una funzione che lavora sull'aritmetica. Definiamo una funzione, ad esempio la funzione di Fibonacci, che, dato un valore, ne restituisce appunto la funzione di Fibonacci. Fibonacci di "n", i due punti che dichiarano la fine del prototipo e l'inizio del corpo della funzione. Assegnazione: se vi ricordate, è possibile in Python effettuare assegnazioni multiple, quindi possiamo andare a istanziare due variabili, "a" e "b", e assegnargli due valori. In particolare, ad a assegniamo 0, a b assegniamo 1. Poi vedremo che b sarà il valore di a, tutto nella nostra funzione. Fino a quando la nostra a resterà ad essere minore di n, dove n è il nostro parametro di input, è il valore per il quale vogliamo calcolare la serie di Fibonacci fino a n, fino a quando a sarà minore di n voglio che mi stampi tutti i passaggi, quindi mi stampi "a", voglio tutti gli elementi della sequenza, e ci metti anche uno spazio. Io abbondo, ce ne metto due. Un'altra assegnazione multipla. Adesso che succede? Che a assumerà il valore di b e che b invece avrà la somma parziale di a+b. Stampo anche una riga vuota e adesso non mi resta che assegnare un valore di uscita. L'indentazione è molto importante, se non fossi tornata indietro, il return sarebbe stato inserito all'interno del while. Return della nostra b. b è il valore di ritorno, punto e virgola lo seguiamo. Ora posso andare a invocare fibonacci(10) oppure posso utilizzare una nuova variabile, ad esempio "c". Che succederà ? Avrò lo stesso output di prima, quindi la stampa di tutti i valori parziali, di tutti gli elementi della serie, però non avrò questo output 21, perché una volta che ho inserito "c=", l'interprete capisce che il programmatore ha memorizzato l'output della funzione in una variabile, e che quindi non è intenzionato a stamparla, e quindi in automatico non mi esce l'output. Se vado a inserire c, potrei scrivere anche print c, ottengo il 21 che è appunto il valore di output.