2016-06-03 4 views
2

Рассмотрим пример:Есть ли сокращение для повторного переназначения переменной?

x = 27 
x = sqr(x) 
x += 2 
x = x * 0.1 

Это тривиальным может быть уменьшена до

x = 0.1 * (sqr(27) + 2) 

Теперь рассмотрим (х как OrderedDict)

x = {k: bubble_sort(v) for k, v in x.items()} 

x = {k: rename(k) for k, v in x.items()} 

x = {k: abs(k) for k, v in x.items()} 

Есть сокращенная трюк, чтобы избежать повторения переменное присвоение? Например, есть такая функция, что:

def pipeline(x, function_handles): 
    .... 
    for f in function_handles: 
     x.apply(f) #in place 
return x 

или

def pipeline(x, expression): 
    .... 
    for ex in expression: 
     ex(x) #in place 
return x 
+1

'карта (FUNC, итерацию)'? –

+0

Самый рабочий материал, о котором я могу думать, - это назначение кортежа, но я не гарантирую, что вы можете делать такие вещи, как 'x, x, x = e, f (x), g (x)', будучи 'e' an выражения и 'f' и' g' произвольные функции. –

+5

Возможно, вы имели в виду: 'my_ordered_dict.items()' заменять на 'x.items()' в абзаце словаря? –

ответ

1

В operator модуле есть функция operator.methodcaller. Он работает как itemgetter, который вы, скорее всего, уже видели: с именем ,, возвращаемое значение methodcaller является частичной функцией, которая вызывает именованный метод его аргумента.

То есть, учитывая:

x = SomeObjectType() 
f = operator.methodcaller('amethod', 'arg1', arg2=100) 
f(x) 

То же самое, говоря:

x = SomeObjectType() 
x.amethod('arg1', arg2=100) 

Вы можете использовать это наряду с простыми lambda выражениями и/или functools.partial или partial_method для построения списка функций/методы, которые необходимо применять. Затем, как предположил @ cricket_007, вы можете использовать или писать код, чтобы автоматически применять их.

Также обратите внимание: functools.reduce. Вы можете написать или создать функцию вызывающего абонента, а затем использовать reduce, чтобы предоставить ему список функций для вызова.

Вот некоторый код, чтобы сократить список функций со списком данных (PY3, но работает в 2.7):

#!python3 
import functools 
import itertools 
import operator 

data = [8, 6, 7, 5, 3, 0, 9] 

def apply(val, fn): 
    print("F=",fn, "val=",val) 
    return fn(val) 


from functools import reduce 

fns = [sorted, 
     max, 
     str, 
    ] 

print(reduce(apply, fns, data)) 
Смежные вопросы