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


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.