Re: [pyar] ¿If anidado?

Página superior
Adjuntos:
+ (text/plain)

Responder a este mensaje
Autor: Juan Pedro Fisanotti
Fecha:  
A: pyar
Asunto: Re: [pyar] ¿If anidado?
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/