Python Language
比較
サーチ…
構文
!= - 等しくない
== - 等しい
>
- より大きい<
- より小さい>=
- より大きいか等しい<=
- 以下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
x
とy
が等しくない場合はTrue
返し、そうでない場合はFalse
返します。
12 != 1
# True
12 != '12'
# True
'12' != '12'
# False
に等しい
x == y
この式は、 x
とy
が同じ値であるかどうかを評価し、結果をブール値として返します。一般的に、型と値の両方が一致する必要があります。したがって、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 != 0
がFalse
であっても、True
と評価されることに注意してください。x != y != z
の一般的な数学的記法とは異なり、x
、y
、z
は異なる値を持ちます。等価性は一般に推移的であるため、連鎖==
演算は自然な意味をもっています。
スタイル
適切な構文がある限り、使用するアイテムと比較操作の数には理論上の制限はありません。
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 b
でa
、 b
とb
同一性を比較する。
説明する:
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 [!!]
基本的にis
、 id(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
評価され、潜在的にバグを隠すか、条件を破る可能性があります。