サーチ…


構文

  • != - 等しくない

  • == - 等しい

  • > - より大きい

  • < - より小さい

  • >= - より大きいか等しい

  • <= - 以下

  • is - オブジェクトがまったく同じオブジェクトであるかどうかをテストする

  • オブジェクトがまったく同じオブジェクトでない場合はテストしない

パラメーター

パラメータ詳細
バツ比較する最初の項目
y 比較する2番目の項目

より大きいまたはより小さい

x > y
x < y

これらの演算子は、2つのタイプの値を比較します。数字の場合、これは単純に数値を比較してどの数値が大きいかを比較します。

12 > 4
# True
12 < 4
# False
1 < 4
# True

文字列の場合、辞書順と似ていますが、アルファベット順と似ていますが、全く同じではありません。

"alpha" < "beta"
# True
"gamma" > "beta"
# True
"gamma" < "OMEGA"
# False

これらの比較では、小文字は大文字より大きいとみなされます。そのため、 "gamma" < "OMEGA"は偽です。それらがすべて大文字であった場合、期待されるアルファベット順の結果が返されます。

"GAMMA" < "OMEGA"
# True

それぞれの型は、 <>演算子を異なる方法で計算することを定義しているため、使用する前に演算子が特定の型を意味するものを調べる必要があります。

等しくない

x != y  

xyが等しくない場合はTrue返し、そうでない場合はFalse返します。

12 != 1
# True
12 != '12'
# True
'12' != '12'
# False

に等しい

x == y 

この式は、 xyが同じ値であるかどうかを評価し、結果をブール値として返します。一般的に、型と値の両方が一致する必要があります。したがって、int 12は文字列'12'と同じではありません。

12 == 12
# True
12 == 1
# False
'12' == '12'
# True
'spam' == 'spam'
# True
'spam' == 'spam '
# False
'12' == 12
# False

各タイプは、2つの値が同じかどうかを評価するために使用される関数を定義しなければならないことに注意してください。組み込み型の場合、これらの関数は期待どおりに動作し、同じ値に基づいて物を評価するだけです。しかし、カスタム型では、いつでもTrueを返すか、常にFalse返すなど、同等性テストを好きなものとして定義できます。

チェーンの比較

チェーン比較を使用して、複数の比較演算子で複数のアイテムを比較できます。例えば

x > y > z

次の短い形式です:

x > y and y > z

両方の比較がTrue場合にのみTrueと評価されTrue

一般的な形式は次のとおりです。

a OP b OP c OP d ...

OPは、使用できる複数の比較演算の1つを表し、文字は任意の有効な式を表します。

0 != 1 != 0は、 0 != 0Falseであっても、 Trueと評価されることに注意してください。 x != y != zの一般的な数学的記法とは異なり、 xyzは異なる値を持ちます。等価性は一般に推移的であるため、連鎖==演算は自然な意味をもっています。

スタイル

適切な構文がある限り、使用するアイテムと比較操作の数には理論上の制限はありません。

1 > -1 < 2 > 0.5 < 100 != 24

各比較がTrue返す場合、上記はTrue返しTrue 。しかし、複雑な連鎖を使用するのは良いスタイルではありません。良い連鎖は "方向性"であり、より複雑ではありません。

1 > x > -4 > y != 8

副作用

すぐに1つの比較を返すようFalse 、式はすぐに評価されるFalse残りのすべての比較をスキップし、。

a > exp > bの式expは1回だけ評価されるが、

a > exp and exp > b

expあれば二度計算されますa > exp真です。

`is`vs` == `との比較

よくある落とし穴は、等価比較演算子を混乱されis==

a == bの値を比較し、 a b

a is babb 同一性を比較する。

説明する:

a = 'Python is fun!'
b = 'Python is fun!'
a == b # returns True
a is b # returns False

a = [1, 2, 3, 4, 5]
b = a      # b references a
a == b     # True
a is b     # True
b = a[:]   # b now references a copy of a
a == b     # True
a is b     # False [!!]

基本的にisid(a) == id(b)省略形と考えることisできます。

これを超えると、ランタイム環境の不具合がさらに複雑になります。短い文字列と小さい整数は、Pythonマシンが同じオブジェクトに対してより少ないメモリを使用しようとしているため、 isと比較するとTrueを返します。

a = 'short'
b = 'short'
c = 5
d = 5
a is b # True
c is d # True

しかし、長い文字列と大きな整数は別々に格納されます。

a = 'not so short'
b = 'not so short'
c = 1000
d = 1000
a is b # False
c is d # False

あなたは使用すべきisためにテストすることNone

if myvar is not None:
    # not None
    pass
if myvar is None:
    # None
    pass

利用is 「センチネル」(すなわち固有のオブジェクト)をテストすることです。

sentinel = object()
def myfunc(var=sentinel):
    if var is sentinel:
        # value wasn’t provided
        pass
    else:
        # value was provided
        pass

オブジェクトの比較

カスタムクラスの平等を比較するために、 __eq____ne__メソッドを定義することによって、 ==!=オーバーライドできます。あなたはまた、上書きすることができ__lt__< )、 __le__<= __gt__> )、および__ge__> )。 2つの比較メソッドをオーバーライドするだけで済むことに注意してください==は残りの部分を処理できます( ==not <not >などと同じです)

class Foo(object):
    def __init__(self, item):
        self.my_item = item
    def __eq__(self, other):
        return self.my_item == other.my_item
    
a = Foo(5)
b = Foo(5)
a == b     # True
a != b     # False
a is b     # False

この単純比較では、 other (比較対象の)オブジェクトが同じオブジェクト型であることが前提です。別のタイプと比較するとエラーが発生します:

class Bar(object):
    def __init__(self, item):
        self.other_item = item
    def __eq__(self, other):
        return self.other_item == other.other_item
    def __ne__(self, other):
        return self.other_item != other.other_item
    
c = Bar(5)
a == c    # throws AttributeError: 'Foo' object has no attribute 'other_item'

isinstance()やそれに類するものをチェックすることで、これを防ぐことができます(必要な場合)。

Common Gotcha:Pythonはタイピングを強制しません

他の多くの言語では、次のように実行すると(Javaの例)

if("asgdsrf" == 0) {
    //do stuff
}

...あなたはエラーが発生します。そのような文字列を単に整数と比較することはできません。 Pythonでは、これは完全に合法文です-それだけに解決ますFalse

よくある落とし穴は次のとおりです

myVariable = "1"
if 1 == myVariable:
    #do stuff

この比較は、毎回エラーなしにFalse評価され、潜在的にバグを隠すか、条件を破る可能性があります。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow