2016-08-24 7 views
7

मैं एक इनपुट मूल्य val और कार्यों की एक सूची के क्रम में लागू किया जाना है में अजगर कार्यों की एक सूची लागू करें:आदेश सुंदर ढंग से

funcs = [f1, f2, f3, ..., fn] 

कैसे सुंदर ढंग से लागू करने के लिए और नहीं लिख

fn(... (f3(f2(f1(val))) ...) 
भयानक जवाब के लिए

tmp = val 
for f in funcs: 
    tmp = f(tmp) 

धन्यवाद Martijn:

और भी पाश के लिए उपयोग नहीं कर। मैंने कुछ पढ़ा है: https://mathieularose.com/function-composition-in-python/

उत्तर

17

उपयोग reduce() function:

# forward-compatible import 
from functools import reduce 

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

reduce() पहला तर्क, एक प्रतिदेय, प्रत्येक तत्व दूसरा तर्क से लिया, प्लस संचित परिणाम अब तक पर लागू होता है ((result, element) के रूप में)। तीसरा तर्क एक प्रारंभिक मान है (funcs का पहला तत्व अन्यथा उपयोग किया जाएगा)।

पायथन 3 में, अंतर्निहित फ़ंक्शन functools.reduce() location पर ले जाया गया था; आगे संगतता के लिए कि एक ही संदर्भ पायथन 2.6 और ऊपर में उपलब्ध है।

अन्य भाषाएं इस folding पर कॉल कर सकती हैं।

आप प्रत्येक कार्य के लिए भी जरूरत है मध्यवर्ती परिणाम, (केवल अजगर 3.3 के बाद से एक संस्करण है कि एक समारोह तर्क लेता के लिए) itertools.accumulate() का उपयोग करें:

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

बिल्कुल सही जवाब उठता है आप उन्हें प्रयोग कर सकते हैं! मुझे ओकैमल की 'List.fold_left' से प्यार है और पायथन में हमारे पास' functools.reduce() ':) – Viet

+2

@Viet: [विभिन्न प्रोग्रामिंग भाषाओं में * गुना * की विकिपीडिया सूची] देखें (https://en.wikipedia.org/wiki/Fold_ (उच्च order_function) #Folds_in_various_languages)। –

1

MartijnPieters का जवाब उत्कृष्ट है। केवल एक चीज मैं जोड़ना होगा है इस function composition कहा जाता है कि

इन जेनरिक को नाम देने का मतलब है जब भी जरूरत

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

इसके अलावा धन्यवाद, @naomik: डी – Viet

संबंधित मुद्दे