Por que a impressão não funciona em uma lambda?

163

Por que isso não funciona?

lambda: print "x"

Esta não é uma afirmação única ou é outra coisa? A documentação parece um pouco esparsa sobre o que é permitido em um lambda ...

Anycorn
fonte
1
docs.python.org/reference/expressions.html#lambda . Diz "expressão", que é um link para uma definição completa de todas as expressões possíveis. Como isso é "escasso"? O que estava incorreto ou incompleto?
S.Lott
3
@Lott Eu entendi mal o que é expressão / declaração e onde a impressão pertence. faz sentido agora
Anycorn

Respostas:

187

O lambdacorpo de A tem que ser uma única expressão . No Python 2.x, printé uma declaração. No entanto, no Python 3, printé uma função (e um aplicativo de função é uma expressão, portanto, ele funciona em uma lambda). Você pode (e deve, para compatibilidade direta) usar a função de impressão com porta traseira se estiver usando o Python 2.x mais recente:

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̲̳̳
fonte
5
Agora vejo por que era tão importante fazer disso uma função. Queria usar a impressão como padrão e isso foi corrigido. Obrigado.
Thomas Dignan
1
Posso saber por que from __future__ import print_functiondeveria estar no início do código? thx
Ben
Onde eu veria as impressões do que escrevemos aqui?
Sk. Irfan
Concordo com o comentário de Ben: não recebo essa importação. Python (2 ou 3) tem print()como método interno.
precisa saber é o seguinte
27

Nos casos em que estou usando isso para simplificar a remoção, uso o seguinte:

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

o que funciona perfeitamente

Danny Staple
fonte
3
Como nota adicional - use o do futuro acima. Use isso somente onde não estiver disponível - o que seria uma versão seriamente desatualizada no momento.
Danny Staple
24

o que você escreveu é equivalente a

def anon():
    return print "x"

que também resulta em um SyntaxError, o python não permite atribuir um valor para imprimir em 2.xx; em python3 você poderia dizer

lambda: print('hi')

e funcionaria porque eles mudaram a impressão para ser uma função em vez de uma instrução.

dagoof
fonte
3
Há também from __future__ import print_function, o que permite isso em py2.x
tzaman
5
Ou, em alternativalambda: sys.stdout.write('hi')
fmark
@mark: Exceto que não é tão simples no 2.x: você precisa lidar com o sys.stdout.softspace e (pelo menos) escrever uma nova linha posteriormente.
Fred Nurk
11

O corpo de uma lambda deve ser uma expressão que retorne um valor. print, sendo uma afirmação, não retorna nada, nem mesmo None. Da mesma forma, você não pode atribuir o resultado de printa uma variável:

>>> x = print "hello"
  File "<stdin>", line 1
    x = print "hello"
            ^
SyntaxError: invalid syntax

Você também não pode colocar uma atribuição de variável em um lambda, pois atribuições são instruções:

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

Você pode fazer algo assim.

Crie uma função para transformar a instrução print em uma função:

def printf(text):
   print text

E imprima:

lambda: printf("Testing")
Victor C. Martins
fonte
Mais flexibilidade:def printf(fmt, *args): print(fmt % args)
IvyMike
4

Com o Python 3.x, o CAN pode funcionar em uma lambda, sem alterar a semântica da lambda.

Usado de uma maneira especial, é muito útil para depuração. Eu posto essa 'resposta tardia', porque é um truque prático que costumo usar.

Suponha que sua lambda 'não instrumentada' seja:

lambda: 4

Então seu lambda 'instrumentado' é:

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

O corpo de um lambda deve ser uma expressão única . printé uma afirmação, então saiu, infelizmente.

tzaman
fonte
obrigado, eu não tinha certeza sobre a definição de expressão contra a declaração, agora faz sentido
Anycorn
2

Aqui , você vê uma resposta para sua pergunta. printnão é expressão em Python, diz.

vpit3833
fonte
1
Resposta incompleta, mas bom link.
Stephen