Python эквивалентен методу Ruby Array.each

В Python, что эквивалентно методу Ruby Array.each? У Python есть хороший и короткий синтаксис закрытия/лямбда для него?

[1,2,3].each do |x|
  puts x
end

Ответ 1

Есть ли у 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

Ответ 2

Самый идиоматический:

for x in [1,2,3]:
    print x

Ответ 3

Вы можете использовать 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])

Но, как говорили другие, если вы хотите просто распечатать каждый, используйте цикл.

Ответ 4

Существуют также библиотеки, которые обертывают объекты, чтобы выставлять все обычные функции функционального программирования.

например. 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() в конце!)