পাইথন - একটি ফাংশন অন্য ফাংশনে পাস করা


95

আমি পাইথন ব্যবহার করে একটি ধাঁধা সমাধান করছি এবং আমি কোন ধাঁধাটি সমাধান করছি তার উপর নির্ভর করে আমাকে একটি বিশেষ নিয়ম ব্যবহার করতে হবে। পাইথনের অন্য ফাংশনে আমি কীভাবে কোনও ফাংশনটি পাস করতে পারি?

উদাহরণ

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

4
এবং যদি ফাংশনটি কোনও অবজেক্টের কোনও পদ্ধতি হয় এবং তার কাজটি করতে সেই বস্তুর কোনও সম্পত্তি ব্যবহার করে তবে কী হবে?
সিপিআইএল

4
আমি যে ফাংশনগুলি দিয়েছি তাতে যদি বিভিন্ন ইনপুট আর্গুমেন্ট থাকে? আমি কি কিওয়ার্ড আর্গুমেন্ট ব্যবহার করা উচিত?
এইচ। ভব্রি

যদি দুটি ফাংশন পৃথক পাইথন ফাইলগুলিতে থাকে তবে কী হবে?
অ্যাড্রিয়ান জিমনেজ

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...
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.