[pyar] Consulta BASICA sobre valor de retorno
Edgardo
edgardolor en gmail.com
Dom Sep 10 00:10:23 ART 2017
Buenas noches
Estimado Nicolas, mucha gracias por enseñarme el método .get() (es de gran
ayuda).
Algunas consultas, leí que el mismo por defecto trae el None implícito,
¿Porque en tu ejemplo, lo agregaste como un argumento entonces? No es
redundante?
Otra duda, porque crear una variable message si se puede devolver lo que
uno desea a través de un return? así:
if months.get(month, None):
if month == 'Febrero':
return "El mes de {name} posee {days} días. Salvo los años
bisiestos.".format(name=month, days=months[month])
return "El mes de {name} posee {days} días.".format(name=month,
days=months[month])
return 'Mes incorrecto.'
Y asi evitar como vos decis, generar codigo innecesario.
Aguardo tus respuestas, muchas gracias!!!
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
El 8 de septiembre de 2017, 21:57, Nicolas Mendoza <
niccolasmendoza en gmail.com> escribió:
> Hola Edgardo,
>
> te dejo otro ejemplo siguiendo el mismo camino de solución que has
> decidido, si bien no sería necesario harcodear una lista con los meses del
> año para hacer un chequeo de ese tipo ...no te preocupes y slo lo comento
> para que lo tengas en cuenta. Lo importante en principio es que resuelva lo
> que necesitas.
>
> Al ejemplo que agrego lo único que le quité es el "for"... porque creo ya
> es demasiado, dejar el for es como "matar moscas a cañonazos" (con el costo
> que eso implica). Si bien esto es slo una función y un ejemplo, creo es
> bueno que sepas que cada: "for", cada "if"... de más que agregemos a
> nuestro código trae consigo(suma) complejidad, siempre hay un costo en
> nuestras decisiones como programador.
>
> Agrego un gist alternativo al "desorden" de código en el body de este
> mensaje, también algunos links que puede ser útiles. Saludos.
>
> https://gist.github.com/nicolasmendoza/e44729034f0dc735c53ade8a0cf0f700
>
> def days_of(month):
> months = {"Enero": 31, "Febrero": 28, "Marzo": 31, "Abril": 30, "Mayo": 31,
> "Junio": 30, "Julio": 31, "Agosto": 31,
> "Septiembre": 30, "Octubre": 31, "Noviembre": 30, "Diciembre": 31}
> # si mes no existe en dict, get() => None
> if months.get(month, None):
> message = "El mes de {name} posee {days} días.".format(name=month, days=
> months[month])
> if month == 'Febrero':
> message += " Salvo los años bisiestos."
> return message
> return 'Mes incorrecto.'
> Links:
>
> https://www.programiz.com/python-programming/methods/dictionary/get
> https://docs.python.org/3.5/library/calendar.html
> https://docs.python.org/3.5/library/datetime.html?
> highlight=datetime#module-datetime
>
> "People who are more than casually interested in computers should have at
> least some idea of what the underlying hardware is like. Otherwise the
> programs they write will be pretty weird." - Donald Knuth
>
>
> 2017-09-08 13:16 GMT-03:00 Edgardo <edgardolor en gmail.com>:
>
>> *Bueno, ahi reduje la f() lo mas que pude y salve varias lineas. Es
>> increíble como se puede toquetear de diferentes formas y conseguir el mismo
>> resultado.*
>>
>> def dias(x):
>> months = {"Enero": 31, "Febrero": 28, "Marzo": 31, "Abril": 30, "Mayo": 31, "Junio": 30, "Julio": 31, "Agosto": 31,
>> "Septiembre": 30, "Octubre": 31, "Noviembre": 30, "Diciembre": 31}
>> if x in months:
>> if x == "Febrero":
>> return "El mes de {} posee {} días. Salvo los años bisiestos".format(x, months[x])
>> return "El mes de {} posee {} días".format(x, months[x])
>> return "Mes incorrecto"
>>
>> print(dias("Febrero"))
>>
>> *Ariel, creo que ahora luce bastante sencilla y fácil de leer.
>> Originalmente había visto en un vídeo de Udemy al profesor que enseñaba el
>> metodo .items() de los dicc por eso se me ocurrió recorrerlo con un for.
>> "If x in months" simplifica bastante esto. Salvando la declaración del dicc
>> la f() tiene solo 5 lineas :D*
>>
>> *Tomas, no entiendo porque asignar a v = months(x) en tu ejemplo:*
>>
>> pd: Como estas usando un diccionario para month, podes directamente hacer:
>> if x in month:
>> v = month[x]
>>
>>
>> *Este ultimo ejemplo no lo posee y no se rompe. *
>>
>> *Gracias y aguardo sus comentarios.*
>>
>> *Edgardo*
>>
>>
>>
>> El 8 de septiembre de 2017, 10:33, Ariel Gerardo Ríos <
>> arielgerardorios en gmail.com> escribió:
>>
>>> Hola Matías!
>>>
>>> Hay veces que tenés que evaluar lo que necesita el sistema vs las
>>> buenas prácticas. Es cierto que múltiples puntos de retorno no está bueno
>>> porque si no tenés control se te puede ir de las manos, pero en este caso
>>> la función es sencilla y aporta legibilidad y simpleza. Quizás en una
>>> función más compleja es más evidente, pero yo considero que múltiples
>>> returns es una herramienta a usar, sobre todo en métodos extensos.
>>>
>>> Últimamente he visto que los editores que analizan la complejidad
>>> algorítmica de los métodos al vuelo te dicen que 5 ó 6 returns "es mucho y
>>> tenés que hacer algo al respecto" :P Desconozco si ese número está
>>> relacionado con algo; si alguien sabe algo al respecto me sacará una duda
>>> existencial que tengo hace tiempo.
>>>
>>> Gracias y saludos!
>>>
>>> 2017-09-08 9:17 GMT-03:00 Matias Oliva <olivamati en gmail.com>:
>>>
>>>> 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,"Marz
>>>>> o":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,"Marz
>>>>>> o":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,"Ju
>>>>>> nio":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,"Ju
>>>>>> nio":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,"Ju
>>>>>> nio":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,"Ju
>>>>>> nio":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
>>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> 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
>>>
>>
>>
>> _______________________________________________
>> 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
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20170910/8b6d8112/attachment-0001.html>
Más información sobre la lista de distribución pyar