今日他の人のコードを見ていてこんな書き方を見つけて、踏み込みやすい落とし穴だと感じたので
Pythonで論理演算を行う際にデフォルトで使用される ショートサーキットロジックと呼ばれる演算ルールです。
print True and 1 # 1 print True or 1 # True print False and 1 # False print False or 1 # 1
のコードを直接見ると、それがわかります。 式全体の計算結果はブール値である必要はありません。上記の式のさまざまな結果は、Python で簡単に言うと、短絡ロジックです。式全体が True か False かを判断すると、後続の計算は実行されません。これは、ロジックが短絡され、後続の式が無視されることを意味します。たとえば、True または 1</code の結果です。 > は <code>True
です。 か
かは関係ありません。その後に値がある場合、式全体の結果は True でなければなりません。そのため、Python が True を認識すると、
を実行し、or
を参照すると、次の 1 は表示されず、1 は短絡され、True
が返されます。 についても同様です。 >False と 1
。False
と and
が表示されます。式全体の結果は False
でなければなりません。したがって、1 は短絡され、False
が返されます
同様に、False または 1</ code> は、<code>False
と < であるため、1 を返します。 code>or では式全体の結果を判断できません。式全体が True か False かは、or
によって決まります。そのため、Python は式全体を読み取る必要があります。なので、1 が返されます。True or 1
的结果为True
就是因为不管or
后面是任何值, 整个式子的结果都必定是True, 所以Python看到True
, 看到or
, 后面的1就不看了, 1被短路了, 返回了True
; 同样的False and 1
也是一样, 看到False
然后是and
不管后面是什么, 整个式子的结果必定是False
, 所以1被短路了, 返回False
.
相应的, 为什么False or 1
会返回1, 就是因为False
和or
判断不了式子的结果, 整个式子是True还是False, 是由or
后面的值来决定的, 所以Python要把整个式子看完, 所以返回1.
明白了什么是短路逻辑之后, 我们看一看三目运算符
三目运算符, 又叫三元运算符. 熟悉Java的同学可能会知道, 它的形式是这样的b?x:y
, 对于这个表达式来说, 如果条件b
为True
, 那表达式的结果就是x
, 如果b
为False
, 那表达式的结果就是y
. 这是一种很方便的写法, 比if语句简洁很多.
但Python中早期没有类似写法的三目运算符, 所以就出现了一种利用短路逻辑, 用and
和or
来模拟三目运算符的写法, 下面我们看代码
A = X and 'table' or False
这句代码就是在利用短路逻辑模拟三目运算符, 当X
为True
的时候, A
会被赋值为'table'
, 当X
为Flase
的时候, A
会被赋值为False
;
乍一看好像很不错, 但这种写法却有个坑, 我们看这句代码
True and 0 or 1
如果我们把刚才的写法当三目运算符来使用, 那么条件语句是True
, 表达式应该返回0
才是我们期望的结果, 但实际上这个表达式会返回1
; 因为True and 0
的值为True
, 整个表达式的值是由or
之后的值来决定的, 所以Python会对后面的值做判断, 导致返回了1
, 这就是为什么and...or
这个写法有坑的原因
如果想在Python中使用三目运算符, 可以使用if...<a href="http://www.php.cn/wiki/111.html" target="_blank">else</a>
写法, 具体看代码
# <为真时的结果> if <判定条件> else <为假时的结果>0 if True else 1
用if...else
的写法, 结果就会跟我们期望的相同, 当条件为True
时, 返回前面的值, 条件为False
b?x:y
のようなものであることを認識している可能性があります。たとえば、条件 b
が True
の場合、式の結果は x
で、b
が False
の場合、式の結果は y
になります。これは、if よりも優れた非常に便利な記述方法です🎜ステートメントははるかに単純です。🎜🎜しかし、 Python の初期には、同様の三項演算子がなかったため、and
を使用する短絡ロジックを使用する方法があり、or
は次の記述をシミュレートするために使用されます。以下のコードを見てみましょう🎜rrreee🎜 このコードは、X
が True
の場合、AX
が Flase
の場合、 /code> は 'table'
に割り当てられます。 上記の書き方を三項演算子として使用すると、次のようになります。条件文は True
であり、式は期待される結果である 0
を返すはずですが、実際にはこの式は 1
を返します。 True および 0
の値は True
であるため、式全体の値は によって決定されます。または
はその後の値によって決定されます。 Python はその後の値を判断して 1
を返します。これが、and...or
の書き方が難しい理由です。理由🎜🎜正しい書き方🎜🎜。 Python で三項演算子を使用したい場合は、if...<a href="http://www.php.cn/wiki/111.html" target="_blank">else を使用できます🎜 </a>
、if...else
を使用してコード 🎜rrreee🎜 を見てください。条件が True
の場合、結果は期待どおりになります。 、前の値を返し、条件が False
の場合は後の値を返します。落とし穴はありませんが、条件と戻り値の順序に注意して書く必要があります。 Java と同じです。三項演算子は異なります。間違えないでください🎜以上がPython三項計算機の使い方と短絡論理手法の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。