LAMBDA functions sous Python 3

Fermé
getudir78 Messages postés 28 Date d'inscription vendredi 3 janvier 2014 Statut Membre Dernière intervention 2 septembre 2020 - Modifié le 6 déc. 2019 à 23:08
getudir78 Messages postés 28 Date d'inscription vendredi 3 janvier 2014 Statut Membre Dernière intervention 2 septembre 2020 - 8 déc. 2019 à 23:06
Bonjour,

Je suis un cours d’initiation à la programmation Python et je bute sur la transformation d'une fonction classique en lambda function. J'ai créé un cas d'école qui n'a pas d'intérêt en lui même mais qui sert de support pour comprendre sur un exemple, comment écrire une lambda fonction qui fait la même chose que la fonction classique.
La fonction appliquée à [[3, 1], [0, 2], [2,9]] donne [1, 1, 1,9, 9], soit trois 1, zéro 2 et deux 9.
La fonction classique que j'ai appelée 'construit_fct(t)' donne le bon résultat.
L'exécution de la lambda function que j'ai appelée 'construit_anonyme(t)' ne crée pas d'etteur à l'exécution mais n'imprime pas la liste attendue.
Je vois bien que quelque chose m'échappe et si vous pouvez m'éclairer, je vous en remercie par avance.
Cordialement,

Voici le code sur lequel je travaille :
def construit_fct(t) :
 """ liste ordonnée des chiffres successifs t[1]  répétés t[0] fois """
 # donne bien le résultat attendu
 liste_t = []
 for c_t  in t :
  #extend élimine les ajouts de longueur nulle
  liste_t.extend([(c_t[1])]*c_t[0])  # donne la réponse correcte
 return liste_t
 
def construit_anonyme(t) :
 """ liste ordonnée des chiffres successifs t[1]  répétés t[0] fois """
 # ne donne pas le résultat escompté
 return (lambda c_t : [].extend([(c_t[1])]*c_t[0]) for c_t in t)
 
def main() :

 liste_1 = [[3, 1], [0, 2], [2,9]]
 print("liste à traiter : ",liste_1)
 print("résultat attendu : ",[1, 1, 1,9, 9])
 liste_decomp_1 = construit_fct(liste_1)
 print("liste construite par la fonction classique = ",liste_decomp_1)
 print("")
 liste_decomp_2 = construit_anonyme(liste_1)
 print("liste construite par la fonction anonyme = ",(liste_decomp_2))
 
if __name__ == '__main__' :
 main()

**Modifié par la modération pour une lecture plus facile du code, à l'avenir utilisez les balises, VOIR CETTE PAGE

Configuration: Windows / Firefox 71.0
A voir également:

2 réponses

yg_be Messages postés 23408 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 décembre 2024 Ambassadeur 1 557
7 déc. 2019 à 00:02
bonjour,
1) tu n'utilises pas la syntaxe correcte pour déclarer une fonction lambda.
une recherche avec "python fonction lambda" te donnera immédiatement des exemples de la syntaxe a utiliser.
2) tu ne peux pas transformer n'importe quelle fonction en fonction lambda. la fonction doit n'être qu’une seule expression. si tu penses que c'est possible, commence par créer et tester une fonction classique n'étant qu'une seule expression, et qui donne le même résultat que ta fonction de départ.
0
Bonjour,

Ta fonction construit_anonyme est une closure..

De un tu ne l'appelles pas dans ton code, de deux extend retourne None, de trois, pas besoin de mettre un paramètre à lambda.
def construit_anonyme(t) :
    """ liste ordonnée des chiffres successifst[1] répétés t[0] fois """
    return lambda: [x for l in t for x in ((l[1],) * l[0])]


Puis l'appel.

liste_decomp_2 = construit_anonyme(liste_1)()


De l'intérêt à faire ça dans ton code, une question à se poser.
0
yg_be Messages postés 23408 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 décembre 2024 1 557
7 déc. 2019 à 12:03
pourquoi alors ne pas faire:
construit_anonyme = lambda t : [x for l in t for x in ((l[1],) * l[0])]
0
getudir78 Messages postés 28 Date d'inscription vendredi 3 janvier 2014 Statut Membre Dernière intervention 2 septembre 2020 33 > yg_be Messages postés 23408 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 décembre 2024
8 déc. 2019 à 23:06
Merci pour ta suggestion. Je l'ai mise en œuvre ; elle fonctionne parfaitement.
Mon but sur ce cas d'école était de mettre en parallèle une fonction définie classiquement et une lambda function. J'ai donc essayé de garder le maximum de similitude; d'où la définition avec un def. Dans le cas où je l'utiliserais plusieurs fois, ça m'éviterait de dupliquer du code.
0
getudir78 Messages postés 28 Date d'inscription vendredi 3 janvier 2014 Statut Membre Dernière intervention 2 septembre 2020 33
7 déc. 2019 à 17:55
Bonsoir,

Merci pour ton aide.
Au niveau de mon cours d'initiation, je ne sais pas ce qu'est une closure mais ça n'est pas grave. J'ai bien compris que définir une fonction qu'on n'appelle pas, ça ne sert à rien.
Si j'ai bien interprété construit_anonyme(liste_1)() , les () servent à exécuter la fonction lambda du return.
J'ai utilisé ton code et j'ai vérifié qu'on obtient les bons résultats.
J'en ai aussi adapté une version avec un return sans lambda qui donne les mêmes résultats et qui ne nécessite pas les () lors de l'appel.
Encore merci pour ton aide qui m'a apporté des éléments de réflexion que je n'avais pas trouvé sur internet
0