Python - Meneruskan fungsi ke fungsi lain

95

Saya memecahkan teka-teki menggunakan python dan tergantung pada teka-teki mana yang saya pecahkan, saya harus menggunakan seperangkat aturan khusus. Bagaimana saya bisa melewatkan fungsi ke fungsi lain dengan Python?

Contoh

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

Ini hanyalah kode semu dan oleh karena itu tidak spesifik tetapi saya mendapatkan kode untuk dikompilasi tetapi saya perlu tahu bagaimana memanggil fungsi Gamedan apakah itu didefinisikan dengan benar karena aturan akan dialihkan ke salah satu Rule1(v)atau Rule2(v).

jchanger
sumber

Jawaban:

151

Berikan saja seperti parameter lainnya:

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

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

print b(a,10)
John Millikin
sumber
44
fungsi adalah objek kelas satu di python. Anda dapat menyebarkannya, memasukkannya ke dalam dicts, daftar, dll. Hanya saja, jangan memasukkan tanda kurung setelah nama fungsi. Contoh, untuk fungsi bernama myfunction: myfunctionberarti fungsi itu sendiri, myfunction()berarti memanggil fungsi dan mendapatkan nilai kembaliannya.
nosklo
1
Dan bagaimana jika fungsinya adalah metode pada sebuah objek dan menggunakan properti dari objek tersebut untuk melakukan tugasnya?
CpILL
2
Bagaimana jika fungsi yang saya lewati memiliki jumlah argumen input yang bervariasi? Haruskah saya menggunakan argumen kata kunci?
H. Vabri
Bagaimana jika kedua fungsi tersebut berada dalam file python yang terpisah?
Adrian Jimenez
25

Perlakukan fungsi sebagai variabel dalam program Anda sehingga Anda dapat meneruskannya ke fungsi lain dengan mudah:

def test ():
   print "test was invoked"

def invoker(func):
   func()

invoker(test)  # prints test was invoked
Piotr Czapla
sumber
Iya. Dalam contoh di atas, invokerfungsi kemudian perlu menyediakan argumen tersebut saat memanggil fungsi.
codeape
15

Untuk meneruskan fungsi, dan argumen apa pun ke fungsi:

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)

Bergantung pada apa yang Anda lakukan, masuk akal untuk mendefinisikan decorator, atau mungkin menggunakan functools.partial.

ryanjdillon.dll
sumber
9

Berikan saja, seperti ini:

Game(list_a, list_b, Rule1)

dan kemudian fungsi Game Anda akan terlihat seperti ini (masih pseudocode):

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
Ian Clelland
sumber
9

Nama fungsi bisa menjadi nama variabel (dan dengan demikian diteruskan sebagai argumen) dengan menghilangkan tanda kurung. Nama variabel bisa menjadi nama fungsi dengan menambahkan tanda kurung.

Dalam contoh Anda, samakan variabel rulesdengan salah satu fungsi Anda, tanpa menggunakan tanda kurung dan penyebutan argumen. Kemudian di game()fungsi Anda , panggil rules( v )dengan tanda kurung dan vparameter.

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

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