0

Цикл for внутри лямбды

32

Заголовок: Ошибка при использовании цикла for внутри лямбда-выражения в Python

Описание проблемы:

Мне нужно максимально упростить свой код, чтобы он состоял из одной строки. Я пытаюсь вставить цикл for внутрь лямбда-выражения, примерно так:

x = lambda x: (for i in x: print(i))

Но это не работает, и я не знаю, как правильно оформить это выражение. Как можно реализовать подобную функциональность, чтобы обойтись одной строкой кода?

5 ответ(ов)

0

На случай, если кто-то ищет подобную проблему...

Большинство решений, представленных здесь, в одну строку, достаточно readable и простые. Хотел бы добавить еще одно, которое не требует использования lambda (я предполагаю, что вы пытаетесь использовать lambda просто ради того, чтобы сделать это в одну строку). Вместо этого можно воспользоваться простой генерацией списка.

[print(i) for i in x]

К слову, возвращаемые значения в этом случае будут списком из None.

0

В Python, поскольку цикл for является оператором (как и print в Python 2.x), вы не можете использовать его в лямбда-выражении. Вместо этого вы можете воспользоваться методом write объекта sys.stdout вместе с методом join. Вот пример кода:

import sys

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

Таким образом, вы сможете объединить элементы списка x с помощью join и вывести их в стандартный вывод, добавив перенос строки в конце.

0

В дополнение к ответу chepner на Python 3.0 можно сделать так:

x = lambda x: list(map(print, x))

Разумеется, это возможно только если у вас есть возможность использовать Python версии выше 3... На мой взгляд, это выглядит немного чище, но при этом у функции есть странное значение возвращаемого значения, хотя, вероятно, вы всё равно его игнорируете.

Просто оставлю это здесь для справки.

0

Ответы anon и chepner на правильном пути. В Python 3.x используется функция print, и именно она вам понадобится, если вы хотите использовать вывод внутри функции (и, тем более, в лямбдах).

Тем не менее, в Python 2.x вы можете легко получить функцию print, импортировав её из модуля future стандартной библиотеки. Вот как это сделать:

>>> from __future__ import print_function
>>>
>>> iterable = ["a", "b", "c"]
>>> map(print, iterable)
a
b
c
[None, None, None]
>>>

Может показаться, что это выглядит немного странно, поэтому, если вы хотите подавить вывод [None, None, None], вы можете присвоить результат переменной _, предполагая, что вас интересуют только побочные эффекты:

>>> _ = map(print, iterable)
a
b
c
>>>
0

Если вы, как и я, хотите напечатать последовательность внутри лямбды, не получая при этом возвращаемое значение (список из None), вот простой способ сделать это:

x = range(3)
from __future__ import print_function           # если не Python 3
pra = lambda seq=x: [print(i) for i in seq]    # pra для 'print all'
pra()
pra('abc')

В этом коде мы используем списковое выражение для вызова print() для каждого элемента последовательности. Это позволяет избежать возвращения map с None и обеспечивает вывод значений сразу на экран. При вызове pra() вы сможете видеть печатаемые значения без лишних None в результате.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь