Pourquoi ça ne marche pas?
lambda: print "x"
N'est-ce pas une déclaration unique ou est-ce autre chose? La documentation semble un peu clairsemée sur ce qui est permis dans un lambda ...
Le corps d'un lambda
doit être un expression unique. Dans Python 2.x, print
est une instruction. Cependant, dans Python 3, print
est un fonction (et une application de fonction est une expression, donc cela fonctionnera dans un lambda). Vous pouvez (et devriez, pour des raisons de compatibilité ascendante :) utiliser la fonction d'impression rétroportée si vous utilisez le dernier Python 2.x:
In [1324]: from __future__ import print_function
In [1325]: f = lambda x: print(x)
In [1326]: f("HI")
HI
Dans les cas où j'utilise ceci pour un simple écrasement, j'utilise ceci:
fn = lambda x: sys.stdout.write(str(x) + "\n")
qui fonctionne parfaitement.
ce que vous avez écrit équivaut à
def anon():
return print "x"
ce qui entraîne également un SyntaxError, python ne vous permet pas d'affecter une valeur à imprimer dans 2.xx; dans python3, vous pourriez dire
lambda: print('hi')
et cela fonctionnerait parce qu’ils ont changé l’impression pour devenir une fonction plutôt qu’une déclaration.
Le corps d'un lambda doit être une expression qui renvoie une valeur. print
, étant une déclaration, ne renvoie rien, pas même None
. De même, vous ne pouvez pas affecter le résultat de print
à une variable:
>>> x = print "hello"
File "<stdin>", line 1
x = print "hello"
^
SyntaxError: invalid syntax
Vous ne pouvez pas non plus mettre une affectation de variable dans un lambda, car les affectations sont des instructions:
>>> lambda y: (x = y)
File "<stdin>", line 1
lambda y: (x = y)
^
SyntaxError: invalid syntax
Vous pouvez faire quelque chose comme ça.
Crée une fonction pour transformer une déclaration print en une fonction:
def printf(text):
print text
Et imprimez le:
lambda: printf("Testing")
Avec Python 3.x, print PEUT fonctionner dans un lambda, sans changer la sémantique du lambda.
Utilisé de manière spéciale, il est très pratique pour le débogage. Je poste cette "réponse tardive", car c’est un truc pratique que j’utilise souvent.
Supposons que votre lambda 'non instrumenté' soit:
lambda: 4
Alors votre lambda 'instrumenté' est:
lambda: (print (3), 4) [1]
Le corps d'un lambda doit être un seul expression. print
est une déclaration, donc malheureusement, elle est désactivée.
Ici , vous voyez une réponse à votre question. print
n'est pas une expression en Python, dit-il.