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 latuple()
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 lakey
, ya que no estamos usando eso
Para python3.x
:
-
print(a+b)
lugar deprint a+b
-
kwargs.items()
lugar dekwargs.iteritems()