Funzioni annidate in Python

Manav Narula 10 agosto 2021
Funzioni annidate in Python

Una funzione è un blocco di codice che può essere richiamato più volte in un programma. Può accettare diversi argomenti e può restituire qualche valore utile. In tutti i linguaggi di programmazione, abbiamo funzioni integrate e funzioni definite dall’utente.

In questo tutorial impareremo come creare e utilizzare funzioni nidificate in Python.

La maggior parte dei linguaggi supporta l’uso e la creazione di funzioni annidate. Come suggerisce il nome, una funzione annidata è una funzione all’interno di una funzione. La funzione annidata all’interno è chiamata funzione interna e la funzione che racchiude è chiamata funzione esterna.

Nel codice seguente creiamo una funzione nidificata di base.

def outer_f(s):
    def inner_f(s):
        print(s)

    inner_f(s)


outer_f("Nested")

Produzione:

Nested

Usando l’esempio sopra, possiamo avere una piccola idea sull’uso delle funzioni annidate. Possono essere usati per nascondere una funzione dal mondo esterno e implementare l’incapsulamento dei dati.

Un’altra cosa da sapere è che la funzione annidata può utilizzare la variabile utilizzata nella funzione esterna. Tali variabili sono chiamate non locali. Le funzioni annidate possono accedervi, ma se dobbiamo modificarle, dobbiamo usare la parola chiave nonlocal.

Vediamo il seguente esempio.

def outer_f():
    s = 5

    def inner_f():
        nonlocal s
        s = s + 1
        return s

    return inner_f()


print(outer_f())

Produzione:

6

Qui non saremmo in grado di modificare la variabile s senza utilizzare la parola chiave nonlocal.

Ora immagina se la funzione annidata restituisce un valore. Questo ci porta a un’altra utile caratteristica delle funzioni annidate e che sono le funzioni di chiusura. Queste funzioni vengono create dinamicamente utilizzando funzioni nidificate. Può essere un modo elegante e conciso per implementare l’occultamento dei dati e usarlo come alternativa per le classi.

Vedere il seguente codice.

def incrementer(x):
    def inc(y):
        return x + y

    return inc


by4 = incrementer(4)
by5 = incrementer(5)

print(by4(5), by5(5))

Produzione:

9 10

Ora nel codice sopra, creiamo un metodo dinamico per incrementare un numero. Le by4 e by5 sono le due funzioni di chiusura create utilizzando la funzione annidata. Ciò è dovuto principalmente alla capacità delle funzioni annidate di mantenere il proprio stato. Può essere un’alternativa decente alle classi e alle variabili globali quando non sono coinvolti troppi attributi. Possiamo scoprire se una funzione è una chiusura usando l’attributo __closure__. Tutte le funzioni hanno questo attributo e restituisce alcuni oggetti cella quando viene utilizzato con una funzione di chiusura.

Le funzioni annidate vengono utilizzate anche per le funzioni di decoratore. Le funzioni Decorator utilizzano un oggetto richiamabile come una classe, una funzione e restituiscono un altro oggetto. Usiamo il segno @ per usare un decoratore prima di qualsiasi oggetto richiamabile. In questo modo, prendiamo l’oggetto chiamabile come argomento della funzione decoratore e lo usiamo.

Creiamo una funzione decoratore molto semplice per capirlo meglio nell’esempio seguente.

def dec(func):
    def inner():
        print("Hello")
        func()

    return inner


@dec
def world():
    print("world")


world()

Produzione:

Hello
world

Nell’esempio sopra, abbiamo creato una semplice funzione decoratore chiamata dec(), che decora la funzione world() usandola come argomento e stampando un messaggio aggiuntivo.

Autore: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

Articolo correlato - Python Function