Почему печать не работает в лямбда?

Почему это не работает?

lambda: print "x"

Это не одно утверждение, или это что-то еще? Документация кажется немного разреженной в том, что разрешено в лямбда...

Ответ 1

Тело

A lambda должно быть единственным выражением. В Python 2.x, print - это утверждение. Однако в Python 3 функция print является функцией (а приложение-функция - выражением, поэтому оно будет работать в лямбда). Вы можете (и должны, для прямой совместимости) использовать функцию обратной печати, если вы используете последнюю версию Python 2.x:

In [1324]: from __future__ import print_function

In [1325]: f = lambda x: print(x)

In [1326]: f("HI")
HI

Ответ 2

то, что вы написали, эквивалентно

def anon():
    return print "x"

который также приводит к SyntaxError, python не позволяет вам присваивать значение для печати в 2.xx; в python3 вы могли бы сказать

lambda: print('hi')

и это сработает, потому что они изменили печать как функцию вместо инструкции.

Ответ 3

В тех случаях, когда я использую это для простого создания, я использую это:

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

который отлично работает.

Ответ 4

Тело лямбда должно быть выражением, которое возвращает значение. print, будучи выражением, ничего не возвращает, даже None. Аналогично, вы не можете присвоить результат print переменной:

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

Вы также не можете поместить присвоение переменной в лямбда, так как назначения - это инструкции:

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

Ответ 5

Вы можете сделать что-то вроде этого.

Создать функцию преобразования оператора печати в функцию:

def printf(text):
   print text

И напечатайте его:

lambda: printf("Testing")

Ответ 6

Тело лямбда должно быть единственным выражением. print - это утверждение, поэтому оно, к сожалению.

Ответ 7

Здесь, вы видите ответ на свой вопрос. print не является выражением в Python, говорит он.

Ответ 8

С Python 3.x печать CAN работает в лямбда, не меняя семантики лямбда.

Используется особым образом, это очень удобно для отладки. Я публикую этот "поздний ответ", потому что это практический трюк, который я часто использую.

Предположим, что ваша "неинструментированная" лямбда:

lambda: 4

Тогда ваша "инструментальная" лямбда:

lambda: (print (3), 4) [1]