Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Python llamadas a funciones agrupadas en una tupla
#1
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.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder
#2
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!
Responder
#3
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.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder
#4
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.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder
#5
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!
Responder


Salto de foro:


Usuarios navegando en este tema: 2 invitado(s)