2010-11-11 8 views
27

In un pezzo del mio programma dubito che io usi correttamente il confronto. Voglio assicurarmi che (u = u < u0 + step) prima di fare qualcosa.Come usare il confronto e 'se non' in 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 + step) –

risposta

42

si può fare:

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

Utilizzando un ciclo:

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
Si può vedere che not X ha precedenza maggiore rispetto and. Il che significa che lo not si applica solo alla prima parte (u0 <= u). scrittura:

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

o anche

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

Ci sono due modi. In caso di dubbio, puoi sempre provarlo. Se non funziona, è possibile aggiungere le parentesi graffe in più per fare in modo, così:

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

Perché pensare? Se not ti confonde, cambia le clausole if e else per evitare la negazione.

Voglio assicurarmi che (u < = u < u0 + passaggio) prima di fare sth.

Basta scrivere quello.

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

Perché sovversione?

Se è necessario un numero vuoto if - e non è possibile elaborare la logica - utilizzare pass.

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

Grazie :) ... dal modo in cui sth è una cosa! ma hai ragione – masti

+0

"sth" è "qualche cosa?" In che lingua? –

+2

Penso di aver visto questa abbreviazione in alcuni dizionari. Comunque non sono madrelingua inglese, scusami i miei errori inglesi! – masti

3

In questo caso particolare, la soluzione più chiara è la S. Lott answer

Ma in alcune condizioni logiche complesse Io preferirei l'uso un po 'di algebra booleana per ottenere una soluzione limpida.

Utilizzando la legge di 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 

poi

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

... in questo caso la soluzione «chiara» non è più chiaro: P

+0

Consigli interessanti in generale, ma come hai detto tu, non aiuta la chiarezza in questa situazione. –