Python - Bir işlevi başka bir işleve geçirmek


95

Python kullanarak bir bulmacayı çözüyorum ve hangi bulmacayı çözdüğüme bağlı olarak özel bir kurallar dizisi kullanmam gerekecek. Python'da bir işlevi başka bir işleve nasıl geçirebilirim?

Misal

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

Bu sadece sözde bir koddur ve bu nedenle spesifik değildir, ancak kodu derleyeceğim ancak işlevi nasıl çağıracağımı Gameve kurallardan biri Rule1(v)veya için değiştirileceği için doğru tanımlanıp tanımlanmadığını bilmem gerekiyor Rule2(v).

Yanıtlar:


151

Diğer parametreler gibi iletin:

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

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

print b(a,10)

44
işlevler python'da birinci sınıf nesnelerdir. onları dolaştırabilir, diktlere, listelere vb. dahil edebilirsiniz. Fonksiyon adından sonra parantez eklemeyin. Örnek, adlı bir işlev için myfunction: myfunctionişlevin kendisi anlamına gelir, işlevi myfunction()çağırmak ve onun yerine dönüş değerini almak anlamına gelir.
nosklo

1
Peki ya işlev bir nesne üzerindeki bir yöntemse ve işini yapmak için bu nesnenin bir özelliğini kullanıyorsa?
CpILL

2
Ya ilettiğim işlevlerin değişen sayıda girdi bağımsız değişkeni varsa? Daha sonra anahtar kelime argümanları kullanmalı mıyım?
H.Vabri

Ya iki işlev ayrı python dosyalarındaysa?
Adrian Jimenez

25

Programınızda işlevi değişken olarak ele alın, böylece bunları diğer işlevlere kolayca aktarabilirsiniz:

def test ():
   print "test was invoked"

def invoker(func):
   func()

invoker(test)  # prints test was invoked

Evet. Yukarıdaki örnekte, invokerişlevin işlevi çağırırken bu bağımsız değişkenleri sağlaması gerekir.
kod kaseti

15

Hem bir işlevi hem de herhangi bir argümanı işleve geçirmek için:

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)

Ne yaptığınıza bağlı olarak, bir tanımlamak decoratorveya belki kullanmak mantıklı olabilir functools.partial.


9

Şöyle iletin:

Game(list_a, list_b, Rule1)

ve sonra Oyun işleviniz şöyle görünebilir (hala sözde kod):

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

Bir işlev adı, parantezler bırakılarak bir değişken adı haline gelebilir (ve dolayısıyla bir bağımsız değişken olarak aktarılabilir). Bir değişken adı, parantezler eklenerek bir işlev adı haline gelebilir.

Örneğinizde, değişkeni rulesparantezleri ve bağımsız değişkenin sözünü bırakarak işlevlerinizden birine eşitleyin. Ardından game()işlevinizde rules( v )parantez ve vparametre ile çağırın .

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

def Game(listA, listB, rules):
    if rules( v ) == True:
        do...
    else:
        do...
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.