Почему печать не работает в лямбде? - PullRequest
150 голосов
/ 04 июня 2010

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

lambda: print "x"

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

Ответы [ 8 ]

177 голосов
Тело

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
24 голосов
/ 25 мая 2011

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

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

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

24 голосов
/ 04 июня 2010

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

def anon():
    return print "x"

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

lambda: print('hi')

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

11 голосов
/ 14 апреля 2014

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

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

def printf(text):
   print text

И распечатать его:

lambda: printf("Testing")
11 голосов
/ 04 июня 2010

Тело лямбды должно быть выражением, которое возвращает значение. 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
3 голосов
/ 13 февраля 2017

В Python 3.x печать МОЖЕТ работать в лямбде, без изменения семантики лямбды.

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

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

lambda: 4

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

lambda: (print (3), 4) [1]
3 голосов
/ 04 июня 2010

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

2 голосов
/ 04 июня 2010

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

...