メモ代わり。てきとーに。 いや、ですからてきとーですって。 2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。

2008年2月1日金曜日

[Python][お勉強] Python入門(12) - 比較

比較をやる。


Pythonでは全てのオブジェクトは比較できる。どちらが「大きいか」「同等か」を判定できる。

==演算子
オブジェクトが同等のものであるかどうかを比較する。
まったく同じメモリ領域にあるかどうかではなく、オブジェクトの保持する値が等しいかどうかを比較する。

is演算子
オブジェクトが同一かどうかを比較する。
まったく同じメモリ領域にあるかどうかを比較する。

さっそく上記2つの演算子をやってみる。


>>> L1 = [1, ('1', 3)]
>>> L2 = [1, ('1', 3)]
>>> L1 == L2
True
>>> L1 is L2
False
>>>

L1とL2の値は「同等」だが別メモリ領域に確保されているので「同一」ではない。
==演算子での場合は「同等」かどうかを比較する。比較結果はTrue。
is演算子での場合は「同一」かどうかを比較する。比較結果はFalse。


>>> L1 = [1, ('1', 3)]
>>> L2 = L1
>>> L1 == L2
True
>>> L1 is L2
True
>>>

今度はL1を生成後リファレンスをL2に代入した。
この場合L1とL2は「同一」となる。よって、L1 == L2はTrueを返しL1 is L2もTrueを返す。



>>> S1 = 'spam'
>>> S2 = 'spam'
>>> S1 == S2
True
>>> S1 is S2
True
>>>

文字列の場合は少々状況が違う。短い文字列の場合Pythonにキャッシュされて、そのキャッシュされた内容が再利用される。そのため上記は「同一」と判定される。文字列はimmutableであるから特に問題はないがキャッシュさせたくない場合は長い文字列を生成してやればよい。

>>> S1 = 'a longer string'
>>> S2 = 'a longer string'
>>> S1 == S2
True
>>> S1 is S2
False
>>>



<演算子
左辺が右辺よりも小さいかどうかを判定する。小さい場合にはTrueを返す。両辺にリスト、ディクショナリを指定した場合はそのオブジェクトの全要素が走査、比較される。

>>> 1 <>>> 2 <>>> L1 = [1, (2, 3)]
>>> L2 = [1, (2, 1)]
>>> L1 == L2
False
>>> L1 <>>> L2 <>>>




>演算子
左辺が右辺よりも大きいかどうかを判定する。大きい場合にはTrueを返す。リスト、ディクショナリを辺に指定した場合には全要素が走査対象となる。

>>> 1 > 2
False
>>> 2 > 1
True
>>> L1 = [1, (2, 3)]
>>> L2 = [1, (2, 1)]
>>> L1 > L2
True
>>> L2 > L1
False
>>>




True/False
PythonにはTrueとFalseというブール型オブジェクトがある。
何かが真のときはTrueで偽のときはFalse。また、プログラム中ではTrueは1、Falseは0に評価される。

>>> 1 + True
2
>>> 3 + True
4
>>> 3 + False
3
>>>





どのような場合にTrueか。どのような場合にFalseか。
どのような場合にTrueと評価され、どのような場合にFalseと評価されるかをみていく。
基本的には以下のとおり。
  • 数値の場合0で無ければTrue
  • その他のオブジェクトは空でなければTrue
  • NoneオブジェクトはFalse
NoneオブジェクトはCで言うところのNULLにあたるもの。

例を表に記す。


オブジェクトtrueかfalseか
"spam"True
""False
[]False
{}False
1True
0.0False
NoneFalse



型ごとの比較ルール
  • 数値の場合は大きさが単純に比較される
  • 文字列の場合は文字1つ1つについて比較され、アルファベット順で後のものほど「大きい」と判定される。
  • リスト、タプルの場合、左から順に1つ1つ比較される。
  • ディクショナリの場合はキーと値のリストとしてソートされ、1要素づつ比較される。

おしまい。




.

0 コメント: