suma resueltos propias otra lista globales función funciones funcion ejercicios ejemplos dentro python function first-class-functions

resueltos - lista de funciones de python



Python: pasar una función a otra función (5)

Estoy resolviendo 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?

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 es solo un pseudo código y, por lo tanto, no es específico, pero obtengo el código para compilar, pero necesito saber cómo llamar a la función Game y si está correctamente definida, ya que las reglas se cambiarán para Rule1(v) o Rule2(v) .


Simplemente pásalo como cualquier otro parámetro:

def a(x): return "a(%s)" % (x,) def b(f,x): return f(x) print b(a,10)


Solo pásalo, así:

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


Trate la función como variable en su programa para que pueda pasarlos a otras funciones fácilmente:

def test (): print "test was invoked" def invoker(func): func() invoker(test) # prints test was invoked


Un nombre de función puede convertirse en un nombre de variable (y por lo tanto 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, compare las rules variables con una de sus funciones, dejando fuera el paréntesis y la mención del argumento. Luego, en su función game() , invoque las 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...


Un enfoque generalizado

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

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)

Alguna explicación

  • tuple( i for i in (1, 2, 3)) es un generador de tuplas, creando una tupla de los elementos en una lista, conjunto, tupla ... en nuestro caso, los valores de **kwargs
  • el * delante de la tuple() descomprimirá sus contenidos, pasándolos efectivamente como parámetros a la función pasada
  • _ en el generador es solo un marcador de posición para la key , ya que no estamos usando eso

Para python3.x :

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