Appel d'une fonction dans une autre fonction

Fermé
Nucleaire78 - Modifié le 15 nov. 2022 à 18:21
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 - 15 nov. 2022 à 18:26

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.

A voir également:

1 réponse

mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 748
Modifié le 15 nov. 2022 à 18:27

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