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


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

lambda: print "x"

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

8 142

8 ответов:

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, print может работать в лямбде, не изменяя семантику лямбды.

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

Предположим ваш 'неинструментальный' Lambda-это:

lambda: 4

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

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