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