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


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

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


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.


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

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

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]

3

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


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.


1
Resposta incompleta, mas bom link.
Stephen
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.