Pourquoi l'impression ne fonctionne-t-elle pas dans un lambda?

164

Pourquoi ça ne marche pas?

lambda: print "x"

N'est-ce pas une seule déclaration ou est-ce autre chose? La documentation semble un peu clairsemée sur ce qui est autorisé dans un lambda ...

Anycorn
la source
1
docs.python.org/reference/expressions.html#lambda . Il dit «expression», qui est un lien vers une définition complète de toutes les expressions possibles. Comment est-ce «clairsemé»? Qu'est-ce qui était incorrect ou incomplet?
S.Lott
3
@Lott J'avais mal compris ce qu'est l'expression / la déclaration et à quoi appartient l'impression. ça a du sens maintenant
Anycorn

Réponses:

188

Le lambdacorps de A doit être une seule expression . En Python 2.x, printest une déclaration. Cependant, dans Python 3, printest une fonction (et une application de fonction est une expression, donc cela fonctionnera dans un lambda). Vous pouvez (et devriez, pour la compatibilité ascendante :) utiliser la fonction d'impression rétroportée si vous utilisez la dernière version de Python 2.x:

In [1324]: from __future__ import print_function

In [1325]: f = lambda x: print(x)

In [1326]: f("HI")
HI
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
la source
5
Maintenant, je vois pourquoi c'était si important d'en faire une fonction. Je voulais utiliser l'impression comme kwarg par défaut et cela l'a corrigé. Merci.
Thomas Dignan
1
Puis-je savoir pourquoi devrait from __future__ import print_functionêtre au début du code? thx
Ben
Où pourrais-je voir les impressions de ce que nous avons écrit ici?
Sk. Irfan
Je suis d'accord avec le commentaire de Ben: je ne reçois pas cette importation. Python (2 ou 3) a print()comme méthode intégrée.
ivanleoncz
27

Dans les cas où j'utilise ceci pour un simple stubbing, j'utilise ceci:

fn = lambda x: sys.stdout.write(str(x) + "\n")

qui fonctionne parfaitement.

Danny Agrafe
la source
3
En guise de note supplémentaire - utilisez le futur ci-dessus. Utilisez ceci uniquement là où cela n'est pas disponible - ce qui serait une version sérieusement obsolète pour le moment.
Danny Staple
24

ce que tu as écrit équivaut à

def anon():
    return print "x"

ce qui entraîne également une SyntaxError, python ne vous permet pas d'attribuer une valeur à imprimer dans 2.xx; en python3 vous pourriez dire

lambda: print('hi')

et cela fonctionnerait parce qu'ils ont changé print pour être une fonction au lieu d'une instruction.

dagoof
la source
3
Il y a aussi from __future__ import print_function, ce qui permet cela dans py2.x
tzaman
5
Ou bienlambda: sys.stdout.write('hi')
fmark le
@fmark: Sauf que ce n'est pas si simple en 2.x: vous devez gérer sys.stdout.softspace et (au moins) écrire une nouvelle ligne par la suite.
Fred Nurk
11

Le corps d'un lambda doit être une expression qui renvoie une valeur. print, étant une déclaration, ne renvoie rien, même pas 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 placer 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
Paul Kuliniewicz
la source
11

Vous pouvez faire quelque chose comme ça.

Créez une fonction pour transformer l'instruction d'impression en fonction:

def printf(text):
   print text

Et imprimez-le:

lambda: printf("Testing")
Victor C. Martins
la source
Plus flexible:def printf(fmt, *args): print(fmt % args)
IvyMike
4

Avec Python 3.x, print CAN fonctionne dans un lambda, sans changer la sémantique du lambda.

Utilisé d'une manière spéciale, c'est très pratique pour le débogage. Je poste cette «réponse tardive», car c'est une astuce pratique que j'utilise souvent.

Supposons que votre lambda `` non instrumenté '' soit:

lambda: 4

Alors votre lambda `` instrumenté '' est:

lambda: (print (3), 4) [1]
Jacques de Hooge
la source
3

Le corps d'un lambda doit être une seule expression . printest une déclaration, donc c'est sorti, malheureusement.

Tzaman
la source
merci, je n'étais pas sûr de la définition de l'expression par rapport à la déclaration, maintenant cela a du sens
Anycorn
2

Ici , vous voyez une réponse à votre question. printn'est pas une expression en Python, dit-il.

vpit3833
la source
1
Réponse incomplète, mais joli lien.
Stephen le