पायथन - एक फ़ंक्शन को दूसरे फ़ंक्शन में पास करना


94

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

उदाहरण

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)

जवाबों:


151

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

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

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

print b(a,10)

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

1
और क्या होगा यदि फ़ंक्शन किसी ऑब्जेक्ट पर एक विधि है और अपना काम करने के लिए उस ऑब्जेक्ट की संपत्ति का उपयोग करता है?
CpILL

2
क्या होगा यदि मेरे द्वारा किए जाने वाले कार्यों में इनपुट तर्कों की एक अलग संख्या है? क्या मुझे तब कीवर्ड तर्क का उपयोग करना चाहिए?
एच। वबरी

क्या होगा यदि दोनों कार्य अलग-अलग अजगर फ़ाइलों में हों?
एड्रियन जिमेनेज

25

फ़ंक्शन को अपने प्रोग्राम में वेरिएबल के रूप में मानें ताकि आप उन्हें आसानी से अन्य कार्यों के लिए पास कर सकें:

def test ():
   print "test was invoked"

def invoker(func):
   func()

invoker(test)  # prints test was invoked

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

15

किसी फ़ंक्शन और फ़ंक्शन के किसी भी तर्क को पारित करने के लिए:

from typing import Callable    

def looper(fn: Callable, n:int, *args, **kwargs):
    """
    Call a function `n` times

    Parameters
    ----------
    fn: Callable
        Function to be called.
    n: int
        Number of times to call `func`.
    *args
        Positional arguments to be passed to `func`.
    **kwargs
        Keyword arguments to be passed to `func`.

    Example
    -------
    >>> def foo(a:Union[float, int], b:Union[float, int]):
    ...    '''The function to pass'''
    ...    print(a+b)
    >>> looper(foo, 3, 2, b=4)
    6
    6
    6       
    """
    for i in range(n):
        fn(*args, **kwargs)

आप जो कर रहे हैं, उसके आधार पर, यह परिभाषित करने के लिए समझ में आ सकता है decorator, या शायद उपयोग करें functools.partial


9

बस इसे इस तरह से पास करें:

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

9

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

अपने उदाहरण में, 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...
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.