[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