LAMBDA functions sous Python 3
getudir78
Messages postés
36
Statut
Membre
-
getudir78 Messages postés 36 Statut Membre -
getudir78 Messages postés 36 Statut Membre -
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 :
**Modifié par la modération pour une lecture plus facile du code, à l'avenir utilisez les balises, VOIR CETTE PAGE
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:
- LAMBDA functions sous Python 3
- Ai suite 3 - Télécharger - Optimisation
- Citizen code python avis - Accueil - Outils
- Picasa 3 - Télécharger - Albums photo
- Photorecit 3 - Télécharger - Visionnage & Diaporama
- Zelda 3 - Accueil - Guide jeu vidéo
2 réponses
yg_be
Messages postés
24281
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 585
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.
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.
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.
Puis l'appel.
De l'intérêt à faire ça dans ton code, une question à se poser.
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.
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.
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.
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
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