Почему это не работает?
lambda: print "x"
Это не одно утверждение, или это что-то еще? Документация кажется немного разреженной в том, что разрешено в лямбда...
Почему это не работает?
lambda: print "x"
Это не одно утверждение, или это что-то еще? Документация кажется немного разреженной в том, что разрешено в лямбда...
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
то, что вы написали, эквивалентно
def anon():
return print "x"
который также приводит к SyntaxError, python не позволяет вам присваивать значение для печати в 2.xx; в python3 вы могли бы сказать
lambda: print('hi')
и это сработает, потому что они изменили печать как функцию вместо инструкции.
В тех случаях, когда я использую это для простого создания, я использую это:
fn = lambda x: sys.stdout.write(str(x) + "\n")
который отлично работает.
Тело лямбда должно быть выражением, которое возвращает значение. 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
Вы можете сделать что-то вроде этого.
Создать функцию преобразования оператора печати в функцию:
def printf(text):
print text
И напечатайте его:
lambda: printf("Testing")
Тело лямбда должно быть единственным выражением. print
- это утверждение, поэтому оно, к сожалению.
Здесь, вы видите ответ на свой вопрос. print
не является выражением в Python, говорит он.
С Python 3.x печать CAN работает в лямбда, не меняя семантики лямбда.
Используется особым образом, это очень удобно для отладки. Я публикую этот "поздний ответ", потому что это практический трюк, который я часто использую.
Предположим, что ваша "неинструментированная" лямбда:
lambda: 4
Тогда ваша "инструментальная" лямбда:
lambda: (print (3), 4) [1]