Appel d'une fonction dans une autre fonction

Nucleaire78 -  
mamiemando Messages postés 33769 Date d'inscription   Statut Modérateur Dernière intervention   -

Bonjour,

Je fais face à une fonction imbriquée dans une autre fonction. La fonction mère appelée constante_par_morceau prend deux paramètres : v et y. Au sein de cette fonction, on définit une autre fonction _fcn_wrapper qui prend en paramètre trois arguments : t, v et y

J'aimerais savoir comment cette fonction est compilée et donne un résultat lorsqu'on l'exécute sachant qu'à aucun moment on ne définit t, que ce soit en dehors ou dans la fonction principale. Voici le code :

import numpy as np

def f(x):
    return np.sin(2. * np.pi * x) + 2. * np.exp(-40. * (x-0.6) ** 2)

def constante_par_morceau(v, y):
    '''
    G = constante_par_morceaux(v, y)
    Retourne une fonction constante par morceau
    Entrées:
        v : liste des points de rupture
        Remarque: ils doivent être triés dans l'ordre croissant correspondant aux valeurs y
    Sortie:
        G une fonction qui prend soit des scalaires soit une liste de scalaires
    '''
    def _fcn_wrapper(t, t0=v, v0=y):
        if type(t) in (list, np.ndarray,):
        # map() : apply a function to each item in an iterable (like a list or dictionary)
            return list(map(_fcn, t))
        else:
            return _fcn(t)
        
    def _fcn(t, t0=v, y0=y):
        t0 = np.array(t0)
        #indice du point de rupture
        k = len(t0[t0 <= t]) - 1
        if k >= 0:
            return y0[k]
        else:
            return 0.
    return _fcn_wrapper

Modération: merci de mettre en forme les extraits de code comme expliqué ici.

1 réponse

mamiemando Messages postés 33769 Date d'inscription   Statut Modérateur Dernière intervention   7 879
 

Bonjour,

Afin de clarifier la question initiale

 f n'est pas utileet on peut appeler constante_par_morceaux ainsi :

g = constante_par_morceau([0, 1, 2], [10, 20, 15])
print(g([0, 0.5, 1, 1.5, 2]))
# [10, 10, 20, 20, 15]

Retour à la question

constante_par_morceau retourne une fonction, pas des valeurs. La fonction en question prend en paramètre un vecteur ou un scalaire t qui a ce stade n'est pas connu (il ne le sera qu'au moment d'appeler g, dans exemple [0, 0.5, 1, 1.5, 2].

Bonne chance

0