2016-05-24 3 views
0

私は次のような状況があります。がFalse runメソッドであるPythonのネストされた条件の伝播

1)条件1 場合。

2)条件1がTrueで条件2がFalseの場合は、メソッドを実行します。私はフラグを設定することでこれをやっていますが、何かをオーバーコンプリートしていますか?

condition1 = False 
condition2 = True 
dirty = False 

if condition1: 
    if condition2: 
     dirty = True 
     print "dirty" 


if not condition1 or dirty: 
    print "run()" 

答えて

0

このロジックは、本質的に、Pythonでnot condition1 or condition2(又はcondition2 or not condition1)である、!condition1 | condition2まで沸騰します。

したがって、あなたはようにコードを書き換えることができます:あなたはそれを書いてきたように、condition1condition2両方がTrueた場合dirtyシナリオが起こるだろうと思われる

if not condition1 or condition2: 
    # run method 
+0

ええと...私のコードをこの簡単な例に分解すると、より目立ちます。 THANKS RUshy – user1767754

0

希望するロジックは、if not (condition1 or dirty):にかっこを追加することで実現できます。このように書くことは、のメソッドを呼び出さないという唯一の方法は、condition1dirtyが両方ともTrueであることを意味します。これは、あなたのステートメントでカバーされていない唯一のケースです。

しかし、あなたは確かにフラグを設定せずに、このロジックを実現することができ、私はそれがそうするのが好ましいということを提供します:

に簡略化することができ
if not condition1 or (condition1 and not condition2): 
    run() 

:なぜならcondition1場合

if not condition1 or not condition2: 
    run() 

実際には真ではない、最初の条件はすでに満たされており、Pythonは先に進んでこのメソッドを呼び出します。 である場合にのみtrueです。Pythonは 'または'ステートメントの残りの部分をチェックする必要があります。したがって、condition2のステータスをチェックしている場合は、すでにcondition1Trueと仮定できます。 REPLにチェックすることで確認することができif not a or b声明の中で、notは配布されません

注:

>>> not False or True

True

0

あなたはこれを実行する必要があります。

if (not(condition1) or not(condition2)): 
    run() 


説明:条件1が、ではありません
の1-場合、それは条件2をテストします[COND1またはCOND2]文の第二節、に行きますので、(条件1)は、あり、 Falseの場合、(condition2)はTrueにならず、メソッドが実行されます。そうでない場合、if文は無視されます。
2 -条件1がFalseのであれば、(条件1)がなりません、と私たちは場合であるOR演算子を持っているので、コンパイラは、第二の条件をテストしません1つまたはすべての句が真のであるため、条件2を考慮せずにメソッドが実行されます。