Pythonはブール式での短絡をサポートしていますか?
はい、and
とor
の両方の演算子は短絡しています- ドキュメント を参照してください。
and
、or
の短絡動作:まず、何かが実行されるかどうかを判断するための便利な関数を定義しましょう。引数を受け入れ、メッセージを出力し、入力を変更せずに返す単純な関数。
>>> def fun(i):
... print "executed"
... return i
...
次の例のand
、or
演算子の Pythonの短絡動作 を観察できます。
>>> fun(1)
executed
1
>>> 1 or fun(1) # due to short-circuiting "executed" not printed
1
>>> 1 and fun(1) # fun(1) called and "executed" printed
executed
1
>>> 0 and fun(1) # due to short-circuiting "executed" not printed
0
注:以下の値は、インタプリタによってfalseを意味すると見なされます。
False None 0 "" () [] {}
any()
、all()
:Pythonの any()
および all()
関数も短絡をサポートしています。ドキュメントに示されているとおり。評価の早期終了を可能にする結果が見つかるまで、シーケンスの各要素を順番に評価します。両方を理解するには、以下の例を検討してください。
関数 any()
は、いずれかの要素がTrueであるかどうかをチェックします。 Trueに遭遇するとすぐに実行を停止し、Trueを返します。
>>> any(fun(i) for i in [1, 2, 3, 4]) # bool(1) = True
executed
True
>>> any(fun(i) for i in [0, 2, 3, 4])
executed # bool(0) = False
executed # bool(2) = True
True
>>> any(fun(i) for i in [0, 0, 3, 4])
executed
executed
executed
True
関数 all()
は、すべての要素がTrueであることを確認し、Falseに遭遇するとすぐに実行を停止します。
>>> all(fun(i) for i in [0, 0, 3, 4])
executed
False
>>> all(fun(i) for i in [1, 0, 3, 4])
executed
executed
False
さらに、Pythonで
比較は任意に連鎖できます ;たとえば、
x < y <= z
はx < y and y <= z
と同等です。ただし、y
は1回だけ評価されます(ただし、両方の場合、x < y
がfalseであると判断された場合、z
はまったく評価されません)。
>>> 5 > 6 > fun(3) # same as: 5 > 6 and 6 > fun(3)
False # 5 > 6 is False so fun() not called and "executed" NOT printed
>>> 5 < 6 > fun(3) # 5 < 6 is True
executed # fun(3) called and "executed" printed
True
>>> 4 <= 6 > fun(7) # 4 <= 6 is True
executed # fun(3) called and "executed" printed
False
>>> 5 < fun(6) < 3 # only prints "executed" once
executed
False
>>> 5 < fun(6) and fun(6) < 3 # prints "executed" twice, because the second part executes it again
executed
executed
False
編集:
注意すべきもう1つの興味深い点:-論理 and
、or
Pythonの演算子_は、ブール値(True
またはFalse
)ではなく、オペランドのvalueを返します。例えば:
操作
x and y
は結果を返しますif x is false, then x, else y
他の言語とは異なり、例えば0または1を返すCの&&
、||
演算子.
例:
>>> 3 and 5 # Second operand evaluated and returned
5
>>> 3 and ()
()
>>> () and 5 # Second operand NOT evaluated as first operand () is false
() # so first operand returned
同様に、or
演算子は、bool(value)
== True
の左端の値を返し、そうでない場合は右端のfalse値(短絡動作による)を返します。例:
>>> 2 or 5 # left most operand bool(2) == True
2
>>> 0 or 5 # bool(0) == False and bool(5) == True
5
>>> 0 or ()
()
それで、これはどのように便利ですか? Practical Python Magnus Lie Hetlandでの使用例:
ユーザーは自分の名前を入力することになっていますが、何も入力しないこともできます。その場合は、デフォルト値'<unknown>'
を使用します。 ifステートメントを使用できますが、非常に簡潔に説明することもできます。
In [171]: name = raw_input('Enter Name: ') or '<Unkown>'
Enter Name:
In [172]: name
Out[172]: '<Unkown>'
つまり、raw_inputからの戻り値がtrue(空の文字列ではない)の場合、nameに割り当てられます(何も変更されません)。そうでない場合、デフォルトの'<unknown>'
がname
に割り当てられます。
はい。 pythonインタープリターで次を試してください。
そして
>>>False and 3/0
False
>>>True and 3/0
ZeroDivisionError: integer division or modulo by zero
または
>>>True or 3/0
True
>>>False or 3/0
ZeroDivisionError: integer division or modulo by zero