2016-08-22 6 views
6

JavaまたはCでは<condition> ? X : Yがあり、これはPythonにX if <condition> else Yと変換されます。XとYまたはZ-三項演算子

しかし、この小さなトリックもあります:<condition> and X or Yです。

私は前述の三項演算子と同等であることを理解していますが、andor演算子が正しい結果をどのように生成できるかを理解することは困難です。これの背後にある論理は何ですか?

+0

'とX'という表現は' X'( ''が 'False'の場合は' False')に解決されます。 'または'演算子の働きと同様です。つまり、特殊な構文ではなく、2つの演算子を組み合わせたものです。 – SuperBiasedMan

+0

ここでは、プロセスの手順を分解して説明します。[Pythonの論理演算子AND](http://stackoverflow.com/questions/18195322/pythons-logical-operator-and) – SuperBiasedMan

+1

[this回答](http://stackoverflow.com/a/36551857/4014959)役立ちます。 –

答えて

8

私はそれが前述の三元 事業者

と同等だということを理解しながらこれは正しくありません。

In [32]: True and 0 or 1 
Out[32]: 1 

In [33]: True and 2 or 1 
Out[33]: 2 

条件がある一方、最初の式が、1(すなわちY)を返すのはなぜTrueであり、「期待される」回答は0(すなわちX)ですか?ドキュメントによれば

式xとyの最初の評価するのX。 xがfalseの場合、その値は です。それ以外の場合は、yが評価され、結果の値は です。

式xまたはyは、まずxを評価します。 xがtrueの場合、その値は です。それ以外の場合は、yが評価され、結果の値は です。

ので、True and 0 or 1Trueあるandオペレータの最初の引数を評価します。次に、第2引数(0)を返します。

orオペレータは第二引数(すなわち1

1

を返し、偽値True and 0戻って以来、私は最初にそれがTrueだ場合XがTrueと評価された場合、それはXを実行し、Yを実行スキップ<condition>をチェックすることを考えます

<condition>が失敗した場合は、XをスキップしてOR文を実行し、Yを実行します。

4

A and Bを調べると、ATrueの場合にのみBが評価されます。

このように、A or Bでは、Bは、AFalseの場合にのみ評価されます。 <condition>Falseある場合<condition>TrueYある場合

したがって、<condition> and X or YXを返します。これは短絡の結果であり、andorよりも優先されていることが原因です。

ただし、この方法には注意が必要です。

X = 0 # or '' or [] 
Y = 2 

print(True and X or Y) 
>> 2 
0

トリックはどのようにpythonのである:に比べ

X = 1 
Y = 2 

print(True and X or Y) 
>> 1 

X自体が(例えば、空の文字列、リストや0Falseに評価されている場合、<condition> and X or Y<condition>True場合でもYを返します。ブール演算子work

x and yは最初にxを評価します。 xがfalseの場合、その値が返されます。それ以外の場合はyが評価され、結果の値が返されます。

x or yは、最初にxを評価します。 xが真の場合、その値が返されます。それ以外の場合はyが評価され、結果の値が返されます。

0

これは、andの優先度がorより高いという事実を利用しています。

したがって、<condition> and X or Yは、(<condition> and X) or Yです。 <condition> and XTrueと評価された場合は、True or YTrueであるため、さらに評価する必要はありません。 <condition> and XFalseと評価された場合、YはFalse or Yとして返されます。基本的にはYです。