2010-11-11 14 views
27

En una pieza de mi programa, dudo si utilizo la comparación correctamente. Quiero asegurarme de que (u0 < = u < u0 + paso) antes de hacer algo.¿Cómo usar la comparación y 'si no' en Python?

if not (u0 <= u) and (u < u0+step): 
    u0 = u0+ step # change the condition until it is satisfied 
else: 
    do something. # condition is satisfied 
+12

Python magic: u0 <= u <(u0 + paso) –

Respuesta

42

que puede hacer:

if not (u0 <= u <= u0+step): 
    u0 = u0+ step # change the condition until it is satisfied 
else: 
    do sth. # condition is satisfied 

Utilizando un bucle:

while not (u0 <= u <= u0+step): 
    u0 = u0+ step # change the condition until it is satisfied 
do sth. # condition is satisfied 
8

Operator precedence in python
Se puede ver que not X tiene mayor precedencia que and. Lo que significa que el not solo se aplica a la primera parte (u0 <= u). Comentario:

if not (u0 <= u and u < u0+step): 

o incluso

if not (u0 <= u < u0+step): 
0

Hay dos maneras. En caso de duda, siempre puedes intentarlo. Si esto no funciona, puede agregar los apoyos adicionales para asegurarse de que, al igual que:

if not ((u0 <= u) and (u < u0+step)): 
2

Por qué piensan? Si not lo confunde, cambie sus cláusulas if y else para evitar la negación.

Quiero asegurarse de que (u0 < = u < u0 + step) antes de hacer algo.

Simplemente escriba eso.

if u0 <= u < u0+step: 
    "do sth" # What language is "sth"? No vowels. An odd-looking word. 
else: 
    u0 = u0+ step 

¿Por qué overthink it?

Si necesita un if vacío - y no puede resolver la lógica - use pass.

if some-condition-that's-too-complex-for-me-to-invert: 
    pass 
else: 
    do real work here 
+0

Gracias :) ... por cierto algo es algo! pero tienes razón – masti

+0

"sth" es "¿algo?" ¿En que idioma? –

+2

Creo que vi esta abreviatura en algunos diccionarios. De todos modos, no soy un hablante nativo de inglés, perdona mis errores en inglés. – masti

3

En este caso particular, la solución más claro es el S. Lott answer

embargo, en algunas condiciones lógicas complejas yo preferiría usar algo de álgebra de Boole para obtener una solución clara.

Usando ¬ ley de De Morgan (A^B) = ¬Av¬B

not (u0 <= u and u < u0+step) 
(not u0 <= u) or (not u < u0+step) 
u0 > u or u >= u0+step 

continuación

if u0 > u or u >= u0+step: 
    pass 

... en este caso la solución «clara» no es más claro: P

+0

Un consejo interesante en general, pero como dijiste, no ayuda a la claridad en esta situación. –

Cuestiones relacionadas