2017-10-07 12 views
-1

Pour les 4 fonctions suivantes:Python 3 toutes les fonctions de 1 ligne ne sont pas des lambdas?

def test1(a): 
    def result(b): 
    return a+b; 
    return result 

def test2(a): 
    return lambda b: a+b 

test3 = lambda a : lambda b : a+b 

test4 = lambda a : (lambda b : a+b) 

print(test1(2)(3)) 
print(test2(3)(4)) 
print(test3(5)(6)) 
print(test4(7)(8)) 

test1 fonctionne très bien test1(a)(b) renvoie un + b
test2 fonctionne bien aussi test2(a)(b) renvoie un + b
mais test3 et test4 donnent une erreur de syntaxe undefined variable a

pourquoi l'interprète peut-il trouver un dans test1 et 2 mais pas dans 3 ou 4?
Y at-il un moyen d'écrire la fonction de test en tant que lambda?

+4

Essayez d'exécuter effectivement le code - cela fonctionne. – MatsLindh

+0

Voir https://ideone.com/02s6h7 en cours d'exécution. –

+0

@roganjosh c'est une version simplifiée de mon problème bien sûr. Je ne pensais pas avoir besoin de mettre les appels à 'test1' et' test2' explicitement dans mon post. (Mais j'ai essayé dans mon propre code). Si vous aimez je vais l'ajouter ici mais je pense que cela ajoute un fouillis inutile. – fejfo

Répondre

2

Votre code est correct, le undefinded variable vous avez là est juste une question de l'IDE ou de l'aide que vous utilisez, semble qu'il ne peut pas capturer la portée lambda correctement.

Vous pouvez le voir courir avec la même « erreur » here enter image description here

+0

Une question sur un problème qui ne peut pas être reproduit doit être fermée, ou répondue. Une fois que vous avez défini une réponse, il est plus difficile pour quelqu'un d'autre de corriger n'importe quel bogue dans sa question qui le rendait non reproductible (puisque cela invalide votre réponse). –

+1

@CharlesDuffy, j'ai été capable de le reproduire, juste en copiant/collant le code dans la page web repl.it, leur analyseur de syntaxe donne réellement cette "erreur", il disparaît juste après la première exécution. Puis-je ajouter ceci comme information supplémentaire? – Netwave

+0

Hmm. Je suis enclin à voir à ce stade si nous pouvons encourager le PO à éditer la question pour spécifier quel outil donne l'erreur, plutôt que de simplement la décrire comme provenant de "Python 3". –