Foros Python

Versión completa: Python llamadas a funciones agrupadas en una tupla
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola, gente, ¿cómo están? 
Me acorde de repente algo que se puede hacer en lenguaje C y es pasar a una función como parámetro otra función, esa es la idea pero no me resulta en python, ¿se puede hacer que esto funcione?


Código:
def suma():
     print(5+2)
def resta():
    print(5-2)
def mult():
    print(5*2)
def div():
    print(5/2)

def oper():
calc = (suma(), resta(), mult(), div())
return calc

a = oper()
b = 1 # seria la operación a realizar(en este caso "resta")
print(a[b])
Lo dejo en manos de Uds. para que me digan si es factible.
Saludos.
Hola Daniel, ¿cómo estás?

Sí se puede. Puedes tratar a una función como a cualquier otro objeto. Aunque tienes que distinguir entre el nombre de una función y la llamada. Cuando el nombre aparece sin más en el código, Python entiende que lo quieres tratar como a cualquier otro objeto, mientras que, cuando está sucedido por paréntesis, entonces se trata de una llamada. Por ello tu código debería ser el siguiente.

Código:
def oper():
    # Quito los paréntesis; de lo contrario, calc sería igual a (None, None, None, None).
    calc = (suma, resta, mult, div)
    return calc

Ahora tu última línea estaría imprimiendo la función resta(). Si quieres ejecutarla, entonces debería ser:

Código:
# Añado paréntesis.
a[b ]()

print() es innecesario ya que el retorno de las cuatro funciones es None.

Saludos!
Estoy muy bien Francisco.
Como era de esperar funciona a la perfección, dejo otra manera que también funciona, no creo que sea relevante 
especificar donde lo encontré. - 


Código:
def suma():
    return 5+2
def resta():
    return 5-2
def mult():
    return 5*2
def div():
    return 5/2

calc = (suma(), resta(), mult(), div())
b = 3
print(calc[b])

Un abrazo.
Hola gente, Francisco te pido mil disculpas por el tiempo que te hice perder (me pasa por arrebatado) ahora lo encontré y esto es exactamente lo que quería. -


Código:
def calculos(lang, a, b):
   def calculos_suma():
       print(a+b)
   def calculos_resta():
       print(a-b)
   def calculos_multiplicacion():
       print(a*b)
   def calculos_division():
       print(a/b)

   lang_func = {"+": calculos_suma,
                "-": calculos_resta,
                "*": calculos_multiplicacion,
                "/": calculos_division}

   return lang_func[lang]


a=5
b=3
f = calculos("*", a, b)
f()
Saludos.
Hola Daniel, tu código está excelente. Aquí te dejo otra forma de hacerlo utilizando el módulo estándar operator, que implementa los operadores como funciones.

Código:
import operator

func = {
    "+": operator.add,
    "-": operator.sub,
    "*": operator.mul,
    "/": operator.truediv
}

a = 5
b = 3
f = func["*"]
print(f(a, b))

Saludos!