[pyar] [Pyar] Comportamiento de funcion Return devuelve NONE

fisa fisadev en gmail.com
Mar Mayo 24 14:44:25 ART 2016


Buenas! Creo que estás confundiendo un concepto un poco base, me tomo un
rato para explicarlo para ver si eso te ayuda:

Una función (en casi todo lenguaje) es un cachito de código que puede
recibir datos, y puede *devolver* datos. La parte de devolver es
importante: al terminar, la función puede decir "tomá, este es el resultado
de lo que hice".
Eso es un return.
Por ejemplo:

    def sumar(a, b):
        return a + b

Esa función recibe dos cosas (a y b), y *devuelve* el resultado de
sumarlas. El resultado no se imprime, no se muestra, sino que se
*devuelve*, se retorna.
De esa forma, yo puedo después hacer cosas como esta:

    resultado = sumar(10, 20)
    print 'el resultado de sumar 10 y 20 es:'
    print resultado

(Que de paso, es lo mismo que directamente esto:
     print 'el resultado de sumar 10 y 20 es:'
     print sumar(10, 20)
)

Fijate que en resultado, guardé lo que la función sumar *devolvió*.
Si en lugar de eso mi función no tuviese el return, sino prints, podría
verse así:

    def sumar(a, b):
        print a + b

Esto te puede servir, pero por lo general no está bueno. Por qué? porque
nunca puedo guardarme el resultado de la suma y usarlo para otras cosas. La
función sumar NO está devolviendo nada. Está imprimiendo cosas en la
consola, pero eso NO es "devolver" un valor, es solo mostrarlo en pantalla.

Con la versión que usa return, puedo hacer cosas como esta:

    enviar_alerta_de_nuevo_puntaje(sumar(puntos_antes, puntos_nuevos))

Como sumar me devuelve algo, a ese algo lo puedo usar para lo que quiera.
La versión que tiene print en cambio, no me deja hacer eso. Sí o si el
resultado va a la consola, y no queda guardado en ninguna parte. No puedo
mandar una alerta con ese valor, porque ese valor fue a la pantalla, no me
quedó en ningún lado para seguir usándolo en mi código.

Ni hablar que podés combinar ambas cosas, podés tener prints y returns,
pero tampoco suele ser bueno. Más de una vez vas a querer sumar sin que se
imprima el resultado.
La función sumar solo debería sumar y *devolver* el resultado, y quien la
esté llamando a sumar, que decida si quiere imprimir el resultado, mandarlo
por mail, o lo que sea.

Yapa:

Dijimos que devolver es solo con return. Y print no "devuelve" cosas, solo
las muestra por pantalla. Entonces: qué devuelve una función si no tiene
ningún return?
Simple: devuelve None.

Y finalmente, el código que mostrás tiene bastantes cosas complicadas
innecesariamente. Por ejemplo, en lugar de

    for j in range(0, len(lstTotal)):
        tmpLine = lstTotal[j]
        ...

Podrías hacer directamente

    for tmpLine in lstTotal:
        ...

Saludos!


On Mon, May 23, 2016 at 9:36 AM Javier Baigorri <jbaigorri en hotmail.com>
wrote:

>
> La aplicacion tiene una buena salida cuando utilizo la funcion *PRINT*,
> pero cuando lo sustituyo por *RETURN *me devuelve *NONE*.
> No entiendo porque se comporta asi Python.
>
> Salida con funcion *PRINT()*:
> ==== RESTART: C:\Users\...\Python class\listToSplit.py ====
>
> ['lst floor, GROUP A: 27.87m3(12.47, 0.99, 14.41)Volume']
> **********
> ['2nd floor, GROUP A: 147.08m3 Volume']
> ['2nd floor, GROUP B: 102.82m3(57.91, 44.91)Volume']
> ['2nd floor, GROUP C: 64.2m3 Volume']
> **********
> ['3rd floor, GROUP C: 8.05m3(6.6, 0.67, 0.78)Volume']
> **********
>
>
> Salida con funcion *RETURN()*:
> ==== RESTART: C:\Users\...\Python class\listToSplit.py ====
>
> [['lst floor, GROUP A: 27.87m3(12.47, 0.99, 14.41)Volume'], *None*, ['3rd
> floor, GROUP C: 8.05m3(6.6, 0.67, 0.78)Volume']]
>
> No entiendo porque me devuelve NONE en lugar de la lista como hace con la
> funcion PRINT.
>
> He creado una variable local y entonces si que puedo crear la lista que
> deseo.
> Salida utilizando una *variable local*.
> ==== RESTART: C:\Users\...\Python class\listToSplit.py ====
>
> -----
> [ ['lst floor, GROUP A: 27.87m3(12.47, 0.99, 14.41)Volume'],
>   ['2nd floor, GROUP A: 147.08m3 Volume'],
>   ['2nd floor, GROUP B: 102.82m3(57.91, 44.91)Volume'],
>   ['2nd floor, GROUP C: 64.2m3 Volume'],
>   ['3rd floor, GROUP C: 8.05m3(6.6, 0.67, 0.78)Volume'] ]
>
> Pero tengo curiosidad por saber porque pasa esto con la funcion RETURN.
>
>
> Gracias (mi primer contacto con vosotros)
>
> *Codigo utilizado:*
>
> def lin(lista):
>     for elem in lista:
>         volume = 0
>         volumeStr = ""
>         lineOut = ""
>         lnResult = []
>         if isinstance(elem, list):
>             tmp = "es una lista"
>             lin(elem)
>         else:
>             lstNum = lista[1:len(lista)-1]
>             for k in range(0,len(lstNum)):
>                 volume = volume + lstNum[k]
>                 if len(volumeStr) == 0  and len(lstNum) > 1 :
>                     volumeStr = "(" + str(lstNum[k])
>                 elif len(lstNum) == 1:
>                     volumeStr = str(lstNum[k])
>                 else:
>                     volumeStr = volumeStr + ", " + str(lstNum[k])
>
>             if len(lstNum) > 1:
>                 volumeStr = volumeStr + ")"
>
>             lineOut = str(round(volume,2)) + "m3"
>             if len(lista) > 3:
>                 lineOut = lineOut + volumeStr + "Volume"
>             else:
>                 lineOut = lineOut + " Volume"
>
>             lineOut = lista[len(lista)-1] + ", " + lista[0] + ": " +
> lineOut
>             lnResult.append(lineOut)
>             print(lnResult)
>             valor.append(lnResult)
>             return lnResult
>             break
>
> lstTotal = []
> lstA = ["GROUP A", 12.47,0.99,14.41,"lst floor"]
> lstB = [["GROUP A",147.08,"2nd floor"],["GROUP B",57.91,44.91,"2nd
> floor"],["GROUP C",64.2,"2nd floor"]]
> lstC = ["GROUP C",6.6,0.67,0.78,"3rd floor"]
> lstTotal.append(lstA)
> lstTotal.append(lstB)
> lstTotal.append(lstC)
>
> valor = []
> tmp = ""
> tmpLine = []
> cant = 0
> volumeQ = 0
> lineStr = ""
> lineResult = []
>
> for j in range(0, len(lstTotal)):
>     tmpLine = lstTotal[j]
>     lineStr = lin(tmpLine)
>     if not isinstance(tmpLine, list):
>         lineStr = valor
>         print("no soy una lista")
>     print("**********")
>     lineResult.append(lineStr)
>
>
> print(lineResult)
> print("-----")
> print(valor)
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar

-- 
--
fisa  -  Juan Pedro Fisanotti
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20160524/1feca013/attachment.html>


Más información sobre la lista de distribución pyar