El día 17 de septiembre de 2009 13:47, <guagliap@???> escribió:
>
>
> On Thu, 17 Sep 2009 11:56:38 -0300, Claudio Freire <klaussfreire@???> wrote:
>
>>2009/9/16 Facundo Batista <facundobatista@???>
>>
>>> 2009/9/16 Charif Mauricio Nadir <mry.shariff@???>:
>>>
>>> > El uso de la sentencia break está considerada como una mala práctica, al
>>> > igual que continue. El flujo de un programa debe ser fácil de seguir sin
>>> > saltos y sin interrumpir el flujo de las estructuras de control.
>>>
>>> No estoy de acuerdo.
>>>
>>> ...
>>> while True:
>>> edad = raw_input(mssg)
>>> if edad.isdigit():
>>> break
>>>
>>> print "no nro"
>>>
>>>
>>El problema de los while True y los breaks es que hacen el análisis de
>>correctitud y terminación por invariantes casi imposible.
>>Están deprecados en el mundo de la programación porque es muy difícil,
>>leyéndolos, asegurar que no es un loop infinito, y que cuando sale el
>>invariante (si hay) se cumple.
>>
>>Aquí, claro está, realmente podría ser un loop infinito (el usuario nunca
>>tipea un número), y el único invariante deseado es "edad.isdigit()" -
>>nuevamente, ese while True hace menos evidente que al salir del loop, edad
>>es en efecto un número.
>>
>>Por eso yo propongo:
>>
>>edad = None
>>while edad is None or not edad.isdigit():
>> edad = raw_input("dale... un numerito...")
>>
>>La ventaja: al salir del loop uno sabe:
>>1) que "edad is not None" (útil)
>>2) que "edad.isdigit()" (útil)
>
>
> Mi versión (¿vale como "hola mundo", ya que es mi primer post?) :)
>
> ----------------
> import inspect
>
> def firstTrue(cond):
> """ devuelve True siempre la primera vez que se la ejecuta, las veces subsiguientes evalua la condicion """
> stack = inspect.stack()[1] # El stack del programa llamador
> line = stack[2] # Nro de linea desde la que llame a firstTrue
> del stack
>
> if not "line" in firstTrue.__dict__:
> # Primera vez que llamo a la funcion
> firstTrue.line = line
> return True
> elif firstTrue.line != line:
> # Llame a la funcion desde otro punto del programa
> firstTrue.line = line
> return True
>
> return cond
>
>
> edad = "0" # Entra igual la primera vez
>
> while firstTrue (not edad.isdigit()):
> edad = raw_input ("¿Cuantos años tenes? ")
> if not edad.isdigit():
> print "No ingresaste un nro!"
> --------------
>
> Aunque no sé si lo usaría en producción, habría que ver si la performance es razonable llamando
> continuamente a inspect.stack.
>
> Saludos,
> Pablo G
>
Matando una hormiga con un misil nuclear :D
--
fisa - Juan Pedro Fisanotti
---------------------------------------------------------------------
Para dar de baja la suscripcion, mande un mensaje a:
pyar-unsubscribe@???
Para obtener el resto de direcciones-comando, mande un mensaje a:
pyar-help@???
PyAr - Python Argentina - Sitio web:
http://www.python.com.ar/