2013-09-23 2 views

ответ

28

ли 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 
+0

Это, вероятно, лучший и самый полный ответ, поскольку он фактически затрагивал вопросы лямбда, изложенные в вопросе, который мой ответ не сделал. +1 – Shashank

+1

Спасибо. Вы поразили каждую точку, о которой мне было интересно. – BuddyJoe

+0

Возможно, стоит отметить, что мои конкретные примеры работают только в Python 3.x (или, в 2.6-2.7, если вы делаете «из __future__ import print_function»); возможно, я должен был бы использовать 'sys.stdout.write' или что-то вроде грубого эквивалента' puts' вместо 'print', чтобы этого избежать ... Но если вы все поняли, я думаю, это достаточно хорошо. – abarnert

12

Наиболее идиоматическое:

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

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

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

0

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

Э.Г. 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() в конце концов!)

+0

Что мне лично нравится в написании кода, так это то, что он читает слева направо. Легче следить за потоками данных и значений. –

Смежные вопросы