2011-06-09 21 views
64

क्या पाइथन फ़ंक्शन किसी अन्य फ़ंक्शन का तर्क हो सकता है?पाइथन फ़ंक्शन एक तर्क तर्क के रूप में कार्य करता है?

कहते हैं:

  1. यह बिल्कुल अनुमति है:

    def myfunc(anotherfunc, extraArgs): 
        # run anotherfunc and also pass the values from extraArgs to it 
        pass 
    

    तो यह मूल रूप से दो सवाल है?

  2. और यदि यह है, तो मैं अन्य फ़ंक्शन के अंदर फ़ंक्शन का उपयोग कैसे करूं? क्या मुझे exec(), eval() या ऐसा कुछ उपयोग करने की आवश्यकता होगी? उनके साथ गड़बड़ करने की जरूरत नहीं है।

बीटीडब्ल्यू, अतिरिक्तआर्ग एक औरफनक के तर्कों की सूची/टुपल है।

+0

संबंधित: https://stackoverflow.com/questions/47502068/is-there-a-formal-name-for-a-function-that-accepts-a-functions-as-an-argument/47634215#47634215 – alseether

उत्तर

73

क्या कोई पाइथन फ़ंक्शन किसी अन्य फ़ंक्शन के पर तर्क कर सकता है?

हां।

def myfunc(anotherfunc, extraArgs): 
    anotherfunc(*extraArgs) 

अधिक विशिष्ट होना करने के लिए ... विभिन्न तर्क के साथ ...

>>> def x(a,b): 
...  print "param 1 %s param 2 %s"%(a,b) 
... 
>>> def y(z,t): 
...  z(*t) 
... 
>>> y(x,("hello","manuel")) 
param 1 hello param 2 manuel 
>>> 
+0

अतिरिक्त एआरजी भी एक समारोह हो सकता है? यदि हां, तो आप इसे कैसे कहते हैं? – Sekai

+0

@sekai हां, अतिरिक्त आर्ग भी एक समारोह हो सकता है। –

+0

इसे y (z, * t) – sabujp

2
  1. हाँ, यह अनुमति दी गई है।
  2. आप फ़ंक्शन का उपयोग के रूप में आप किसी अन्य होगा: anotherfunc(*extraArgs) अजगर में
15

कार्य प्रथम श्रेणी वस्तुओं रहे हैं। लेकिन आपकी फ़ंक्शन परिभाषा is a bit off

def myfunc(anotherfunc, extraArgs, extraKwArgs): 
    return anotherfunc(*extraArgs, **extraKwArgs) 
3

ज़रूर, यही कारण है कि अजगर निम्न विधियों में जहां पहले पैरामीटर एक समारोह है लागू करता है:

  • नक्शा (समारोह, iterable, ...) - समारोह iterable के हर आइटम के लिए आवेदन करें और परिणामों की एक सूची वापस।
  • फ़िल्टर (फ़ंक्शन, पुन: प्रयोज्य) - उन तत्वों से एक सूची बनाएं पुन: सक्रिय करने के लिए कौन सा फ़ंक्शन सत्य लौटाता है।
  • कम करें (फ़ंक्शन, इटेरिएबल [, प्रारंभकर्ता]) - फ़ंक्शन को लागू करने के लिए बाएं से दाएं से दो अंकों के लिए संचयी रूप से लागू करें, ताकि एक ही मूल्य के लिए पुनरावर्तनीय को कम किया जा सके।
  • lambdas
2
  1. हां। आपके इनपुट तर्क में फ़ंक्शन कॉल को शामिल करके, आप एक बार में दो (या अधिक) फ़ंक्शंस कॉल कर सकते हैं।

उदाहरण के लिए:

def anotherfunc(inputarg1, inputarg2): 
    pass 
def myfunc(func = anotherfunc): 
    print func 

जब आप myfunc कहते हैं, आप ऐसा करते हैं:

myfunc(anotherfunc(inputarg1, inputarg2)) 

यह anotherfunc के रिटर्न मान प्रिंट होगा।

आशा है कि इससे मदद मिलती है!

19

ऊपर के उदाहरण के सभी TypeErrors में परिणाम जब तक समारोह अन्य समारोह फोन करने के लिए अपने डीईएफ़ *args का उपयोग करता है (और भी वैकल्पिक), **kwargs:

def a(x, y): 
    print x, y 

def b(other, function, *args, **kwargs): 
    function(*args, **kwargs) 
    print other 

b('world', a, 'hello', 'dude') 

आउटपुट

hello dude 
world 

ध्यान दें कि function , *args, **kwargs को उस क्रम में होना होगा और फ़ंक्शन को कॉल करने वाले फ़ंक्शन के लिए अंतिम तर्क होना चाहिए।

+0

के बारे में अधिक जानकारी के बारे में भी कहना होगा * args और ** kwargs यहां पाए जा सकते हैं https://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/ –

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