Python - ส่งผ่านฟังก์ชันไปยังฟังก์ชันอื่น


95

ฉันกำลังไขปริศนาโดยใช้ python และขึ้นอยู่กับว่าฉันกำลังไขปริศนาตัวไหนอยู่ฉันจะต้องใช้ชุดกฎพิเศษ ฉันจะส่งฟังก์ชันไปยังฟังก์ชันอื่นใน Python ได้อย่างไร

ตัวอย่าง

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
ฟังก์ชันเป็นวัตถุชั้นหนึ่งใน python คุณสามารถส่งผ่านไปรอบ ๆ รวมไว้ในคำสั่งรายการ ฯลฯ แต่อย่าใส่วงเล็บหลังชื่อฟังก์ชัน ตัวอย่างสำหรับฟังก์ชันชื่อmyfunction: myfunctionหมายถึงฟังก์ชันเองmyfunction()หมายถึงเรียกใช้ฟังก์ชันและรับค่าส่งกลับแทน
nosklo

1
และจะเกิดอะไรขึ้นถ้าฟังก์ชันเป็นวิธีการบนวัตถุและใช้คุณสมบัติของวัตถุนั้นเพื่อทำงาน
CpILL

2
จะเกิดอะไรขึ้นถ้าฟังก์ชันที่ฉันส่งผ่านมีอาร์กิวเมนต์อินพุตที่แตกต่างกัน? ฉันควรใช้อาร์กิวเมนต์คำหลักหรือไม่?
H. Vabri

จะเกิดอะไรขึ้นถ้าทั้งสองฟังก์ชั่นอยู่ในไฟล์ python แยกกัน?
Adrian Jimenez

25

ถือว่าฟังก์ชันเป็นตัวแปรในโปรแกรมของคุณเพื่อให้คุณสามารถส่งผ่านไปยังฟังก์ชันอื่น ๆ ได้อย่างง่ายดาย:

def test ():
   print "test was invoked"

def invoker(func):
   func()

invoker(test)  # prints test was invoked

ใช่. ในตัวอย่างข้างต้นinvokerฟังก์ชันจะต้องจัดหาอาร์กิวเมนต์เหล่านั้นเมื่อเรียกใช้ฟังก์ชัน
codeape

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)

ทั้งนี้ขึ้นอยู่กับสิ่งที่คุณทำมันจะให้ความรู้สึกที่จะกำหนดหรืออาจจะใช้decoratorfunctools.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.