[pyar] Consulta BASICA sobre valor de retorno

Tomas Zulberti tzulberti en gmail.com
Jue Sep 7 20:31:48 ART 2017


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


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