[Python] Retornar valores en funciones de orden superior (Solucionado)

Iniciado por DeMoNcRaZy, 18 Agosto 2015, 13:23 PM

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

DeMoNcRaZy

Buenas,

Intento pasar unos valores mediante unas funciones para realizar dichas operaciones, pero no logro entenderlo del todo.

Tengo esto:

Código (python) [Seleccionar]
#Funciones de orden superior
def seleccion(operacion):
   def suma(n, m):
    return n + m

   def multiplicacion(n, m):
    return n * m

if operacion == 'suma':
return suma
elif operacion == 'multi':
return mutiplicacion

fGuardada = seleccion('multi')

print fGuardada(3, 4)


Y me salta este error:

Traceback (most recent call last):
 File "de.py", line 16, in <module>
   print fGuardada(3, 4)
TypeError: 'NoneType' object is not callable


He probado diferentes maneras para que puedo correr, pero nada.

A poder ser agradecería que me explicasen que es lo que hago mal.
Gracias.

Saludos.
Esta página web no está disponible - Google Chrome

MCKSys Argentina

#1
Usando el script de esta forma, funciona:

Código (python) [Seleccionar]

if __name__ == '__main__':
    def seleccion(operacion):
        def suma(n, m):
            return n + m

        def multiplicacion(n, m):
            return n * m

        if operacion == 'suma':
            return suma
        elif operacion == 'multi':
            return multiplicacion

    fGuardada = seleccion('multi')
    print fGuardada(3, 4)


Ahora, el porqué, es algo que tampoco entiendo (aunque no tengo mucha experiencia en python).
Si usaras clases sería más sencillo (de entender), pero bueno, eso ya es otra cosa...

Saludos!


EDIT: He copiado tu código en Notepad++ y, por como lo tengo configurado, me ha corregido la identación. Con ésto, tu código funciona perfectamente.
Como prueba, reemplaza todos los TABs por espacios. para verificar que no sea un problema de identación.

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


DeMoNcRaZy

#2
Agradezco tu respuesta.

Una pregunta, que hace dicha función:

Código (python) [Seleccionar]
if __name__ == '__main__':

Estoy inicializandome y no me he topado con esto aún, si puediras explicarme algo así por encima.. cual es su función, etc.. te lo agradecería.

Gracias.

Saludos.




EDIT: Intento probar de varias formas, pero al parecer solo logro que me funcione si tengo añadida la función que me pasaste anteriormente.

Saludos.
Esta página web no está disponible - Google Chrome

MCKSys Argentina

Hola!

Esa funcion sale porque uso PyScripter como editor.
En este IDE, cuando creas un script nuevo, te aparece lo siguiente:

Código (python) [Seleccionar]

#-------------------------------------------------------------------------------
# Name:        module1
# Purpose:
#
# Author:      Administrator
#
# Created:     18/08/2015
# Copyright:   (c) Administrator 2015
# Licence:     <your licence>
#-------------------------------------------------------------------------------

def main():
    pass

if __name__ == '__main__':
    main()


Cuando ejecutas el codigo, la funciona main() se llama. Esta es la doc de Python que explica el tema.

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


tincopasan

#4
fijate que has definido la funcion como "multiplicacion" y en el return dice: "mutiplicación" por lo cual no encuentra la función a llamar! No es necesario usar la función main como lo hace MCKSys , pero muchos programadores la usan como una buena forma de sintaxis del código

DeMoNcRaZy

Cita de: tincopasan en 18 Agosto 2015, 20:06 PM
fijate que has definido la funcion como "multiplicacion" y en el return dice: "mutiplicación" por lo cual no encuentra la función a llamar! No es necesario usar la función main como lo hace MCKSys , pero muchos programadores la usan como una buena forma de sintaxis del código

Gracias por la respuesta, al parecer ha sido un fallo de ortografía pero lo he correjido y me sigue dando error, de echo lo intenté simplificar para comprobarlo mejor y nada.

Código (python) [Seleccionar]
#Funciones de orden superior
def seleccion(operacion):
    def suma(n, m):
    return n + m

    def multi(n, m):
    return n * m

if operacion == 'suma':
return suma
elif operacion == 'multi':
return multi

fGuardada = seleccion('multi')

print fGuardada(3, 4)


El error que me salta:

Traceback (most recent call last):
  File "de.py", line 16, in <module>
    print fGuardada(3, 4)
TypeError: 'NoneType' object is not callable


PD: La línea 16 es:

Código (python) [Seleccionar]
print fGuardada(3, 4)

Saludos.
Esta página web no está disponible - Google Chrome

tincopasan

el código que pusiste cambiando el error ortográfico debería andar, salvo claro está, que como te dijo MCKSys lo tengas mal identado, lo he probado con una pequeña modificación por que uso 3.x en vez de 2.x y funciona bien.(guarda con el segundo que pusiste porque estás nombrando igual a la función! revisa la identación por las dudas y cambiá operación == 'multi' por multiplicar por ejemplo)

DeMoNcRaZy

Cita de: tincopasan en 19 Agosto 2015, 01:59 AM
el código que pusiste cambiando el error ortográfico debería andar, salvo claro está, que como te dijo MCKSys lo tengas mal identado, lo he probado con una pequeña modificación por que uso 3.x en vez de 2.x y funciona bien.(guarda con el segundo que pusiste porque estás nombrando igual a la función! revisa la identación por las dudas y cambiá operación == 'multi' por multiplicar por ejemplo)

Gracias por las respuestas, ya parece funcionar correctamente.
Código (python) [Seleccionar]

#Funciones de orden superior
def seleccion(operacion):
    def suma(n, m):
        return n + m

    def multiplicacion(n, m):
        return n * m

    if operacion == 'suma':
        return suma
    elif operacion == 'multi':
        return multiplicacion

fGuardada = seleccion('suma')
print fGuardada(4, 4)


Saludos.

SOLUCIONADO
Esta página web no está disponible - Google Chrome