[pyar] Consulta BASICA sobre valor de retorno

Tomas Zulberti tzulberti en gmail.com
Vie Sep 8 08:08:36 ART 2017


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


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