True and "asdf" or "qwer"
結果 => "asdf"
False and "asdf" or "qwer"
結果 => "qwer"
それらがどのように機能するのか理解できません。文字列のブール演算子は型エラーになると思っていましたが、そうではありませんでした。たとえば、「a if b else c」などの事前定義されたステートメントのようなものですか?
True and "asdf" or "qwer"
結果 => "asdf"
False and "asdf" or "qwer"
結果 => "qwer"
それらがどのように機能するのか理解できません。文字列のブール演算子は型エラーになると思っていましたが、そうではありませんでした。たとえば、「a if b else c」などの事前定義されたステートメントのようなものですか?
Python and and or操作は、答えが決定されると停止し、最後にスキャンされたオブジェクトの値を返します。TrueまたはFalseを返しません。私はこの機能が大好きで、いつも使っています。
空でない文字列は True としてカウントされるため
True and "asdf" or absolutely_anything_here_or_following
orにヒットすると計算を停止します。これは、答えが決定されたため (またはの値の 1 つが true)、最後にチェックしたもの ("asdf") を返します。それ以上のオペランドは検査されません。
一方、いつ
False and "asdf" or absolutely_anything_here
orにヒットすると、答えはまだわからないので、次のオペランドに進みます。absolute_anything_here が最後の操作である限り、答えが決定され、最後にスキャンされたものが返されます。
and
おなじみのブール演算子とor
同じように機能します。オペランドの両方が true の場合は true を返し、オペランドの 1 つが true の場合は false をそれぞれ返します。
&&
また、 と のように短絡し||
ます。
ただし、Python では、何でもブール値コンテキストであると解釈できるためTrue
、False
追加の事実があります。評価を停止するのに十分な情報がある場合、ブール値コンテキストで評価された、True
または評価された最初のオペランドを返します。(これは、実際のブール値orFalse
を構築して返すのとは対照的です。) ブール値が評価された場合、この事実がなければ返されたであろうブール値に評価されるため、これは問題ありません。True
False
したがって(ブール値のコンテキストで""
評価されることに注意してください):False
>>> "" and "a"
''
>>> "a" and "b"
'b'
>>> "a" and ""
''
>>>
>>> "" or ""
''
>>> "a" or ""
'a'
>>> "" or "a"
'a'
>>> "a" or "b"
'a'
>>> "" or False
False
>>> "" or True
True
>>> False and ""
False
Python 条件演算子の前:
>>> age=20
>>> 'legal' if age>=21 else 'not legal'
'not legal'
以前は、タプルのインデックスに基づく回避策として「貨物コード」がありました。
>>> ('not legal','legal')[age>=21]
'not legal'
>>> age=22
>>> ('not legal','legal')[age>=21]
'legal'
投稿した 2 つの代替案を逆アセンブルして、内部で何が起こっているかを確認できます。
>>> import dis
>>> def f():
... x=True and "asdf" or "qwer"
... y=False and "asdf" or "qwer"
...
>>> dis.dis(f)
2 0 LOAD_GLOBAL 0 (True)
3 POP_JUMP_IF_FALSE 12
6 LOAD_CONST 1 ('asdf')
9 JUMP_IF_TRUE_OR_POP 15
>> 12 LOAD_CONST 2 ('qwer')
>> 15 STORE_FAST 0 (x)
3 18 LOAD_GLOBAL 1 (False)
21 POP_JUMP_IF_FALSE 30
24 LOAD_CONST 1 ('asdf')
27 JUMP_IF_TRUE_OR_POP 33
>> 30 LOAD_CONST 2 ('qwer')
>> 33 STORE_FAST 1 (y)
36 LOAD_CONST 0 (None)
39 RETURN_VALUE
表示されている値にポップアップ表示される値を確認できます。また、ブール演算子の短絡動作を見て、これが文書化された動作であることを確認できます。
最初の例
Python は、左から右にスキャンして評価します。
あなたの最初の例では
True and "asdf" or "qwer"
に評価されます
"asdf" or "qwer"
空でない文字列は True であるため、Python は短絡 (2 番目のオペランドを無視) し、最初のオペランドを返します"asdf"
。の値に関係なく、RememberTrue or x
が返されます。True
x
2 番目の例
False and "asdf" or "qwer"
これは次のように評価されます
False or "qwer"
今回は、最初のオペランドを短絡しません (まだ十分な情報がありません)。Python は、2 番目のオペランド をチェックする必要があります。これはブール値のコンテキストqwer
で評価されTrue
(空ではないことに注意してください)、それを返します。
Python のオブジェクトは True または False (like, '', None) と見なされます
ブール結果の結果は、結果を決定できる最後の値に依存します。
print 'aa' と True
真実
'aa' は True ですが、結果を判断できないため、結果は True になります
その間
print True and 'aa'
「ああ」
ただし、演算子 or は演算子 and とは異なります。
print None and True
なし
最初の None は False と見なされ、最後の結果を決定できるため、「None」を出力します
その間
print False or 'bb'
'bb'
最初の False は最終結果を決定できないからです!