2009-08-28 15 views
49

मैं अजगर का उपयोग करके एक पहेली को हल कर रहा हूं और जिस पहेली को मैं हल कर रहा हूं उसके आधार पर मुझे नियमों के एक विशेष सेट का उपयोग करना होगा। मैं पाइथन में किसी फ़ंक्शन को फ़ंक्शन कैसे पास कर सकता हूं?पायथन - किसी अन्य फ़ंक्शन में फ़ंक्शन पास करना

उदाहरण

def Game(listA, listB, rules): 
    if rules == True: 
     do... 
    else: 
     do... 

def Rule1(v): 
    if "variable_name1" in v: 
     return False 
    elif "variable_name2" in v: 
     return False 
    else: 
     return True 

def Rule2(v): 
    if "variable_name3" and "variable_name4" in v: 
     return False 
    elif "variable_name4" and variable_name1 in v: 
     return False 
    else: 
     return True 

यह सिर्फ एक छद्म कोड विशिष्ट नहीं है और इसलिए लेकिन मैं संकलित करने के लिए कोड प्राप्त लेकिन मुझे पता है कि कैसे समारोह Game कॉल करने की आवश्यकता है और क्या यह सही ढंग से परिभाषित कर रहा है के बाद से नियम बदल दिया जाएगा Rule1(v) या Rule2(v) के लिए।

उत्तर

96

बस इसे किसी अन्य पैरामीटर की तरह पारित में: अपने कार्यक्रम में चर के रूप में

def a(x): 
    return "a(%s)" % (x,) 

def b(f,x): 
    return f(x) 

print b(a,10) 
+30

कार्यों के बजाय kwargs.items() अजगर में प्रथम श्रेणी वस्तुओं रहे हैं। आप उन्हें चारों ओर पास कर सकते हैं, उन्हें डिक्ट्स, सूचियों आदि में शामिल कर सकते हैं। बस फ़ंक्शन नाम के बाद कोष्ठक शामिल न करें। उदाहरण, 'myfunction' नामक फ़ंक्शन के लिए:' myfunction' का अर्थ फ़ंक्शन स्वयं है, 'myfunction() 'का अर्थ है फ़ंक्शन को कॉल करना और इसके बदले मूल्य प्राप्त करना। – nosklo

+3

मुझे सरल उदाहरण पसंद हैं, वे सिर्फ समझ में आता है !!! – mongotop

+0

और यदि कार्य किसी ऑब्जेक्ट पर एक विधि है और उस कार्य की संपत्ति का उपयोग करने के लिए उस वस्तु का उपयोग करता है? – CpILL

13

उपचार समारोह, ताकि आप केवल आसानी से अन्य कार्यों के लिए उन्हें पारित कर सकते हैं:

def test(): 
    print "test was invoked" 

def invoker(func): 
    func() 

invoker(test) # prints test was invoked 
+0

यह काम करता है अगर परीक्षण() तर्क में लेता है? @codeape ?? – Yasasvee

+0

हां। उपर्युक्त उदाहरण में, 'invoker'' फ़ंक्शन को फ़ंक्शन को कॉल करते समय उन तर्कों को आपूर्ति करने की आवश्यकता होगी। – codeape

7

बस इसे पारित में, इस तरह:

Game(list_a, list_b, Rule1) 

और फिर आपका गेम फ़ंक्शन कुछ ऐसा दिख सकता है (अभी भी छद्म कोड):

def Game(listA, listB, rules=None): 
    if rules: 
     # do something useful 
     # ... 
     result = rules(variable) # this is how you can call your rule 
    else: 
     # do something useful without rules 
7

एक फ़ंक्शन नाम ब्रांड्स को छोड़कर एक चर नाम (और इस प्रकार एक तर्क के रूप में पारित किया जा सकता है) बन सकता है। एक परिवर्तनीय नाम कोष्ठक जोड़कर फ़ंक्शन नाम बन सकता है।

अपने उदाहरण में, वैरिएबल rules को अपने कार्यों में से एक में समेकित करें, कोष्ठक छोड़कर और तर्क का उल्लेख छोड़ दें। फिर अपने game() फ़ंक्शन में, rules(v) को ब्रांड्स और v पैरामीटर के साथ आमंत्रित करें।

if puzzle == type1: 
    rules = Rule1 
else: 
    rules = Rule2 

def Game(listA, listB, rules): 
    if rules(v) == True: 
     do... 
    else: 
     do... 
6

एक सामान्यीकृत दृष्टिकोण

कार्य करने के लिए दोनों एक समारोह है, और पैरामीटर प्रदान करने (जैसे विभिन्न कार्यों के लिए एक ही यात्रा दिनचर्या का प्रयोग करके) निम्नलिखित (python2.x) उदाहरण पर विचार के लिए:

def test(a, b): 
    '''The function to pass''' 
    print a+b 

def looper(func, **kwargs): 
    '''A basic iteration function''' 
    for i in range(5): 
     # Our passed function with passed parameters 
     func(*tuple(value for _, value in kwargs.iteritems())) 

if __name__ == '__main__': 
    # This will print `3` five times 
    looper(test, a=1, b=2) 

कुछ स्पष्टीकरण

  • tuple(i for i in (1, 2, 3)) एक ट्यूपल जेनरेटर है, जो सूची में आइटम से सेट अप, सेट, टुपल ...हमारे मामले में, **kwargs
  • tuple() के सामने * से मानों उसकी सामग्री को खोल देगा, प्रभावी रूप से उन्हें पारित कर समारोह
  • _ जनरेटर में करने के लिए पैरामीटर के रूप में पारित करने key के लिए सिर्फ एक जगह धारक है, क्योंकि हम उपयोग नहीं कर रहे कि

लिए python3.x:

  • print(a+b)print a+b के बजाय
  • kwargs.iteritems()
संबंधित मुद्दे