Mayo 21, 2018, 11:58:18 pm

Autor Tema: Llamada a funciones agrupadas en una tupla en python.  (Leído 1202 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado YoSoyRDV

  • Me das tu IP?
  • *
  • Mensajes: 45
  • Sexo: Masculino
    • Ver Perfil
Llamada a funciones agrupadas en una tupla en python.
« en: Mayo 09, 2018, 02:38:26 pm »
Hola, gente que tengan un buen día.
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: You are not allowed to view links. Register or Login
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])
Saludos y espero con muchas expectativas las respuestas.-
Daniel
« Última modificación: Mayo 10, 2018, 05:45:50 am por YoSoyRDV »
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.-

Desconectado Solid Water

  • Yo vivo en CPH
  • ***
  • Mensajes: 1127
  • Sexo: Masculino
  • Vuelvan Hackers!
    • Ver Perfil
Re:Funciones agrupadas en una tupla en python.
« Respuesta #1 en: Mayo 09, 2018, 03:32:00 pm »
Como poder se puede:

Código: You are not allowed to view links. Register or Login
def suma():
        return(5+2)

def Mostrar(i):
        print (i)

Mostrar(suma())

En cuanto a tu código, sería así:

Código: (python) You are not allowed to view links. Register or Login
def suma():
        print(5+2)
def resta():
        print(5-2)
def mult():
        print(5*2)
def div():
        print(5/2)

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

a = oper
b = 1 # seria la operación a realizar(en este caso "resta")
a(b)

Fíjate bien que para guardar la función en una variable usando el operador = no debes poner los paréntesis, ya que estos suelen esperar parámetros y además así se utiliza para guardar el dato de un return de la función.

Saludos,
« Última modificación: Mayo 09, 2018, 03:53:49 pm por Solid Water »

Not for the money, not for the fame. Not for the power, just no more games.

Desconectado YoSoyRDV

  • Me das tu IP?
  • *
  • Mensajes: 45
  • Sexo: Masculino
    • Ver Perfil
Re:Funciones agrupadas en una tupla en python.
« Respuesta #2 en: Mayo 09, 2018, 08:01:11 pm »
Gracias como siempre por responder y enseñarme tanto, como es de esperar funciona a la perfección, pero me gustaría saber si tu código es aplicable a este, no lo puedo adaptar.

Código: You are not allowed to view links. Register or Login
def suma(n1, n2):
     return n1+n2
def resta(n1, n2):
     return n1-n2
def mult(n1, n2):
     return n1*n2
def div(n1, n2):
     return n1/n2

calc = (suma, resta, mult, div)
n1=8
n2=3
b = 0
bb = calc[b](n1, n2)
print(bb)

Sin la función oper funciona pero quisiera incluirla.
Código: You are not allowed to view links. Register or Login
def oper(i):
        calc = (suma, resta, mult, div)
        return calc[i]()

Saludos y tu me dirás.

Desconectado Solid Water

  • Yo vivo en CPH
  • ***
  • Mensajes: 1127
  • Sexo: Masculino
  • Vuelvan Hackers!
    • Ver Perfil
Re:Funciones agrupadas en una tupla en python.
« Respuesta #3 en: Mayo 09, 2018, 08:11:32 pm »
Código: You are not allowed to view links. Register or Login
def oper(i):
        calc = (suma, resta, mult, div)
        return calc[i]()

a
Código: You are not allowed to view links. Register or Login
return calc[i]()

deberías pasarle como parámetro n1 y n2..
Sino muestrame el código entero donde no funciona.

Más tarde lo miro que ahora no estoy en linux..

Saludos,
« Última modificación: Mayo 09, 2018, 08:16:40 pm por Solid Water »

Desconectado YoSoyRDV

  • Me das tu IP?
  • *
  • Mensajes: 45
  • Sexo: Masculino
    • Ver Perfil
Re:Funciones agrupadas en una tupla en python.
« Respuesta #4 en: Mayo 09, 2018, 08:37:08 pm »
Código: You are not allowed to view links. Register or Login
def suma(op1, op2):
return op1 + op2
def resta(op1, op2):
return op1 - op2
def mult(op1, op2):
     return op1 * op2
def div(op1, op2):
     return op1 / op2

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


a = oper
b = 0
op1, op2 = 8,5
res = a[b](op1, op2)
print(res)

Citar
Traceback (most recent call last):
  File "main.py", line 18, in <module>
    res = a(op1, op2)
TypeError: 'function' object is not subscriptable

Desconectado Solid Water

  • Yo vivo en CPH
  • ***
  • Mensajes: 1127
  • Sexo: Masculino
  • Vuelvan Hackers!
    • Ver Perfil
Re:Funciones agrupadas en una tupla en python.
« Respuesta #5 en: Mayo 09, 2018, 08:42:43 pm »
No tengo python acá, pero probá así:

Código: You are not allowed to view links. Register or Login
def suma(op1, op2):
return op1 + op2
def resta(op1, op2):
return op1 - op2
def mult(op1, op2):
     return op1 * op2
def div(op1, op2):
     return op1 / op2

def oper(i, op1, op2):
calc = (suma, resta, mult, div)
return calc[i](op1, op2)


a = oper
b = 0
op1, op2 = 8,5
res = a(b, op1, op2)
print(res)

PS: Ahí lo probé con un python online y funciona:

You are not allowed to view links. Register or Login

Saludos,
« Última modificación: Mayo 09, 2018, 08:48:12 pm por Solid Water »

Desconectado YoSoyRDV

  • Me das tu IP?
  • *
  • Mensajes: 45
  • Sexo: Masculino
    • Ver Perfil
Re:Funciones agrupadas en una tupla en python.
« Respuesta #6 en: Mayo 09, 2018, 08:51:20 pm »
Hola, amigo te molesto nuevamente porque no me gusta aprender como un robot y esto se lo parece, si tenes tiempo para responderme te lo agradecería. -
La primer pregunta es ¿qué contiene a luego de regresar de la función oper? lo único que logro imprimir es una
dirección de memoria y la coteje con la función suma (por ejemplo) y no son las mismas, tal vez sabiendo esto puedo entender el funcionamiento de las llamadas a funciones agrupadas en una tupla.
Pongo el código que me falta tan solo los try/except.

Código: You are not allowed to view links. Register or Login
def suma(op1, op2):
return op1 + op2
def resta(op1, op2):
return op1 - op2
def mult(op1, op2):
     return op1 * op2
def div(op1, op2):
     return op1 / op2

def oper(i, op1, op2):
calc = (suma, resta, mult, div)
return calc[i](op1, op2)

a = oper
oper = ('+', '-', '*', '/')

op1 = float(input('\n Ingrese primer  operando...: '))
op2 = float(input('\n Ingrese segundo operando...: '))
b = int(input('\n 1 - Sumar\n 2 - Restar\n 3 - Multiplicar\n'
  ' 4 - Dividir \n\n Ingrese opción...:'))
res = a(b-1, op1, op2)
print(f'\n {op1} {oper[b-1]} {op2} = {res}')

Saludos.
« Última modificación: Mayo 10, 2018, 01:09:35 pm por YoSoyRDV »

Desconectado Solid Water

  • Yo vivo en CPH
  • ***
  • Mensajes: 1127
  • Sexo: Masculino
  • Vuelvan Hackers!
    • Ver Perfil
Re:Llamada a funciones agrupadas en una tupla en python.
« Respuesta #7 en: Mayo 10, 2018, 02:48:49 pm »
Qué contiene 'a' luego de regresar de la función oper? en realidad no está regresando de la función está guardando en 'a' la dirección de memoria que hace referencia a la función oper.
Entonces cuando llamas a 'a' estás llamando a la función oper, sería lo mismo que la llames directamente, sin meter a 'a' en el asunto.
a está apuntando a esa dirección de memoria.

Mira este código donde cambié la función oper, por otro nombre, ya que tu habías declarado una variable con el mismo nombre, y se pisaban:

Código: You are not allowed to view links. Register or Login
def suma(op1, op2):
        return op1 + op2
def resta(op1, op2):
        return op1 - op2
def mult(op1, op2):
     return op1 * op2
def div(op1, op2):
     return op1 / op2

def oper2(i, op1, op2):
        calc = (suma, resta, mult, div)
        return calc[i](op1, op2)

a = oper2
oper = ('+', '-', '*', '/')

op1 = float(input('\n Ingrese primer  operando...: '))
op2 = float(input('\n Ingrese segundo operando...: '))
b = int(input('\n 1 - Sumar\n 2 - Restar\n 3 - Multiplicar\n'
                          ' 4 - Dividir \n\n Ingrese opción...:'))
res = a(b-1, op1, op2)
print(f'\n {op1} {oper[b-1]} {op2} = {res}')

print (a)
print (oper2)

Como puedes ver al final hago un print de 'a' y de la función oper2 y ambas muestran la misma dirección de memoria.

<function oper2 at 0x7fdd433af268>
<function oper2 at 0x7fdd433af268>

Saludos, y si, sería bueno que cuando pides ayuda luego pienses y saques conclusiones que no te quedes en la cómoda de que ya tienes el código..

PD: Si quieres aprender un poco más de direcciones de memoria y eso, podrías leer sobre punteros en C.

« Última modificación: Mayo 10, 2018, 03:33:45 pm por Solid Water »

Desconectado YoSoyRDV

  • Me das tu IP?
  • *
  • Mensajes: 45
  • Sexo: Masculino
    • Ver Perfil
Re:Llamada a funciones agrupadas en una tupla en python.
« Respuesta #8 en: Mayo 10, 2018, 03:41:27 pm »
Ok, por lo menos la mitad la entendí con tu explicación, la otra mitad voy a tratar de arreglármelas por mi cuenta, en cuanto a los punteros los tengo muy entendido ya que pase un largo tiempo estudiando C y tengo mucha documentación, ¿es posible simular los punteros en python.?

Acabo de encontrar esto y desconozco si tiene que ver con el tema.

Código: You are not allowed to view links. Register or Login
#imprimir el valor y no la direccion de memoria en python

class mutable_obj:
    def __init__(self, x):
        self.x = x

a = mutable_obj(10)
b = a
a.x == b.x # True
a.x = 30
a.x == b.x # True
b.x = 86
a.x == b.x # True

Saludos.

Desconectado Solid Water

  • Yo vivo en CPH
  • ***
  • Mensajes: 1127
  • Sexo: Masculino
  • Vuelvan Hackers!
    • Ver Perfil
Re:Llamada a funciones agrupadas en una tupla en python.
« Respuesta #9 en: Mayo 10, 2018, 03:59:26 pm »
Ahí te demuestra que vos igualas B a A, pero no se copia el objeto entero si no solo la dirección de memoria, por eso después aunque solo cambiaste en A el valor del dato miembro x, en B sigue siendo igual al de A.
Por que no es otro objeto, es otro puntero a la misma dirección de memoria.

Al final de este post, te lo había explicado en C++, Pero no sé si llegaste a leerlo:

You are not allowed to view links. Register or Login

Saludos,

Desconectado YoSoyRDV

  • Me das tu IP?
  • *
  • Mensajes: 45
  • Sexo: Masculino
    • Ver Perfil
Re:Llamada a funciones agrupadas en una tupla en python.
« Respuesta #10 en: Mayo 11, 2018, 03:35:02 pm »
Hola gente,  Solid Water 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. -

Funciones de orden superior.

Código: You are not allowed to view links. Register or Login
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()

Un abrazo.


xx
Llamada Nativa al SO.

Iniciado por mDrinky

0 Respuestas
1228 Vistas
Último mensaje Abril 01, 2013, 05:55:31 am
por mDrinky
xx
rastear una llamada

Iniciado por xax

6 Respuestas
5270 Vistas
Último mensaje Abril 10, 2007, 06:48:35 pm
por xax
xx
llamada oculta

Iniciado por impulsiu

1 Respuestas
1554 Vistas
Último mensaje ſeptiembre 06, 2009, 07:36:17 pm
por TokioDrift
question
Devolver llamada

Iniciado por .:.IlcOn14.:.

4 Respuestas
1833 Vistas
Último mensaje Noviembre 27, 2009, 06:44:23 pm
por Mafiaboy
xx
Llamada Anónima

Iniciado por JuCemax

4 Respuestas
4015 Vistas
Último mensaje Julio 15, 2006, 12:45:30 pm
por putus
xx
Llamada a pagina web en c

Iniciado por destroyermoon

1 Respuestas
1129 Vistas
Último mensaje Junio 08, 2009, 02:07:55 pm
por -Gosw-
exclamation
Llamada a todos los diseñadores de CPH

Iniciado por Maulet

15 Respuestas
5922 Vistas
Último mensaje Mayo 08, 2009, 09:19:50 pm
por seth
resuelto
librería llamada ws2_32

Iniciado por eljocker

3 Respuestas
1368 Vistas
Último mensaje Marzo 17, 2011, 08:40:03 pm
por eljocker
xx
Detectar llamada a funcion y capturar mensajes

Iniciado por wally_88

2 Respuestas
1303 Vistas
Último mensaje Diciembre 28, 2009, 06:32:42 pm
por wally_88
exclamation
[Código-Python]Ejecuta otros lenguajes en Python V2 - JaAViEr

Iniciado por JaAViEr

0 Respuestas
1802 Vistas
Último mensaje ſeptiembre 07, 2011, 07:08:36 pm
por JaAViEr