В Python то, что эквивалентно методу Ruby's Array.each? У Python есть хороший и короткий синтаксис закрытия/лямбда?Питон эквивалентен Ruby Array.each метод
[1,2,3].each do |x|
puts x
end
В Python то, что эквивалентно методу Ruby's Array.each? У Python есть хороший и короткий синтаксис закрытия/лямбда?Питон эквивалентен Ruby Array.each метод
[1,2,3].each do |x|
puts x
end
ли Python есть хороший и короткий синтаксис закрытия/лямбда для него?
Да, но вы не хотите этого в этом случае.
Ближайший эквивалент этого кода рубин:
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()
в конце концов!)
Что мне лично нравится в написании кода, так это то, что он читает слева направо. Легче следить за потоками данных и значений. –
Это, вероятно, лучший и самый полный ответ, поскольку он фактически затрагивал вопросы лямбда, изложенные в вопросе, который мой ответ не сделал. +1 – Shashank
Спасибо. Вы поразили каждую точку, о которой мне было интересно. – BuddyJoe
Возможно, стоит отметить, что мои конкретные примеры работают только в Python 3.x (или, в 2.6-2.7, если вы делаете «из __future__ import print_function»); возможно, я должен был бы использовать 'sys.stdout.write' или что-то вроде грубого эквивалента' puts' вместо 'print', чтобы этого избежать ... Но если вы все поняли, я думаю, это достаточно хорошо. – abarnert