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.

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!
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
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.

Código:
import operator

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

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

Saludos!
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)