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 ...


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

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.


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.


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

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")

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]

3

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


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.


1
Réponse incomplète, mais joli lien.
Stephen le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.