Foros Python
Python llamadas a funciones agrupadas en una tupla - Versión para impresión

+- Foros Python (https://foro.recursospython.com)
+-- Foro: Desarrollo (https://foro.recursospython.com/forumdisplay.php?fid=1)
+--- Foro: General (https://foro.recursospython.com/forumdisplay.php?fid=9)
+--- Tema: Python llamadas a funciones agrupadas en una tupla (/showthread.php?tid=158)



Python llamadas a funciones agrupadas en una tupla - Daniel.py - 09-05-2018

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.


RE: Funciones agrupadas en una tupla/lista/diccionario en python. - Francisco - 09-05-2018

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.

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


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

  1. # Añado paréntesis.
  2. a[b ]()


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

Saludos!


RE: Funciones agrupadas en una tupla/lista/diccionario en python. - Daniel.py - 09-05-2018

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.


RE: Python llamadas a funciones agrupadas en una tupla - Daniel.py - 11-05-2018

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.


RE: Python llamadas a funciones agrupadas en una tupla - Francisco - 11-05-2018

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.

  1. import operator
  2.  
  3. func = {
  4. "+": operator.add,
  5. "-": operator.sub,
  6. "*": operator.mul,
  7. "/": operator.truediv
  8. }
  9.  
  10. a = 5
  11. b = 3
  12. f = func["*"]
  13. print(f(a, b))


Saludos!