[pyar] Consulta BASICA sobre valor de retorno

Matias Oliva olivamati en gmail.com
Vie Sep 8 09:17:24 ART 2017


Buen día estimados, según las buenas practicas de programación se sugiere
no utilizar break; o un doble return en la funcion. Esto provocaría un
quiebre repentino del algoritmo, lo ideal es que se trabaje lógicamente, ya
sea con un flag o alguna otra condición que corte el bucle o el flujo del
programa.

Saludos!

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,"Marzo":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,"Marzo":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,"
>> 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":
>> >> >                 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,"
>> 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":
>> >> >                 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,"
>> 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))
>> >> >         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,"
>> 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":
>> >>                 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
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20170908/b019a536/attachment-0001.html>


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