Чому друк не працює в лямбда?


163

Чому це не працює?

lambda: print "x"

Це не одне твердження чи це щось інше? Документація здається трохи рідкою щодо того, що дозволено в лямбда ...


1
docs.python.org/reference/expressions.html#lambda . У ньому йдеться про «вираз», який є посиланням на повне визначення всіх можливих виразів. Як це "розріджене"? Що було неправильним чи неповним?
С.Лотт

3
@Lott У мене було непорозуміння, що таке вираз / вислів і куди належить друк. тепер має сенс
Anycorn

Відповіді:


187

А 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

5
Тепер я бачу, чому це було так багато, щоб зробити це функцією. Хотів використовувати print як kwarg за замовчуванням, і це виправлено. Дякую.
Томас Дігнан

1
Чи можу я знати, чому це from __future__ import print_functionповинно бути на початку коду? thx
Бен

Де б я побачив відбитки того, що ми написали тут?
Ск. Ірфан

Я погоджуюся з коментарем Бена: я не отримую цього імпорту. У Python (2 або 3) є print()вбудований метод.
ivanleoncz

27

У випадках, коли я використовую це для простого заглушки, я використовую це:

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

що працює чудово.


3
В якості додаткової примітки - використовуйте з майбутнього вище. Використовуйте це лише там, де це недоступно - що б зараз серйозно застаріла версія.
Danny Staple

24

те, що ви написали, еквівалентно

def anon():
    return print "x"

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

lambda: print('hi')

і це буде працювати, тому що вони змінили друк на функцію замість заяви.


3
Є також from __future__ import print_function, що дозволяє це в py2.x
tzaman

5
Або альтернативноlambda: sys.stdout.write('hi')
відзначте

@fmark: За винятком того, що це не так просто в 2.x: вам потрібно обробити sys.stdout.softspace і (принаймні) написати новий рядок після цього.
Фред Нурк

11

Тіло лямбда має бути виразом, який повертає значення. 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

11

Можна зробити щось подібне.

Створіть функцію для перетворення оператора друку у функцію:

def printf(text):
   print text

І роздрукуйте:

lambda: printf("Testing")

Більш гнучко:def printf(fmt, *args): print(fmt % args)
IvyMike

4

З Python 3.x друк CAN може працювати в лямбда, не змінюючи семантики лямбда.

Використовується спеціальним чином, це дуже зручно для налагодження. Я публікую цю "пізню відповідь", тому що я часто використовую практичну хитрість.

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

lambda: 4

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

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

3

Тіло лямбда має бути єдиним виразом . printце твердження, тож воно, на жаль, вийшло.


дякую, я не був впевнений у визначенні виразу проти твердження, тепер це має сенс
Anycorn

2

Тут ви бачите відповідь на своє запитання. printце не вираження в Python, це говорить.


1
Неповна відповідь, але приємне посилання.
Стівен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.