web-dev-qa-db-ja.com

Pythonは短絡をサポートしますか?

Pythonはブール式での短絡をサポートしていますか?

292
Dinah

はい、andorの両方の演算子は短絡しています- ドキュメント を参照してください。

274
Alex Martelli

演算子andorの短絡動作:

まず、何かが実行されるかどうかを判断するための便利な関数を定義しましょう。引数を受け入れ、メッセージを出力し、入力を変更せずに返す単純な関数。

>>> def fun(i):
...     print "executed"
...     return i
... 

次の例のandor演算子の 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 <= zx < 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つの興味深い点:-論理 andor 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に割り当てられます。

174
Grijesh Chauhan

はい。 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
46
Caprooja