[pyar] Consulta BASICA sobre valor de retorno

Ariel Gerardo Ríos arielgerardorios en gmail.com
Vie Sep 8 10:23:51 ART 2017


Hola Edgardo!

    No hay problema, todos pasamos por tu situación y te entendemos
perfectamente; el aprender es un viaje que se tiene que disfrutar :)

    Yo eligiría entre una función y otra por los siguientes motivos:


   - Legibilidad: que la función sea clara en su propósito. Este punto hay
   veces que entra en conflicto con el siguiente punto (luego lo explico).
   - Simplicidad: funciones cortas son más sencillas de leer, la compu
   tiene que hacer menos operaciones (dependiendo el caso, claro).
   - Uso de herramientas: fijate que para ver las claves del diccionario no
   reinventé la rueda y utilicé los métodos que ya me proveía. El uso de
   herramientas usadas por mucha gente te reduce los puntos de falla a revisar
   si tenés un problema; si lo tenés, es muy probable que esté en otro lado y
   no en la biblioteca estándar.
   - Velocidad: si es un factor del cual depende el éxito de tu sistema.


    Sobre lo que dije de entrar en conflicto, hay veces que hacer una
función corta te dificulta leerla, por lo que ahí tenés que balancear entre
entender lo que hace la función y que entre mejor en la pantalla :P . Yo
muchas veces termino eligiendo que sea clara la función y se extiende un
poco más de lo normal.

Abrazo!

2017-09-08 10:06 GMT-03:00 Edgardo <edgardolor en gmail.com>:

> *Ahí lo estuve viendo Ariel, cuadra todo excepto ese ultimo
> print(message), ya que si el mes es CORRECTO la función se queda sin return
> y por lo tanto luego de imprimir el mensaje también imprime un None. Lo que
> yo haría es cambiar el print(message) por el return message evitando el
> None cuando el mes sea el correcto.*
>
> *Por otro lado, entiendo que ambas f() la tuya y la mía (una vez corregida
> con la asistencia de los chicos), ambas son validas y no se rompen. Mi duda
> es, porque elegir entre una o la otra? Gracias ;)*
>
> *Edgardo*
>
> El 8 de septiembre de 2017, 9:34, Edgardo <edgardolor en gmail.com> escribió:
>
>> *Buenos días*
>>
>> *Ariel, perdón! Como soy nuevo con python y programación en gral, me
>> cuesta mucho leer tu código a partir de la segunda mitad de la declaración
>> de la f(), Podrías agregar comentarios explicativos?*
>>
>> *Mil gracias!!!*
>>
>> *Edgardo!*
>>
>> El 8 de septiembre de 2017, 8:32, Ariel Gerardo Ríos <
>> arielgerardorios en gmail.com> escribió:
>>
>>> Les paso mi granito de arena:
>>>
>>> DAYS_IN_MONTH = {"Enero":31,"Febrero":28,"Marz
>>> o":31,"Abril":30,"Mayo":31,"Junio":30,"Julio":31,"Agosto":31
>>> ,"Septiembre":30,"Octubre":31,"Noviembre":30,"Diciembre":31}
>>>
>>> def days_in_month(x):
>>>     if x not in DAYS_IN_MONTH.keys():
>>>         return "Mes inexistente"
>>>
>>>     days = DAYS_IN_MONTH[x]
>>>     message = "El mes de %s posee %d dias." % (x, days)
>>>     if x == "Febrero":
>>>         message += " Salvo los años biciestos"
>>>
>>>     print(message)
>>>
>>> days_in_month("Febrero")
>>> days_in_month("Osvaldo")
>>> days_in_month("Septiembre")
>>>
>>>
>>> Saludos!
>>>
>>> 2017-09-08 8:08 GMT-03:00 Tomas Zulberti <tzulberti en gmail.com>:
>>>
>>>> 2017-09-07 20:42 GMT-03:00 Edgardo <edgardolor en gmail.com>:
>>>> > Muchas gracias Tomas, ahora me quedo muchisimo mas claro. Y por lo que
>>>> > concluyo que siempre es mejor que el valor de que me tiene que
>>>> devolver este
>>>> > precedido por un RETURN verdad? ya que si hay un print la función me
>>>> > imprimiría cada if/else + el último "mes inexistente"?
>>>>
>>>> Tal como decis, eso funciona si se esta devolviendo el valor. Si se
>>>> hicese un print prodrias usar un break y un for ... else ... por lo
>>>> que quedaria algo de este estilo:
>>>>
>>>> def days_in_month(x):
>>>>     month = {"Enero":31,"Febrero":28,"Marz
>>>> o":31,"Abril":30,"Mayo":31,"Junio":30,"Julio":31,"Agosto":31
>>>> ,"Septiembre":30,"Octubre":31,"Noviembre":30,"Diciembre":31}
>>>>     for c, v in month.items():
>>>>         if x == c:
>>>>             if x == "Febrero":
>>>>                 print("El mes de {} posee {} dias. Salvo los años
>>>> biciestos".format(c, v))
>>>>             else:
>>>>                 print("El mes de {} posee {} dias.".format(c, v))
>>>>             # como encontro el mes no tiene sentido seguir itereando
>>>> los valores
>>>>             break
>>>>     else:
>>>>         # esto solo se ejecuta sino se salior del for con un break.
>>>> Esta estructura del for... else no la
>>>>         # vi en otro lenguaje que sea python, pero lo mismo se podria
>>>> hacer usando una variable
>>>>         # que se setea en True cuando encontro el mes, y aca hacer un
>>>> if por esa variable
>>>>         return "Mes inexistente"
>>>>
>>>> days_in_month("Febrero")
>>>> days_in_month("Osvaldo")
>>>> days_in_month("Septiembre")
>>>>
>>>>
>>>> Saludos,
>>>> TZ
>>>>
>>>>
>>>> >
>>>> > Muchas gracias!!!
>>>> >
>>>> > El 7 de septiembre de 2017, 20:31, Tomas Zulberti <
>>>> tzulberti en gmail.com>
>>>> > escribió:
>>>> >>
>>>> >> 2017-09-07 20:20 GMT-03:00 Edgardo <edgardolor en gmail.com>:
>>>> >> > Buenas tardes gente linda.
>>>> >> >
>>>> >> > Estoy aprendiendo Python de forma autodidacta con la ayuda de este
>>>> libro
>>>> >> > "How to think like a Computer Scientist" 3ra Edicion, que me lo
>>>> >> > recomendaron
>>>> >> > por aqui.
>>>> >> > En el cap 6 se ve Valor de Retorno y tengo algunas dudas.
>>>> >> > El problema solicita que el usuario ingrese un nombre de mes y se
>>>> cree
>>>> >> > una
>>>> >> > f() que en base al nombre ingresado devuelva la cant de días que
>>>> posee
>>>> >> > dicho
>>>> >> > mes.
>>>> >> > La f() la saque enseguida, la copio:
>>>> >> >
>>>> >> > def days_in_month(x):
>>>> >> >     month =
>>>> >> >
>>>> >> > {"Enero":31,"Febrero":28,"Marzo":31,"Abril":30,"Mayo":31,"Ju
>>>> nio":30,"Julio":31,"Agosto":31,"Septiembre":30,"Octubre":31,
>>>> "Noviembre":30,"Diciembre":31}
>>>> >> >     for c, v in month.items():
>>>> >> >         if x == c:
>>>> >> >             if x == "Febrero":
>>>> >> >                 return "El mes de {} posee {} dias. Salvo los años
>>>> >> > biciestos".format(c, v)
>>>> >> >             else:
>>>> >> >                 return "El mes de {} posee {} dias.".format(c, v)
>>>> >> >         # return None
>>>> >> > print(days_in_month("Febrero"))
>>>> >> > print(days_in_month("Osvaldo"))
>>>> >> > print(days_in_month("Septiembre"))
>>>> >> >
>>>> >> > Lo que no comprendo es porque NO puedo colocar en el primer IF, al
>>>> >> > final, el
>>>> >> > return None. Haciéndolo me da como resultado que la función siempre
>>>> >> > devuelva
>>>> >> > None. Como ven ahi esta comentado y la f() funciona correctamente y
>>>> >> > cuando
>>>> >> > se ingresa un nombre de mes incorrecto, como en la segunda llamada,
>>>> >> > automáticamente devuelve None.
>>>> >> > La duda surge a raiz de que en lugar del "return None" decide que
>>>> en
>>>> >> > caso de
>>>> >> > no cumplir la condicion del primer IF, haya un "else" que me
>>>> devuelva un
>>>> >> > error de Valor inexistente, asi:
>>>> >> >
>>>> >> > def days_in_month(x):
>>>> >> >     month =
>>>> >> >
>>>> >> > {"Enero":31,"Febrero":28,"Marzo":31,"Abril":30,"Mayo":31,"Ju
>>>> nio":30,"Julio":31,"Agosto":31,"Septiembre":30,"Octubre":31,
>>>> "Noviembre":30,"Diciembre":31}
>>>> >> >     for c, v in month.items():
>>>> >> >         if x == c:
>>>> >> >             if x == "Febrero":
>>>> >> >                 return "El mes de {} posee {} dias. Salvo los años
>>>> >> > biciestos".format(c, v)
>>>> >> >             else:
>>>> >> >                 return "El mes de {} posee {} dias.".format(c, v)
>>>> >> >         else:
>>>> >> >             return "Mes inexistente"
>>>> >> > print(days_in_month("Febrero"))
>>>> >> > print(days_in_month("Osvaldo"))
>>>> >> > print(days_in_month("Septiembre"))
>>>> >> >
>>>> >> >
>>>> >> > Pero ese ultimo return lo que produce es que CADA llamada devuelve
>>>> >> > SIEMPRE
>>>> >> > ese ultimo return, aun cuando el nombre del mes es correcto.
>>>> >> > Por ultimo me gustaria consultarles si es RECOMENDABLE que en
>>>> lugar de
>>>> >> > un
>>>> >> > return haya un print y evitar pasarle al print final la llamada a
>>>> la
>>>> >> > funcion. Asi:
>>>> >> >
>>>> >> > def days_in_month(x):
>>>> >> >     month =
>>>> >> >
>>>> >> > {"Enero":31,"Febrero":28,"Marzo":31,"Abril":30,"Mayo":31,"Ju
>>>> nio":30,"Julio":31,"Agosto":31,"Septiembre":30,"Octubre":31,
>>>> "Noviembre":30,"Diciembre":31}
>>>> >> >     for c, v in month.items():
>>>> >> >         if x == c:
>>>> >> >             if x == "Febrero":
>>>> >> >                 print("El mes de {} posee {} dias. Salvo los años
>>>> >> > biciestos".format(c, v))
>>>> >> >             else:
>>>> >> >                 print("El mes de {} posee {} dias.".format(c, v))
>>>> >> >         else:
>>>> >> >             return "Mes inexistente"
>>>> >> > days_in_month("Febrero")
>>>> >> > days_in_month("Osvaldo")
>>>> >> > days_in_month("Septiembre")
>>>> >> >
>>>> >> > El hecho es que esa última forma de establecer el código hace que
>>>> >> > gracias a
>>>> >> > ese último "else" el mismo no funcione. Sacando el else + return
>>>> los
>>>> >> > meses
>>>> >> > que están bien ingresados los devuelve correctamente, excepto el
>>>> 2do.
>>>> >> >
>>>> >> > Desde ya muchas gracias y espero con ansias sus respuestas.
>>>> >> >
>>>> >>
>>>> >> Buenas.
>>>> >>
>>>> >> La forma correcta, seria que al final del for sino salio del mismo
>>>> >> devuelvas mes inexistente. Por ejemplo, podes hacer algo como esto
>>>> >>
>>>> >>
>>>> >> def days_in_month(x):
>>>> >>     month =
>>>> >> {"Enero":31,"Febrero":28,"Marzo":31,"Abril":30,"Mayo":31,"Ju
>>>> nio":30,"Julio":31,"Agosto":31,"Septiembre":30,"Octubre":31,
>>>> "Noviembre":30,"Diciembre":31}
>>>> >>     for c, v in month.items():
>>>> >>         if x == c:
>>>> >>             if x == "Febrero":
>>>> >>                 return "El mes de {} posee {} dias. Salvo los años
>>>> >> biciestos".format(c, v)
>>>> >>             else:
>>>> >>                 return "El mes de {} posee {} dias.".format(c, v)
>>>> >>
>>>> >>     return "Mes inexistente"
>>>> >>
>>>> >>
>>>> >> print(days_in_month("Febrero"))
>>>> >> print(days_in_month("Osvaldo"))
>>>> >> print(days_in_month("Septiembre"))
>>>> >>
>>>> >>
>>>> >> De esa forma:
>>>> >>
>>>> >> - Si el mes es valido, entonces va a terminar la funcion por el
>>>> return
>>>> >> del "El mes..."
>>>> >> - Si el valor es invalid, entonces nunca va salir por que nunca se da
>>>> >> el caso de x == c, y por lo tanto el for va a terminar. Por eso
>>>> >> identificas en ese caso de que es un mes invalido
>>>> >>
>>>> >> Saludos,
>>>> >> Tomas Zulberti
>>>> >>
>>>> >> pd: Como estas usando un dicionario para month, podes directamente
>>>> hacer:
>>>> >> if x in month:
>>>> >>      v = month[x]
>>>> >>      if x == 'Febrero':
>>>> >>          return "El mes de {} posee {} dias. Salvo los años
>>>> >> biciestos".format(c, v)
>>>> >>      else:
>>>> >>          return "El mes de {} posee {} dias.".format(c, v)
>>>> >> else:
>>>> >>     return "Mes inexistente"
>>>> >>
>>>> >> > Edgardo!!!!!!!!!!
>>>> >> >
>>>> >> >
>>>> >> >
>>>> >> >
>>>> >> > _______________________________________________
>>>> >> > Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>>>> >> > Sitio web: http://www.python.org.ar/
>>>> >> >
>>>> >> > Para administrar la lista (o desuscribirse) entrar a
>>>> >> > http://listas.python.org.ar/listinfo/pyar
>>>> >> >
>>>> >> > La lista de PyAr esta Hosteada en USLA - Usuarios de Software
>>>> Libre de
>>>> >> > Argentina - http://www.usla.org.ar
>>>> >> _______________________________________________
>>>> >> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>>>> >> Sitio web: http://www.python.org.ar/
>>>> >>
>>>> >> Para administrar la lista (o desuscribirse) entrar a
>>>> >> http://listas.python.org.ar/listinfo/pyar
>>>> >>
>>>> >> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre
>>>> de
>>>> >> Argentina - http://www.usla.org.ar
>>>> >
>>>> >
>>>> >
>>>> > _______________________________________________
>>>> > Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>>>> > Sitio web: http://www.python.org.ar/
>>>> >
>>>> > Para administrar la lista (o desuscribirse) entrar a
>>>> > http://listas.python.org.ar/listinfo/pyar
>>>> >
>>>> > La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>>>> > Argentina - http://www.usla.org.ar
>>>> _______________________________________________
>>>> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>>>> Sitio web: http://www.python.org.ar/
>>>>
>>>> Para administrar la lista (o desuscribirse) entrar a
>>>> http://listas.python.org.ar/listinfo/pyar
>>>>
>>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>>>> Argentina - http://www.usla.org.ar
>>>>
>>>
>>>
>>>
>>> --
>>> Ariel Gerardo Ríos
>>> linkedin <http://www.linkedin.com/pub/ariel-gerardo-rios/33/158/227> | *blog
>>> <http://www.ariel17.com.ar>*
>>>
>>> _______________________________________________
>>> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
>>> Sitio web: http://www.python.org.ar/
>>>
>>> Para administrar la lista (o desuscribirse) entrar a
>>> http://listas.python.org.ar/listinfo/pyar
>>>
>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>>> Argentina - http://www.usla.org.ar
>>>
>>
>>
>
> _______________________________________________
> Lista de Correo de PyAr - Python Argentina - pyar en python.org.ar
> Sitio web: http://www.python.org.ar/
>
> Para administrar la lista (o desuscribirse) entrar a
> http://listas.python.org.ar/listinfo/pyar
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>



-- 
Ariel Gerardo Ríos
linkedin <http://www.linkedin.com/pub/ariel-gerardo-rios/33/158/227> | *blog
<http://www.ariel17.com.ar>*
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20170908/44a21a46/attachment-0001.html>


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