Ecrire des fonctions à l'intérieur de fonctions

En C, c'est impossible. Mais en Python, on peut écrire des fonctions à l'intérieur de fonctions.

En Python, les variables sont capturées par référence (bounded by reference).

def f():
    i = 1
    def g():
        return i+1
    i = 2
    return g()

f()
3

Ne vous inquiétez pas ! On peut aussi simuler la capture par valeurs (bounding by value). Pour ce faire, il suffit d'utiliser un paramètre par défaut.

def f():
    i = 1
    def g(x,i=i):
        return i+x
    i = 2
    return g(20)

f()
21
def f():
    A = []
    for i in range(10):
        def g(i=i):
            return i+1
        A.append(g)
    return A

f()[5]()
6

Bien sûr, c'est le même principe avec une lambda expression.

def f():
    return [lambda : i+1 for i in range(10)]

f()[5]()
10
def f():
    return [lambda i=i: i+1 for i in range(10)]

f()[5]()
6