2015-09-24 14 views
5

Sto provando a compilare un'istruzione if in python dove controlla due variabili per vedere se sono < = 0,05. Ora se entrambe le variabili sono True, voglio solo che il codice passi/continui, ma se solo una delle variabili è True, allora voglio che il codice faccia qualcosa. ad esempio:Python condizionale uno o l'altro ma non entrambi

ht1 = 0.04 
ht2 = 0.03 

if (ht1 <= 0.05) or (ht2 <= 0.05): 
    # do something 
else: 
    pass 

non credo che questo esempio funziona il modo in cui vorrei che la mia comprensione di OR è 1 condizione restituisce true o entrambe le condizioni restituirà True. Se qualcuno potesse assecondarmi nella giusta direzione, sarebbe molto apprezzato.

+0

si può pensare di XOR qualcosa di simile, se bool ((HT1 <= 0.05)) = bool ((ht2 <= 0.05)):! – csharpcoder

risposta

8

quello che vuoi è chiamato "OR esclusivo", che in questo caso può essere espresso come un 'non-uguali' o 'non e' relazione:

if (ht <= 0.05) is not (ht2 <= 0.05): 

Il modo in cui questo funziona è che il if avrà successo solo se uno di questi è True e l'altro è False. Se sono entrambi True o entrambi False, passeranno al blocco else.

+1

corretta, ma sottile. Le espressioni relazionali restituiscono un bool. Un bool è uno o l'altro dei due oggetti singleton 'True' o' False'. Pertanto, 'is not' è un test appropriato. Personalmente preferirei!! = '. – nigel222

+1

@ nigel222 D'accordo che è un po 'sottile; Ho solo usato 'is not' specificamente per il fatto che si tratta di un confronto di' bool's. Mi sembra un po 'più pulito in questo modo, ma è sicuramente una cosa di gusto. Nella mia mente, '! =' Si perderebbe un po 'tra gli altri paragoni '<=' anche se sta scontando uno scopo molto diverso (ad esempio potrebbe sembrare matematico anche se è un operatore logico). – tzaman

+0

Grazie per questa spiegazione. Per me, le parentesi in '(ht1 <= 0.05)! = (Ht2 <= 0.05)' rendono il '! =' Distinto. D'accordo, non assaggiare la sostanza. – nigel222

7

Poiché gli operatori relazionali generano sempre un bool, è sufficiente verificare se sono valori diversi.

if (ht1 <= 0.05) != (ht2 <= 0.05): # Check if only one is true 
    ... 
0

Solo un altro modo di fare così:

if max(ht1, ht2) > 0.05 and min(ht1, ht2) <= 0.05: 
3

Questo metodo è tecnicamente più lento perché deve calcolare i confronti due volte, ma io lo trovo un po 'più leggibile. Il tuo chilometraggio può variare.

ht1 = 0.04 
ht2 = 0.03 

if (ht1 <= 0.05) and (ht2 <= 0.05): 
    pass 
elif (ht1 <= 0.05) or (ht2 <= 0.05): 
    # do something. 
+0

+1 per chiarezza nel flusso. divinatorio. – wim

Problemi correlati