177 votes

Pourquoi l'impression ne fonctionne pas dans un lambda ?

Pourquoi ça ne marche pas ?

lambda: print "x"

Est-ce que ce n'est pas une déclaration unique, ou est-ce que c'est autre chose ? La documentation semble un peu maigre sur ce qui est autorisé dans un lambda...

1 votes

docs.python.org/reference/expressions.html#lambda . On y lit "expression", qui est un lien vers une définition complète de toutes les expressions possibles. Comment cela peut-il être "clairsemé" ? Qu'est-ce qui est incorrect ou incomplet ?

3 votes

@Lott J'avais une mauvaise compréhension de ce qu'est une expression/déclaration et de la place de l'impression.

202voto

A lambda Le corps d'une personne doit être un expression unique . Dans Python 2.x, print est une déclaration. Cependant, dans Python 3, print est un fonction (et une application de fonction est une expression, donc elle fonctionnera dans un lambda). Vous pouvez (et devriez, par souci de compatibilité :) utiliser la fonction print rétro-porté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 votes

Je comprends maintenant pourquoi c'était si important d'en faire une fonction. Je voulais utiliser print comme un kwarg par défaut et ceci a réglé le problème. Merci.

1 votes

Puis-je savoir pourquoi from __future__ import print_function doit être au début du code ? thx

0 votes

Où pourrais-je voir les empreintes de ce que nous avons écrit ici ?

28voto

Danny Staple Points 1725

Dans les cas où je l'utilise pour une simple dérivation, j'utilise ceci :

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

qui fonctionne parfaitement.

3 votes

En outre, utilisez le futur "from" ci-dessus. N'utilisez cette option que lorsqu'elle n'est pas disponible - ce qui serait une version sérieusement obsolète à l'heure actuelle.

25voto

dagoof Points 714

Ce que vous avez écrit est équivalent à

def anon():
    return print "x"

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

lambda: print('hi')

et ça marcherait parce qu'ils ont changé print pour être une fonction au lieu d'une déclaration.

3 votes

Il y a aussi from __future__ import print_function qui le permet dans py2.x

5 votes

Ou alternativement lambda: sys.stdout.write('hi')

0 votes

@fmark : Sauf que ce n'est pas aussi simple en 2.x : il faut gérer sys.stdout.softspace et (au moins) écrire une nouvelle ligne après.

11voto

Paul Kuliniewicz Points 1858

Le corps d'une lambda doit être une expression qui renvoie une valeur. print qui est une déclaration, ne renvoie rien, pas même None . De même, vous ne pouvez pas assigner 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 une lambda, puisque les affectations sont des déclarations :

>>> lambda y: (x = y)
  File "<stdin>", line 1
    lambda y: (x = y)
                 ^
SyntaxError: invalid syntax

11voto

dxhj Points 281

Vous pouvez faire quelque chose comme ça.

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

def printf(text):
   print text

Et l'imprimer :

lambda: printf("Testing")

2 votes

Plus de souplesse : def printf(fmt, *args): print(fmt % args)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X