В Python, что эквивалентно методу Ruby Array.each? У Python есть хороший и короткий синтаксис закрытия/лямбда для него?
[1,2,3].each do |x|
puts x
end
В Python, что эквивалентно методу Ruby Array.each? У Python есть хороший и короткий синтаксис закрытия/лямбда для него?
[1,2,3].each do |x|
puts x
end
Есть ли у Python хороший и короткий синтаксис закрытия/лямбда?
Да, но вы не хотите этого в этом случае.
Ближайший эквивалент этого кода Ruby:
new_values = map(print, [1, 2, 3])
Это выглядит довольно хорошо, когда у вас уже есть функция, лежащая вокруг, например print
. Когда у вас просто есть произвольное выражение, и вы хотите использовать его в map
, вам нужно создать из него функцию с помощью def
или lambda
, например:
new_values = map(lambda x: print(x), [1, 2, 3])
Это уродство, которое вы, видимо, хотите избежать. И у Python есть хороший способ избежать этого: понимание:
new_values = [print(x) for x in values]
Однако в этом случае вы просто пытаетесь выполнить некоторый оператор для каждого значения, а не накапливать новые значения для каждого значения. Итак, пока это будет работать (вы вернете список значений None
), это определенно не идиоматично.
В этом случае правильная вещь - это явно писать - нет замыканий, никаких функций, никаких понятий, просто цикл:
for x in values:
print x
Самый идиоматический:
for x in [1,2,3]:
print x
Вы можете использовать numpy для векторизованной арифметики над массивом:
>>> import numpy as np
>>> a = np.array([1, 2, 3])
>>> a * 3
array([3, 6, 9])
Вы можете легко определить лямбду, которая может быть использована для каждого элемента массива:
>>> array_lambda=np.vectorize(lambda x: x * x)
>>> array_lambda([1, 2, 3])
array([1, 4, 9])
Но, как говорили другие, если вы хотите просто распечатать каждый, используйте цикл.
Существуют также библиотеки, которые обертывают объекты, чтобы выставлять все обычные функции функционального программирования.
github underscore.py
)например. pydash позволяет вам делать такие вещи:
>>> from pydash import py_
>>> from __future__ import print_function
>>> x = py_([1,2,3,4]).map(lambda x: x*2).each(print).value()
2
4
6
8
>>> x
[2, 4, 6, 8]
(Просто всегда помните, чтобы "запускать" выполнение и/или обматывать завернутые значения с помощью .value()
в конце!)