2017-10-03 17 views
0

Pythonは論理演算子を短絡します。例えばのための :Pythonの短絡を防ぐ方法は?

if False and Condition2: 
    #condition2 won't even be checked because the first condition is already false. 

は、この動作を停止する方法はあります。私は両方の条件を確認してから、(c、C++などで行われたように)操作を実行したいと思います。条件と一緒に何らかの操作をしているときに便利です。例:

if a<p.pop() and b<p.pop(): 

条件を確認してからブール値を比較することもできます。しかし、それは記憶の無駄でしょう。

+1

を私はここで、「無駄な」メモリはいかなる方法であなたのプログラムに影響を与えないことを保証します。 –

+0

*メモリーの無駄*、メモリーの無駄** **無駄な**ここでは無駄です。 –

+0

回避策: '(a

答えて

8
if all([a < p.pop(), b < p.pop()]) 

これは、その全体で評価されるリストを作成し、両方の値があることを確認するallを使用しています真実。しかし、これはややあいまいであると私はむしろ、あなたはプレーンな記述したコード理解しやすいことをお勧めしたい:

a_within_limit = a < p.pop() 
b_within_limit = b < p.pop() 
if a_within_limit and b_within_limit: 
0

あなたは何とかandor演算子をエミュレートするためにall()any()組み込み関数を使用することができます。両方ともboolean-likesの値をパラメータとして繰り返します。あなたはそれを文字通りのタプルやリストを与える場合は、すべてのメンバーが完全に評価されている:

# all emulates the and operator 
if all((False, Condition2)): 
    do_stuff() 


# any emulates the or operator 
if any((False, Condition2)): 
    do_stuff() 
1

短い答え:いいえ、あなたはそれがこれを行うには停止することはできませんが。例えば

av = p.pop() 
bv = p.pop() 
if a < av and b < bv: 
    pass 

または:

av, bv = p.pop(), p.pop() 
if a < av and b < bv: 
    pass 

また、これらの実施例のメモリの無駄がありません。 Pythonでは、ほとんどすべてが参照によって行われます。ポップされる値オブジェクトはすでにどこかに存在します。文字列、intsなどのスカラーさえもオブジェクトです(そのうちのいくつかはわずかに最適化されています)。ここでの唯一のメモリ変更は、(1)同じ既存のオブジェクトを参照する新しい変数の作成、(2)同時にdict内のレコードの削除(ポップする前にそのオブジェクトを参照する)です。彼らは似たような規模です。

0

彼らはあなたの例であるような条件は、ブールある場合は、代わりに&を使用することもできます。

>>> a, b, p = 1, 1, [0, 0] 
>>> (a < p.pop()) & (b < p.pop()) 
False 
>>> p 
[] 
関連する問題