2016-08-24 17 views

Odpowiedz

17

pomocą reduce() function:

# forward-compatible import 
from functools import reduce 

result = reduce(lambda res, f: f(res), funcs, val) 

reduce() dotyczy pierwszego argumentu wywoływalnym, do każdego elementu pobranej od drugiego argumentu plus skumulowany wynik tej pory (jak (result, element)). Trzeci argument jest wartością początkową (pierwszy element z funcs zostanie użyty inaczej).

W języku Python 3 wbudowana funkcja została przeniesiona do functools.reduce() location; dla kompatybilności w przód, to samo odniesienie jest dostępne w Pythonie 2.6 i wyżej.

Inne języki mogą nazywać to folding.

Jeśli potrzebujesz pośrednich wyniki dla każdej funkcji też użyć itertools.accumulate() (tylko z Pythona 3.3 począwszy do wersji, która bierze argument funkcji):

from itertools import accumulate, chain 
running_results = accumulate(chain(val, funcs), lambda res, f: f(res)) 
+0

doskonała odpowiedź! Uwielbiam "List.fold_left" OCamla, aw Pythonie mamy 'functools.reduce()' :) – Viet

+2

@Viet: zobacz [lista Wikipedia * zwiń * w różnych językach programowania] (https://en.wikipedia.org/wiki/Fold_ (higher-order_function) #Folds_in_various_languages). –

1

MartijnPieters odpowiedź jest doskonała. Jedyną rzeczą, którą chciałbym dodać, że jest to nazywane function composition

Nadanie nazwy tych leków generycznych oznacza, że ​​można z nich korzystać, gdy zajdzie taka potrzeba

from functools import reduce 

def id(x): 
    return x 

def comp(f,g): 
    return lambda x: f(g(x)) 

def compose(*fs): 
    return reduce(comp, fs, id) 

# usage 
# compose(f1, f2, f3, ..., fn) (val) 

print(compose (lambda x: x + 1, lambda x: x * 3, lambda x: x - 1) (10)) 
# = ((10 - 1) * 3) + 1 
# = 28 
+0

Dzięki za dodanie, @naomik: D – Viet

Powiązane problemy