[pyar] Consulta BASICA sobre valor de retorno

Ariel Gerardo Ríos arielgerardorios en gmail.com
Vie Sep 8 08:32:12 ART 2017


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


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