2014-02-16 3 views
0

могли бы вы объяснить мне, почему этот код:Multiple если условия

if (x and y) and z > 0: 
    return True 

не то же самое, как:

if (x and y) > 0 < z: 
    return True 

В принципе, почему не могу я цепь несколько переменных, как:

if var1 and var2 and var3 and var4 > 0: 
    do_this 

Что я делаю неправильно?

--edit-- Я полагаю, я просто хочу знать, как я могу сократить состояние без написания:

if var1 > 0 and var2 > 0 and var3 > 0 

особенно если условие является длинным, как:

if var1 > (pow(x, 3)/2.5*pow(y,0.5)+x*y) 

Если было бы невозможно переписать условие для каждой переменной, представьте, если бы у меня было 10 таких варов. Или есть лучший способ, который я не вижу, что можно использовать в таких ситуациях? Спасибо за ответы!

ответ

5

Это не делает то, что вы себе представить:

if (x and y) > 0 < z: return True 

Приведенные выше оценивает (x and y) первый, если оба truthy затем y возвращается, так что теперь мы имеем:

if y > 0 < z: return True 

Какой то же, что и:

if y > 0 and 0 < z 

Очевидно, что это не то же самое, другое выражение:

if (x and y) and z > 0: return True 
if y and z > 0: 
if z > 0: 

Итог: (x and y) > 0 является определенно не делать то, что вы себе представить! то, что вы хотели сказать, должно быть написано так:

if x > 0 and y > 0 and z > 0: return True 
+0

Спасибо за объяснение! Есть ли способ сократить выражение? Без переписывания x> 0 и y> 0 и z> 0? Поэтому он проверяет, есть ли каждая указанная переменная> 0? – metabuddy

+0

@metacore нет общего решения для одновременного сравнения нескольких значений. В этом случае, в частности, выражение в последней строке моего ответа является самым простым способом выражения условия –

Смежные вопросы