web-dev-qa-db-fra.com

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

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

150
Anycorn

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.

24
Danny Staple

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.

24
dagoof

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
11
Paul Kuliniewicz

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")
11
Victor C. Martins

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]
3
Jacques de Hooge

Le corps d'un lambda doit être un seul expression. print est une déclaration, donc malheureusement, elle est désactivée.

3
tzaman

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

2
vpit3833