[pyar] IF de una línea
david weil
tenuki en gmail.com
Dom Oct 17 17:07:17 ART 2010
2010/10/17 Carlos Joel Delgado Pizarrro <carlosj2585 en gmail.com>:
> El 17 de octubre de 2010 08:47, david weil <tenuki en gmail.com> escribió:
>> Otro problema, es que no es exactamente lo mismo que el " .. if ..
>> else .." porque no es lazy:
>>
>> Python 2.6.6 (r266:84292, Sep 15 2010, 16:22:56)
>> [GCC 4.4.5] on linux2
>> Type "help", "copyright", "credits" or "license" for more information.
>> >>> def f():
>> ... print 'f'
>> ...
>> >>> def g():
>> ... print 'g'
>> ...
>> >>> r = f() if True else g()
>> f
>> >>> r = (g(), f())[True]
>> g
>> f
>>
>> (aca se ve que ambas, f y g se ejecutan en el segundo caso, aunque r
>> quede asignada al valor correcto).
>
> Prueba cambiando los print dentro de las funciones con return, asì:
>
>>>> def f():
> return "F"
>
>>>> def g():
> return "G"
>
>>>> x = (f(), g())[True]
>>>> print x
> G
>>>>
>
> El tiro es que (valor_si_falso, valor_si_verdadero)[condicion] es una tupla
> y como False y True son enteros que valen 0 y 1 respectivamente, lo que se
> hace al analizar la condición es obtener la posición del elemento dentro de
> la tupla, si la condicion resulta False, se toma el elemento en la posición
> 0 de la tupla, y si resulta True, se toma el elemento en la posición 1, es
> por eso que la "sintaxys" en este caso es poner primero el valor que se
> obtendra de resultar False la condición.
Y como evita eso que f y g se ejecuten ambas??
Digo, mi ejemplo iba a que no es tan trivial cambiar cualquier if a
esa construccion, ej:
if bool:
mostrar_ventana()
else:
mostrar_ayuda()
justamente porque si haces:
x = get_bool()
(mostrar_ayuda(), mostrar_ventana())[x]
estaras ejecutando ambas funciones, aunque te interese ejecutar una sola.
Y si, no digo que no se solucione, se soluciona facilmente de esta forma:
(mostrar_ayuda, mostrar_ventana)[x]()
ves la diferencia?
saludos!
dave
--
There is no dark side of the moon really. Matter of fact it's all dark.
More information about the pyar
mailing list