In questa sesta parte del corso online dedicato a python andremo a studiare le funzioni. Le funzioni non sono altro che blocchi di istruzioni che hanno lo scopo di eseguire una determinata azione.

La loro utilità è quella di spezzare il problema in parti più piccole in modo da renderlo il più semplice possibile.

Inoltre queste funzioni possono essere riutilizzate più volte, permettendo così la non duplicazione del codice e favorendo la riusabilità e manutenzione di esso.

Sintassi

In Python per definire una funzione si deve utilizzare la parola chiave def seguita dal nome che vogliamo dare ad essa:

def nome_funzione(<parametro1>, <parametro2>, ..):
<istruzione>
<istruzione>

Dentro alle parentesi tonde è possibile indicare i parametri che la funzione vuole in input. Nel caso non si volessero argomenti in input basta aprire e chiudere le parentesi ().

Inoltre una funzione può ritornare un risultato utilizzando la keyword return seguita dalla variabile che si vuole ritornare.

Chiamare una funzione

Ora che sai come scrivere una funzione, creiamone una che, data una qualsiasi variabile, visualizzi a schermo il suo valore:

def mia_print(variabile):
print("Variabile: " + variabile)

Ora che abbiamo definito la nostra funzione non ci resta che chiamarla semplicemente scrivendo il suo nome e aggiungendo tra le parentesi tonde i parametri che vuole in input (in questo caso, semplicemente una stringa):

def mia_print(variabile):
print("Variabile: " + variabile)

mia_print("test funzione1")
mia_print("test funzione2")
mia_print("Ciao")
#output
Variabile: test funzione1
Variabile: test funzione2
Variabile: Ciao

Ritornare un valore

Come ti ho detto in precedenza, una funzione può anche ritornare dei valori utilizzando la parola chiave return. Andiamo quindi a vedere in che modo.

Supponiamo di voler creare una funzione che, dato un numero, ci ritorni indietro il suo valore + 5:

def somma_piu_cinque(numero):
print("Dentro alla funzione")
return numero + 5
print("Dopo return")

numero_sommato = somma_piu_cinque(12)
print(numero_sommato)

#output
Dentro alla funzione
17

Puoi notare che non viene stampato a schermo "Dopo return" , in quanto return interrompe istantaneamente l'esecuzione del blocco di istruzioni in cui si trova, ritornando così al blocco chiamante il valore indicato.

Per farti assimilare tutto ciò che hai letto fin qui, ti faccio un esempio un pò più completo.

In questo script andremo a scrivere il codice per contare e visualizzare le vocali di una parola, inizialmente senza l'utilizzo di funzioni.

vocali = ["a", "e", "i", "o", "u"]
parola = input("Inserisci una parola -> ")
vocali = [l for l in parola if l.lower() in vocali]

print("{0} contiene {1} vocali ({2})".format(parola, len(vocali), vocali))

Per rendere il tutto più leggibile e modulare potremmo scrivere quindi una funzione che ritorni le vocali di una parola:

def ritorna_vocali(parola):
vocali = ['a', 'e', 'i', 'o', 'u']
return [l for l in parola if l.lower() in vocali]

Aggiungiamola allo script precedente:

def ritorna_vocali(parola):
vocali = ['a', 'e', 'i', 'o', 'u']
return [l for l in parola if l.lower() in vocali]

if __name__ == '__main__':
parola = input("Inserisci una parola -> ")
vocali = ritorna_vocali(parola)
print("{0} contiene {1} vocali ({2})".format(parola, len(vocali), vocali))


Questo è un esempio banale, però nonostante ci sembra di aver scritto più codice rispetto a prima, nel caso ci servisse in altre occasioni di trovare le vocali, ci basterà solamente chiamare quella funzione risparmiando tempo e facendo più chiarezza.

Argomenti delle funzioni

In una funzione esistono 3 differenti tipi di argomenti:

  • Argomenti obbligatori(come quelli visti fino ad ora);
  • Argomenti a lunghezza variabile;
  • Argomenti di default.

Gli argomenti obbligatori sono tutti quegli argomenti che non si possono omettere nel momento in cui si chiama la funzione. Nel caso essi vengano omessi, verrà scatenata un'eccezione. Ad esempio:

def saluta(nome):
print("Ciao " + nome + "!")

saluta("Matteo")
saluta()
#output
Ciao Matteo!
TypeError: saluta() missing 1 required positional argument: 'nome'

Gli argomenti di default, invece, nel caso vengano omessi nella chiamata della funzione, assumeranno appunto un valore di default. Ad esempio:

def cane(nome, razza = "Bassotto"):
print("Nome del cane: " + nome)
print("Razza del cane: " + razza)

cane("Fido", "Pastore Tedesco")
cane("Schulz")

#output
Nome del cane: Fido
Razza del cane: Pastore Tedesco

#output 2
Nome del cane: Schulz
Razza del cane: Bassotto

Gli argomenti a lunghezza variabile, invece, rappresentano una quantità non definita di argomenti che la funzione accetta, potenzialmente infinita. Per indicare tale tipo viene utilizzato un * prima del nome dell'argomento:

def saluta_tutti(*args):
for nome in args:
print("Ciao " + nome + "!")

saluta_tutti("Luigi", "Luca", "Matteo", "Marco")

#output
Ciao Luigi!
Ciao Luca!
Ciao Matteo!
Ciao Marco!

Scope delle variabili

Fondamentalmente esistono due tipi di variabili all'interno di un programma:

  • Variabili globali;
  • Variabili locali.

Le variabili locali sono tutte quelle variabili definite dentro una funzione, mentre quelle globali sono quelle definite all'esterno.

Ciò vuol dire che una variabile locale è utilizzabile solamente all'interno della funzione in cui essa è stata definita. Ad esempio:

numeri = [1, 2, 3] "<-- variabile globale"
def funzione(lista):
numeri = [3, 2, 1]
print("Variabile locale: " + numeri)

funzione(numeri)
print("Variabile globale: " + numeri)

#output
Variabile locale
[3, 2, 1]

Variabile globale
[1, 2, 3]

Funzioni anonime(lambda)

Le funzioni lambda non vengono dichiarate nel "metodo standard" tramite la keyword def. Per questo motivo sono dette funzioni anonime. 

Vengono utilizzate principalmente per funzioni piccole e semplici. Possono avere come input qualsiasi parametro, mentre in output può ritornare solamente un valore.

al_quadrato = lambda x: x ** 2

print(al_quadrato(10))
print(al_quadrato(2))

#output
100
4


Condividi sui Social