Dal corso: Concetti della programmazione in Python

Funzioni

- Una delle prime cose che viene insegnata a tutti quando imparano a programmare è come creare una funzione. La sintassi o le funzioni possono variare da linguaggio a linguaggio, ma il concetto generale è sempre lo stesso. Una funzione è una routine o una procedura che può accettare o meno alcuni valori di input ed esegue una sorta di elaborazione e quindi eventualmente restituisce un valore di output. Ogni corso di programmazione ti insegnerà come creare funzioni in quel linguaggio specifico. Ciò che spesso viene trascurato è la domanda sul perché si dovrebbero creare funzioni e quando si dovrebbe o non si dovrebbe trasformare un processo specifico in una funzione? La risposta breve è: la funzione dovrebbe essere creata per le routine di uso comune. Quindi, per dimostrare questo concetto, andiamo in cucina e diamo un'occhiata a una routine che faccio ogni giorno. Buongiorno. Ogni giorno, quando mi sveglio, mi piace prepararmi una ricca colazione per iniziare la giornata. Ci sono molti passaggi coinvolti nella preparazione di quella colazione. Preparo sempre il caffè, magari strapazzo le uova, faccio dei toast e, naturalmente, finalmente mangio. Ognuna di queste fasi del processo di preparazione della colazione è composta da molte altre fasi più piccole. Ad esempio, il processo di preparazione del caffè prevede la misurazione dei chicchi di caffè, la macinazione dei chicchi di caffè, l'inserimento dei chicchi di caffè macinati nel filtro, la misurazione dell'acqua, l'avvio della caffettiera e infine il versamento del caffè. Ci sono stati molti passaggi in questo processo, ma quei passaggi saranno esattamente gli stessi, ogni volta che preparo il caffè, ed è per questo che ho deciso di combinare quei passaggi in una funzione mentale. Ora, quando decido di fare il caffè, il mio cervello va in pilota automatico e faccio tutte queste cose senza dover pensare esplicitamente a ogni passaggio. Hmm. Preparare il caffè è solo una parte della mia routine per la colazione che ho trasformato in una funzione mentale. Quindi analizziamo un altro processo per la colazione, fare una frittata. Per fare una frittata, inizio mescolando i miei ingredienti insieme in una ciotola, verso quel composto in una padella. Cucino la frittata da un lato, la capovolgo, cucino dall'altro lato e il risultato di questo processo è una frittata. Non è niente di speciale, ma sono un programmatore di computer, non uno chef. Proprio come per la preparazione del caffè, ho anche funzionalizzato il processo per preparare una frittata. Ciò significa che se mia moglie, Olivia, vuole che prepari una frittata per colazione, non deve dirmi ciascuno di quei passaggi, mescolando gli ingredienti, versandoli nella padella e così via. Tutto quello che ha da dire è... - Fammi una frittata, per favore? - E so esattamente cosa fare. Diamo un'occhiata al processo di produzione della frittata come funzione in Python. Ho lo script di esempio, functions_begin.py, aperto nel mio ambiente Codespaces. Usiamolo per assemblare una colazione funzionale. Nel suo stato attuale, questo script è solo una serie di dichiarazioni stampate, che rappresentano ogni fase del nostro processo di preparazione della frittata. Python può fare un sacco di cose, ma non può effettivamente fare una frittata nella vita reale, quindi avremo bisogno di usare un po' di immaginazione. I passaggi includono mescolare gli ingredienti, versare il composto in una padella, cuocere il primo lato, girarlo e poi cuocere l'altro lato. Alla fine del processo, crea un nuovo oggetto stringa che descrive la gustosa frittata che abbiamo appena cucinato e la assegna a una variabile chiamata omelette. Eseguirò questo script nell'editor di Codespaces facendo clic sulla freccia Esegui tutto nella parte superiore dell'editor e possiamo vedere lo script stampare quei cinque passaggi nel processo di creazione della frittata. Se vogliamo visualizzare anche la stringa risultante denominata frittata che ha prodotto, possiamo utilizzare un'istruzione print per stampare la frittata alla fine dello script. E se eseguiamo nuovamente lo script, sull'ultima riga di output, possiamo vedere la gustosa frittata. Quindi quella era una frittata per me da mangiare, ma cosa succede se Olivia vuole una frittata anche per colazione? In tal caso, dovremo ripetere nuovamente tutti questi passaggi per creare una seconda frittata per lei. Un modo per raggiungere questo obiettivo, sarebbe quello di digitare di nuovo tutti questi passaggi nel processo, ma per motivi di tempo, usiamo semplicemente il copia incolla e modifichiamo i nomi delle variabili in omelette1 e omelette2, in modo da poterli distinguere. Modificheremo anche l'istruzione print alla fine per visualizzare omelette1 e quindi aggiungeremo una seconda istruzione print dopo di essa per omelette2. Ora, quando eseguo la sceneggiatura, passa attraverso i passaggi per fare una frittata due volte e, alla fine, le due dichiarazioni di stampa finali ci mostrano che abbiamo due gustose frittate. Quella sceneggiatura ha cucinato con successo la colazione per me e Olivia. Ma cosa succederebbe se avessimo bisogno di fare più di due frittate? Diciamo che Olivia decide di invitare un gruppo di amici a colazione. Se continuassimo a copiare manualmente tutti i passaggi ogni volta che dobbiamo fare un'altra frittata, lo script finirebbe per essere molto, molto lungo, e più lungo diventa uno script, più è probabile che contenga errori. Poiché eseguiamo la stessa sequenza di operazioni, ogni volta che prepariamo una frittata, questo è uno scenario perfetto per combinare questi passaggi in un'unica funzione. Quindi facciamolo ora. Prima di poter utilizzare una funzione, dobbiamo prima definirla. Quindi, all'inizio dello script, digiterò def, e questa è la parola chiave per far sapere a Python che stiamo definendo una nuova funzione. Assegneremo a questa funzione un nome, make_omelette, e poi aggiungeremo parentesi aperte e chiuse, seguite da due punti. La sintassi specifica per la definizione di una funzione può variare se si programma in linguaggi diversi, ma è così che si fa in Python. Ora mettiamo tutti quei passaggi per fare una frittata in questa nuova funzione make_omelette. Python utilizza l'indentazione per mostrare che una specifica riga di codice esiste nell'ambito di qualcos'altro, come la definizione di una funzione. Quindi avremo bisogno di indentare tutte queste istruzioni print per renderle parte della funzione make_omelette. Possiamo anche eliminare il secondo set di istruzioni di stampa poiché non ne avremo più bisogno. A questo punto, abbiamo definito una funzione chiamata make_omelette, e ogni volta che usiamo quella funzione, stamperà i passaggi e creerà una nuova stringa che descrive una gustosa frittata. Ma c'è un'altra cosa che dobbiamo fare. Non vogliamo che la stringa che descrive la gustosa frittata esista solo all'interno di questa funzione. Quando chiamiamo la funzione make_omelette, vorremo recuperare quella stringa come output. Per fare ciò, possiamo aggiungere l'istruzione return omelette alla fine della funzione e cambieremo anche il nome della variabile da omelette1 a solo omelette. Durante l'esecuzione di questa funzione, quando arriva all'istruzione return alla riga 10, il programma uscirà dalla funzione e passerà quella stringa che descrive la gustosa frittata come output. Ora la nostra funzione è completa, quindi usiamola. Cancellerò queste due istruzioni di stampa alla fine. Poi preparerò la colazione per me stesso chiamando la nostra nuova funzione make_omelette, e dovrei anche essere gentile e preparare una frittata anche per Olivia. Infine, aggiungerò due istruzioni di stampa per mostrare cosa stiamo mangiando io e Olivia a colazione stampando il contenuto delle nostre rispettive variabili per la colazione. Ora, quando faccio clic sulla freccia Esegui per rieseguire l'intero script, esegue tutti i passaggi per fare una frittata, due volte, e alla fine, possiamo vedere che sia Olivia che io stiamo mangiando gustose frittate per colazione. Perfetto. Ora che abbiamo una funzione per fare la frittata e l'abbiamo testata e sappiamo che funziona, possiamo usarla ancora e ancora e ancora per creare tutte le frittate che vogliamo per noi stessi e per ospitare gli amici a colazione. Questo esempio illustra uno dei vantaggi principali dell'organizzazione del codice in funzioni, il riutilizzo. Abbiamo scritto una volta la nostra funzione per fare la frittata e ora possiamo usarla facilmente più e più volte. La funzione esegue tutti i passaggi intermedi di miscelazione, cottura e capovolgimento della frittata in modo da non doverci preoccupare di ripetere manualmente tali passaggi, ogni volta che dobbiamo preparare una frittata.

Contenuti