2009-08-28 45 views
49

Resuelvo un rompecabezas usando Python y dependiendo de qué rompecabezas estoy resolviendo, tendré que usar un conjunto especial de reglas. ¿Cómo puedo pasar una función a otra función en Python?Python - Pasar una función a otra función

Ejemplo

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 

Esto no es sólo un pseudo código y por lo tanto específico, pero me sale el código para compilar pero necesito saber cómo llamar a la función Game y si está definido correctamente ya que se cambiaron las reglas para Rule1(v) o Rule2(v).

Respuesta

96

Sólo tiene que pasar en como cualquier otro parámetro:

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

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

print b(a,10) 
+30

funciones son objetos de primera clase en Python. puede pasarlos, incluirlos en dictados, listas, etc. Simplemente no incluya el paréntesis después del nombre de la función. Ejemplo, para una función llamada 'myfunction':' myfunction' significa la función en sí, 'myfunction()' significa llamar a la función y obtener su valor de retorno en su lugar. – nosklo

+3

¡Me gustan los ejemplos simples, simplemente tienen sentido! – mongotop

+0

¿Y si la función es un método en un objeto y utiliza una propiedad de ese objeto para hacer su trabajo? – CpILL

13

función Tratar como variable en su programa por lo que sólo les puede pasar a otras funciones fácilmente:

def test(): 
    print "test was invoked" 

def invoker(func): 
    func() 

invoker(test) # prints test was invoked 
+0

funciona si test() toma en argumentos? @codeape ?? – Yasasvee

+0

Sí. En el ejemplo anterior, la función '' invocador' necesitaría entonces proporcionar esos argumentos al llamar a la función. – codeape

7

sólo tiene que pasar en, de esta manera:

Game(list_a, list_b, Rule1) 

y luego su función de juego podría verse algo como esto (aún pseudocódigo):

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 
7

El nombre de una función puede convertirse en un nombre de variable (y por lo tanto se pasará como un argumento) soltando los paréntesis. Un nombre de variable puede convertirse en un nombre de función al agregar los paréntesis.

En su ejemplo, iguale la variable rules a una de sus funciones, dejando fuera el paréntesis y la mención del argumento. Luego, en su función game(), invoque rules(v) con los paréntesis y el parámetro v.

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

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

Un enfoque generalizado

Para pasar tanto una función, y los parámetros a la función (por ejemplo, usando la misma rutina iteración para diferentes funciones) consideran el (python2.x) siguiente ejemplo:

def test(a, b): 
    '''The function to pass''' 
    print a+b 

def looper(func, **kwargs): 
    '''A basic iteration function''' 
    for i in range(5): 
     # Our passed function with passed parameters 
     func(*tuple(value for _, value in kwargs.iteritems())) 

if __name__ == '__main__': 
    # This will print `3` five times 
    looper(test, a=1, b=2) 

algunas explicaciones

  • tuple(i for i in (1, 2, 3)) es un generador de tuplas, creando una tupla de los elementos de una lista, conjunto, tupla ...en nuestro caso, los valores de **kwargs
  • la * frente al tuple() extraerá el contenido, pasando efectivamente como parámetros a la función pasada
  • _ en el generador es sólo un marcador de posición para el key, ya que no están usando ese

Para python3.x:

  • print(a+b) en lugar de print a+b
  • kwargs.items() en lugar de kwargs.iteritems()
Cuestiones relacionadas