home changes contents help options

002:演算子

Python の演算子には次のものがあります。

二項演算子

「1 + 2」 における「+」のように 2 つの式をとる演算子です。数が多く、またそれぞれの結合優先順位もまちまちです。たとえば、 「1 << 2 ** 3」 は 「(1 << 2) ** 3 = 4 ** 3 = 64」 ではなく 「1 << (2 ** 3) = 1 << 8 = 256」 です。各演算子間の 優先順位 について迷ったときは ( ) にて期待する動作を明示するようにしてください。

算術演算子

「+」「-」は加算的演算子、その他は乗算的演算子です。日常における算数と同様、乗算的演算子のほうが 優先順位 が高くなっています。「1 + 2 * 3」は「1 + (2 * 3) = 7」です。

+
加算を行います。「1 + 2」は「3」となります。
-
減算を行います。「3 - 2」は「1」となります。
*
乗算を行います。「2 * 3」は「6」となります。
/
除算を行います。「6 / 3」は「2」となります。「5.0 / 2.0」は「2.5」となります。整数同士の除算は過渡期にあり、 Python のバージョンにより動作が異なります。 Python 2 系では、小数点以下は切り捨てられ整数が返ります。つまり「3 / 2」は「1」です。 Python 3.0 以降では、整数同士の除算でも切り捨てが起こりません。この新しい除算による「3 / 2」は「1.5」となります。なお、 Python 2.2 以降ならば「from __future__ import division」を実行することで、この新しい除算を使用することができます。
//
切り捨て除算を行います。「6 // 3」は「2」、「3 // 2」は「1」となります。「5.0 // 2.0」は「2.0」となります。
%
剰余を求めます。「3 % 3」は「0」、「4 % 3」は「1」、「5 % 3」は「2」となります。

演算子の話からは逸れてしまいますが、切り捨て除算による商と剰余を両方求めるための組み込み関数 divmod が存在するのでここで紹介します。 「divmod(5, 3)」は「(5//3, 5 % 3)」と同義であり、「(1, 2)」となります

べき乗演算子

他の二項演算子より 優先順位 が高いです。

**
べき乗計算を行います。「10 ** 2」は「100」となります。

シフト演算子

算術演算子より 優先順位 が低いです。

<<
整数に対し左シフト演算を行います。「1 << 1」は「2」、「1 << 2」は「4」となります。整数の左側ビットは無限に続いているものとみなされており、オーバーフローは起こりません。実は pow(2,n) による乗算と同義です。「1 << 31」は「2147483648」、「-1 << 32」は「-4294967296」です。
>>
整数に対し右シフト演算を行います。「4 >> 1」は「2」、「4 >> 2」は「1」となります。末端のビットは捨てられます。実は pow(2,n) による除算と同義です。「4 >> 3」は「0」となります。

ビット演算子

シフト演算子より 優先順位 が低いです。各ビット演算子は優先順位が同等ではありません。強い順に並べると &, ^, | となります。「1 | 4 & 6」は「1 | (4 & 6) = 5」です。

&
整数同士のビット単位 AND を求めます。「0b1100 & 0b1010 (12&10)」は「0b1000 (8)」となります。
^
整数同士のビット単位 XOR を求めます。「0b1100 ^ 0b1010 (12^10)」は「0b0110 (6)」となります。
|
整数同士のビット単位 OR を求めます。「0b1100 | 0b1010 (12|10)」は「0b1110 (14)」となります。

比較演算子

比較演算子は並べることができる点が C 言語などとの違いです。「1 < 2 < 3」が構文エラーではなく「True」になります。 優先順位 は算術演算子、シフト演算子、ビット演算子らより低くなっています。型によって比較に用いられる規則はまちまちです。詳しくはリファレンスを参照してください。

<
値がより小さいか調べます。「1 < 2」は「True」、「1 < 1」は「False」となります。
>
値がより大きいか調べます。「1 > 2」は「False」、「1 > 1」は「False」となります
==
値が等しいか調べます。「1 == 2」は「False」、「1 == 1」は「True」となります。
>=
値が以下か調べます。「1 <= 2」は「True」、「1 <= 1」は「True」となります。
<=
値が以上か調べます。「1 >= 2」は「False」、「1 >= 1」は「True」となります
!=
値が等しくないか調べます。「1 != 2」は「True」、「1 != 1」は「False」となります。

同一性のテストを行う次の演算子は優先順位が低くなっています。

is
オブジェクトの同一性を調べます。「==」とは異なります。「==」は同値性を調べるものです。
not is
is 演算子の逆です。

メンバシップのテストを行う次の演算子はさらに優先順位が低くなっています。

in
ある集合(リストなど)の要素であるか調べます。「1 in [1, 2, 3]?」は「True」となります。
not in
ある集合(リストなど)の要素でないか調べます。「1 not in [1, 2, 3]?」は「False」となります。

論理演算子

Python の論理演算子は短絡評価を行い、最後に評価した値を返します。比較演算子より 優先順位 が低いです。Ruby などに存在する「&&」、「||」は存在しないので注意してください。

and
論理積を求めます。「1(真) and 2(真)」は「2(真)」、「0(偽) and 1(真)」は「0(偽)」となります。
or
論理和を求めます。「1(真) or 2(真)」は「1(真)」、「0(偽) or 1(真)」は「1(真)」となります。

単項演算子

「-1」の「-」のようにひとつの式の前におかれる演算子です。

単項算術演算子

+
引数を変更しません。
-
引数の符号を反転します。
~
値をビット単位反転します。

論理演算子

not
引数が偽である場合は「True」を、それ以外の場合は「False」を返します。

その他

lambda arguments: expression
lambda は無名関数を作成する省略記法です。
x if C else y
C や Ruby における条件演算子「C ? x : y」の代わりとなるものです。条件 C が真であれば x が、偽であれば y が返ります。 Python 2.5 にて追加されました。
x.attribute
「.」はオブジェクトの属性を参照します。 object.attribute という使い方をします。
x[index]?
添字表記です。リスト、辞書、文字列などから要素を 1 つ取り出します。
x[start:stop(:step)]?
スライス表記です。リスト、辞書、文字列などにおけるある範囲を選択します。
f(arguments...)
関数、メソッドなどの呼び出し可能オブジェクトを呼び出します。
(expressions...)
内容にカンマが含まれればタプルを表現します。「(x for x in sequence)」といった形式ならばジェネレータ式です。これはジェネレータ関数の省略記法です。それ以外の場合、中の式そのものを表します。「1 * (2 + 3)」といった演算順序の強制指定に使用されているものです。
[expressions...]?
リストを表します。
{key: datum...}
辞書を表します。

特殊メソッド名

自作クラスの作成の際、特殊な名前をもったメソッドを定義することで、特定の演算子に対応する動作を実装することができます。たとえば a, b をともに __add__ メソッドを持っているインスタンスとすると、 a + b は a.__add__(b) と同義となります。詳しくは リファレンスマニュアル 3.4 特殊メソッド名 を参照してください。

参考資料

リファレンスマニュアル 5. 式 (expression) 。各演算子の 優先順位 の一覧もあります。