2015-06-02 9 views
5

मैं एक बहुत चालाक थोड़ा समारोह है कि दो कार्यों लेता भर में आया था, एक तर्क x दी एक दूसरे को एक के ऊपर एक लागू होता है:इस लैम्ब्डा को * तर्क की आवश्यकता क्यों है, इससे क्या फर्क पड़ता है?

def compose(f,g): 
    return lambda *x: f(g(*x)) 

अब मेरी मुद्दा, *x साथ है के रूप में मैं यह नहीं देख पाते वास्तव में कर रही है यहाँ कुछ भी यह x (तारांकन के बिना) क्यों आसान नहीं हो सकता है?

>>> def compose(f,g): 
... return lambda *x: f(g(*x)) 
... 
>>> this = lambda i: i+1 
>>> that = lambda b: b+1 
>>> compose(this,that)(2) 
4 

>>> def compose(f,g): 
... return lambda x: f(g(x)) 
... 
>>> compose(this,that)(2) 
4 

>>> def compose(f,g): 
... return lambda *x: f(g(*x)) 
... 
>>> compose(this,that)(2,2) 
TypeError: <lambda>() takes exactly 1 argument (2 given) 
+4

@jonrsharpe जबकि यह '*'/'**' बताता है - मुझे नहीं लगता कि यह इस प्रश्न के संदर्भ को बताता है –

उत्तर

4

तो g (that अपने परीक्षण में) भी तर्क के परिवर्तनशील ले जा सकते हैं, तो lambda *x: f(g(*x)) उपयोगी हो सकता है:

यहाँ मेरी परीक्षण कर रहे हैं।

अन्यथा, इतना नहीं।

उद्देश्य बना समारोह तर्क के किसी भी संख्या के साथ लागू किया जा करने के लिए अनुमति देने के लिए है, और इन सभी तर्कों के लिए संरचना में आंतरिक कार्य करने के लिए प्रदान किया जाने वाला।

+3

उदाहरण के लिए: लिखें (abs, min) (1,2, -5, -3, - 6,12, -9) – dexgecko

1

समस्या अपने परीक्षण साथ कि आपके संरचना कार्यों this और that केवल एक ही तर्क स्वीकार करते हैं, तो अपने compose समारोह में * की बात खो दिया है (और आप त्रुटि प्राप्त एक "वास्तव में 1 तर्क लेता") ।

* ऑपरेटर की शक्ति स्पष्ट हो जाता है जब आप पैक tuples में पास करना चाहते हैं, और अपने lambdas इस समर्थन करते हैं:

इस सरल मानचित्र प्रयास करें उदाहरण को कम:

this = lambda *i: *[x**2 for x in i] # map tuple i 
that = lambda *b: sum(b) # reduce tuple b 

def compose(f,g): 
    return lambda *x: f(*g(*x)) 

compose(that,this)(2,2) 
3

की मदद के लिए @ फ्रेडेरिक का जवाब , यह सबसे अधिक लचीला अगर compose मानक *args, **kwargs construct इस्तेमाल किया होगा:

def compose(f,g): 
    return lambda *args, **kwargs: f(g(*args, **kwargs)) 

इस तरह, g के हस्ताक्षर के बावजूद compose किसी भी g फ़ंक्शन के साथ काम करता है।

आपके प्रश्न में से एक केवल पहले भाग का उपयोग कर रहा है, यानी *args, और इसके लिए एक अलग (अपरंपरागत) नाम, *x का उपयोग कर रहा है।

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