3
True and "asdf" or "qwer"

結果 => "asdf"

False and "asdf" or "qwer"

結果 => "qwer"

それらがどのように機能するのか理解できません。文字列のブール演算子は型エラーになると思っていましたが、そうではありませんでした。たとえば、「a if b else c」などの事前定義されたステートメントのようなものですか?

4

6 に答える 6

5

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 が最後の操作である限り、答えが決定され、最後にスキャンされたものが返されます。

于 2013-06-03T04:16:03.647 に答える
3

andおなじみのブール演算子とor同じように機能します。オペランドの両方が true の場合は true を返し、オペランドの 1 つが true の場合は false をそれぞれ返します。

&&また、 と のように短絡し||ます。

ただし、Python では、何でもブール値コンテキストであると解釈できるためTrueFalse追加の事実があります。評価を停止するのに十分な情報がある場合、ブール値コンテキストで評価された、Trueまたは評価された最初のオペランドを返します。(これは、実際のブール値orFalseを構築して返すのとは対照的です。) ブール値が評価された場合、この事実がなければ返されたであろうブール値に評価されるため、これは問題ありません。TrueFalse

したがって(ブール値のコンテキストで""評価されることに注意してください):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
于 2013-06-03T03:50:01.167 に答える
2

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 

表示されている値にポップアップ表示される値を確認できます。また、ブール演算子の短絡動作を見て、これが文書化された動作であることを確認できます。

于 2013-06-03T04:18:14.537 に答える
0

最初の例
Python は、左から右にスキャンして評価します。

あなたの最初の例では

True and "asdf" or "qwer"

に評価されます

"asdf" or "qwer"

空でない文字列は True であるため、Python は短絡 (2 番目のオペランドを無視) し、最初のオペランドを返します"asdf"。の値に関係なく、RememberTrue or xが返されます。Truex

2 番目の例

False and "asdf" or "qwer"

これは次のように評価されます

False or "qwer"

今回は、最初のオペランドを短絡しません (まだ十分な情報がありません)。Python は、2 番目のオペランド をチェックする必要があります。これはブール値のコンテキストqwerで評価されTrue(空ではないことに注意してください)、それを返します。

于 2013-06-03T04:25:09.950 に答える
0

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 は最終結果を決定できないからです!

于 2013-06-03T04:00:41.823 に答える