Цикл for внутри лямбды
Заголовок: Ошибка при использовании цикла for
внутри лямбда-выражения в Python
Описание проблемы:
Мне нужно максимально упростить свой код, чтобы он состоял из одной строки. Я пытаюсь вставить цикл for
внутрь лямбда-выражения, примерно так:
x = lambda x: (for i in x: print(i))
Но это не работает, и я не знаю, как правильно оформить это выражение. Как можно реализовать подобную функциональность, чтобы обойтись одной строкой кода?
5 ответ(ов)
На случай, если кто-то ищет подобную проблему...
Большинство решений, представленных здесь, в одну строку, достаточно readable и простые. Хотел бы добавить еще одно, которое не требует использования lambda (я предполагаю, что вы пытаетесь использовать lambda просто ради того, чтобы сделать это в одну строку). Вместо этого можно воспользоваться простой генерацией списка.
[print(i) for i in x]
К слову, возвращаемые значения в этом случае будут списком из None
.
В Python, поскольку цикл for
является оператором (как и print
в Python 2.x), вы не можете использовать его в лямбда-выражении. Вместо этого вы можете воспользоваться методом write
объекта sys.stdout
вместе с методом join
. Вот пример кода:
import sys
x = lambda x: sys.stdout.write("\n".join(x) + "\n")
Таким образом, вы сможете объединить элементы списка x
с помощью join
и вывести их в стандартный вывод, добавив перенос строки в конце.
В дополнение к ответу chepner на Python 3.0 можно сделать так:
x = lambda x: list(map(print, x))
Разумеется, это возможно только если у вас есть возможность использовать Python версии выше 3... На мой взгляд, это выглядит немного чище, но при этом у функции есть странное значение возвращаемого значения, хотя, вероятно, вы всё равно его игнорируете.
Просто оставлю это здесь для справки.
Ответы 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
>>>
Если вы, как и я, хотите напечатать последовательность внутри лямбды, не получая при этом возвращаемое значение (список из 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
в результате.
Сравнение: генераторы списков против lambda + filter
Как пройтись по двум спискам параллельно?
Каковы преимущества использования лямбд? [закрыто]
Как работает это выражение с лямбдой/yield/генератором?
Как изменить порядок столбцов в DataFrame?