これは、私が答えを見つけることができなかったかなり些細な質問です。
ここに問題があります。次の配列があります:
vals = [-5, 2]
そして、val[0]
またはval[1]
は0より大きいです。どちらかがtrueの場合、Trueを出力する必要があります。
私の当面の考えは使用することでした。 (vals[1] or vals[0]) > 0)
が見つかりました(5 | -2) > 0
はFalseであり、(5 or -2) > 0
はTrueです
明確化をいただければ幸いです。
or
と|
の違いは何ですか?or
は論理ORで、|
はビット単位または論理包含ORです。
論理またはin pythonは、真である最初の値を返します。
例:
>>> None or False or 5
5
>>> -5 or 2
-5
ビット単位または論理的な包含またはpythonの|
演算子によって表され、指定された少なくとも1つに設定されているすべてのビットが設定されている 数値を作成します数値 。
例:
0010
です0100
論理和または2つの間の結果は0110
で6になります。
>>> 2 | 4
6
負の数がどのように格納されるかは、一般的に実装固有です。ただし、ほとんどのシステムでは、各ビットを反転して1を加えることにより、正の数の 2の補数 を作成することにより、負の数が格納されます。
ビット単位の鉱石2のその数は、他の数でも負の数になります。
>>> -5 | 2
-5
どちらもあなたの問題を解決しません
使用中
(vals[1] or vals[0]) > 0
動作するようですが、値を反転すると失敗します:
>>> vals = [2, -5]
>>> (vals[1] or vals[0]) > 0
False
両方の値を別々にチェックする必要があります
>>> vals = [-5, 2]
>>> vals[0] > 0 or vals[1] > 0
True
入力が大きい場合、これは不便な場合があります。ジェネレータ式では any を使用する必要があります。
>>> any(x > 0 for x in vals)
True
any
関数が必要です:
>>> any(x > 0 for x in vals)
x | y
は2つの値のビット単位のOR
を計算しますが、x or y
は最初の「真の」値に評価されます。どちらの場合も、resultは0
:(x or y) > 0
および(x | y) > 0
と比較されます。
比較したいものeach値を(必要に応じて)0に、
vals[0] > 0 or vals[1] > 0
3つの値がある場合は、次のように記述します
vals[0] > 0 or vals[1] > 0 or vals[2] > 0
any
関数はこれを任意のサイズのリストに一般化します。リストのサイズに基づいてor
を一緒に使用する用語の数を決定する必要はありません。
この質問に答えるには、ツーの補数について説明する必要があります。
つまり、内部的には、5のような整数はバイナリ文字列として表されます。
00000000000000000000000000000101
負の数を表すとどう思いますか?
さて、これが私たちがしたいことです:
加算は負の数と正の数で同じように機能するはずです。つまり、4 + 9を4 + -9と追加する場合と同じ手順を実行します。
整数オーバーフローは数学を壊すべきではありません。つまり、MAX_VALUE + 1 == MIN_VALUE
、MIN_VALUE - 1 == MAX_VALUE
つまり、私たちが行うことは「2の補数」と呼ばれます。
負の数を表すには、その絶対値を取り、ビットごとにビットフリップして、1を加算します。
正の数が5の場合
00000000000000000000000000000101
負の数-5は
11111111111111111111111111111011
基本的に、これは01111111111111111111111111111111
は最大の正の数になり、その後のすべての数は負になります。
|
はビット単位のor演算子です。 2つの数値が与えられると、すべてのビットが取得され、それらがまとめられて、元の2つの数値のどちらかまたは両方のその位置の数字が1である場合、その数字は1であり、それ以外の場合は0である新しい数字が作成されます。計算は次のようになります。
5 -> 00000000000000000000000000000101
| -2 -> 11111111111111111111111111111110
---- --------------------------------
11111111111111111111111111111111 -> -1
ご覧のとおり、5 | -2 = -1 <0。
「or」演算子は、2つの値それらをブール値にキャストとorを一緒に取ります。これは重要です。値がないか、値である場合、「真の」最初の値を返します。つまり、ifステートメントに入れた場合、実行されます。
「真実」でない唯一の整数は0です。したがって、(5または-2)は、5と2の最初のゼロ以外の整数である5> 0を返します。したがって、5または-2 = 5> 0です。
|
は ビットごと ORであり、Pythonは整数に対して 2の補数 表現を使用します。5 | -2
を評価すると、次のようになります。
... 0000 0000 0000 0101 (+5)
| ... 1111 1111 1111 1110 (-2)
──────────────────────────────
= ... 1111 1111 1111 1111 (-1)
また、-1はゼロより大きくないため、(5 | -2) > 0
はfalseです。
or
は論理ORです。この演算子がブール(True/False)値を返す他の言語とは異なり、Pythonはx or y
をx if x else y
と同等であると定義します(xが1回だけ評価されることを除く) )Pythonではゼロ以外の数値はすべて「真実」であるため、x≠0の場合、x or y
はx
と評価されます。
>>> 5 or -2
5
>>> -2 or 5
-2
(5 or -2) > 0
がTrueと評価されるのは、最初に正の数を持つことから運がよかったことです。別の順序では、Falseになります。
一般に、(x or y) > 0
は、意図した(x > 0) or (y > 0)
とnotとではありません。
あなたがするとき(5 | -2)
、ビット単位のORを実行しています。これにより、数値の否定ビットが保持されます。したがって、まだ負の数になります。
(5 or -2)
は、Python=インタプリタがそれを次の論理演算子(より大)に拡張します)に対する論理ORです。
これらは2つのまったく異なる操作であるため、それは予想されます。
説明のために、ここに小さなシェルログがあります。
In [1]: 5 or -2
Out[1]: 5
In [2]: 5 | -2
Out[2]: -1
or
演算子は、最初のゼロ以外の値(非None
、非False
など)を返します。
|
演算子はビット単位のORを行います。説明する:
In [3]: bin(5)
Out[3]: '0b101'
In [4]: bin(-2)
Out[4]: '-0b10'
In [5]: bin(5 | -2)
Out[5]: '-0b1'