基本的なPythonのセマンティクス:演算子
前の節で、Pythonの変数とオブジェクトのセマンティクスを見始めました。ここで、言語に含まれる様々な演算子のセマンティクスを掘り下げましょう。この節の最後までには、Pythonにおいてデータを比較して操作することをはじめるための基本的なツールを得られる出そう。
算術演算子
Pythonは7つの基本的な二項演算子を実装していて、うち二つは単項演算子として二重になります。以下の表にまとめられます。
Operator Name Description
a + b Addition Sum of a and b
a - b Subtraction Difference of a and b
a * b Multiplication Product of a and b
a / b True division Quotient of a and b
a // b Floor division Quotient of a and b, removing fractional parts
a % b Modulus Integer remainder after division of a by b
a ** b Exponentiation a raised to the power of b
-a Negation The negative of a
+a Unary plus a unchanged (rarely used)
これらの演算子は、演算をグループ分けする標準的な括弧を使って、直感的な方法で使われ結合されます、
In [1]:
# addition, subtraction, multiplication
(4 + 8) * (6.5 - 3)
Out[1]:
42.0
切り捨て除算は、断片的な部分が捨てられる本当の除算です。
In [2]:
# True division
print(11 / 2)
5.5
In [3]:
# Floor division
print(11 // 2)
5
"The floor division"演算子は、Python3で加えられました。Python2で動かすと、/演算子が整数部に対する切り捨て除算のように実行され、浮動小数点数に対して本当の除算が実行されることがわかるでしょう。
さて、Python3.5で追加された8番目の算出演算子について言及しましょう。aとbの行列積を示すために意味を持つ"a @ b"演算子で、様々な線形代数のパッケージで使われます。
ビット単位の演算
標準的な数値演算に加えて、Pythonは数値に対するビット演算の論理的な操作を行う演算子を含みます。一般的に使われる標準的な算出演算よりもはるかに少ないですが、存在を知っていることは役に立ちます。6個のビット演算しは以下の表にまとめられます。
Operator Name Description
a & b Bitwise AND Bits defined in both a and b
a | b Bitwise OR Bits defined in a or b or both
a ^ b Bitwise XOR Bits defined in a or b but not both
a << b Bit shift left Shift bits of a left by b units
a >> b Bit shift right Shift bits of a right by b units
~a Bitwise NOT Bitwise negation of a
これらのビット演算子は、唯一二進の数値表現という点において意味をなします、組み込みのbit関数を使うのをみてみましょう:
In [4]:
bin(10)
Out[4]:
'0b1010'
この結果は'0b'で接頭されています、これはバイナリ表現を示すものです。数値の残りの部分は10という数が、12^3+02^2+12^1+02^0 の総計として表現されていることを示しています。似たように、このように書けます:
In [5]:
bin(4)
Out[5]:
'0b100'
さて、ORビット演算を使い、4と10のビットを結合した数を見つけましょう:
In [6]:
4 | 10
Out[6]:
14
In [7]:
bin(4 | 10)
Out[7]:
'0b1110'
これらのビット演算子は標準的な算出演算子のようにはすぐには役に立たないですが、一度それらが行う演算のクラスを理解するために少なくとも一度はわかることは役に立つでしょう。
特に、他の言語からのユーザはときどき、本当は累乗(すなわち、a ** b)を意味するときに、XOR(すなわち、a^b)を使いたくなります。
演算の割り当て
"="演算子で変数が割り当てられて、値があとの利用で貯められることをみてきました。例えば、
In [8]:
a = 24
print(a)
24
前に言及したどの演算子についてもこれらの変数は使うことができます。例えば、aに2を足すために書きましょう:
In [9]:
a + 2
Out[9]:
26
この新しい値をもった変数aを更新したいかもしれません、この場合 追加と代入を結び付けて、a = a + 2 をかけます。なぜならこの種の結合演算と代入はとても共通したもので、Pythonは、すべての算術演算子のために、組み込みの更新の演算子を含んでいるためです。
In [10]:
a += 2 # equivalent to a = a + 2
print(a)
26
先に一覧した各バイナリ演算子に一致する累算代入演算子があります、つまり、それらが:
a += b a -= b a *= b a /= b
a //= b a %= b a **= b a &= b
a |= b a ^= b a <<= b a >>= b
それぞれは、代入によって続く一致する演算と同等です:すなわち、任意の演算子 "■"は、a ■= b という表現が 、わずかにちがいますが、a = a ■ b と同等です。リストや配列、DataFrameのように変更可能なオブジェクトについて、これら累算代入演算子は実際には、より冗長な片方よりも微妙に違います、それれは結果をためる新しいオブジェクトを作るよりもむしろ元々のオブジェクトの中身を変更します。
演算の比較
とても使いやすい他の型の演算は、異なった値の比較です。これまで、Pythonは標準的な比較演算子を実装しています、それはTrueかFalseの真偽値を返します。比較演算は、次の表に一覧されます。
Operation Description Operation Description
a == b a equal to b a != b a not equal to b
a < b a less than b a > b a greater than b
a <= b a less than or equal to b a >= b a greater than or equal to b
これらの比較演算子は、実質的に数値のためのテスト範囲に制限のないことを表現するための算術とビット演算子と結ばれます。例えば、2で1を返す係数をチェックすることによってある数が奇数かどうかをチェックできます。
In [11]:
# 25 is odd
25 % 2 == 1
Out[11]:
True
In [12]:
# 66 is odd
66 % 2 == 1
Out[12]:
False
より複雑な関係を調べるために、複数の比較をつなぎ合わせることができます:
In [13]:
# check if a is between 15 and 30
a = 25
15 < a < 30
Out[13]:
True
そして、ただあなたの頭をちょっと痛くするために、この比較をみてみましょう:
In [14]:
-1 == ~0
Out[14]:
True
~はビット反転の演算子だということを思い出してみましょう、そして、明らかに0のすべてのビットを反転するとき、-1になりました。もしあなたがこの理由について興味をもつなら、二つの補完の整数符号方式をみてみましょう、それはPythonが符号整数をエンコードするために使うもので、このようにエンコードされた整数のすべてのビットを反転しはじめるとき、何が起こるかについてかんがえましょう。
ブール演算
ブール値が動作するとき、Pythonはandやor,notといった標準的なものを使って値を結び付けるための演算子を提供します。予想できるように、これらの演算子は andやor,notという単語を使って表現されます。
In [15]:
x = 4
(x < 6) and (x > 2)
Out[15]:
True
In [16]:
(x > 10) or (x % 2 == 0)
Out[16]:
True
In [17]:
not (x < 6)
Out[17]:
False
ブール代数のファンは、XOR演算子は含まれないことに気づくかもしれない。これはもちろん他の演算子を使った複合の命令文からいくつかの方法で構築できる、ブール値のXORのために使えるより賢い方法は次のものです。
In [18]:
# (x > 1) xor (x < 10)
(x > 1) != (x < 10)
Out[18]:
False
これらのブール演算は条件やループのような制御構造文を話しはじめたときより極端に使いやすくなってます。我々がときどき言語について困惑することは、and, or, notなどのブール演算子を使うときや&, |, ~といったビット演算を使うときです。それらの名前の中に答えがあります、つまりブール演算子は全体の命令文の中ですなわち真か偽というブール値を計算したいときに使われます。
ビット演算は、よくわからないオブジェクトの独立したビットやコンポーネントで操作したいときに使われるべきです。
同一性とメンバ演算子
or, and, notのように、Pythonはまた同一性とメンバをチェックするための散文のような演算子を含んでいます。次のものです:
Operator Description
a is b True if a and b are identical objects
a is not b True if a and b are not identical objects
a in b True if a is a member of b
a not in b True if a is not a member of b
同一性演算: "is"と"is not"
"is"と"is not"といった同一性の演算はオブジェクトの同一性を調べます。オブジェクトの同一性は、ひとしいかよりも異なっているかです、ここでみてみましょう:
In [19]:
a = [1, 2, 3]
b = [1, 2, 3]
In [20]:
a == b
Out[20]:
True
In [21]:
a is b
Out[21]:
False
In [22]:
a is not b
Out[22]:
True
同一オブジェクトのようになりましたか?ここに一つの例を:
In [23]:
a = [1, 2, 3]
b = a
a is b
Out[23]:
True
この二つの場合の違いは、aとbが違うオブジェクトを指すのが最初で、同じオブジェクトを指すのが二つ目です。前の節で見たように、Python変数はポインタを指しています。"is"演算子は、コンテナに含まれるものを参照するよりもむしろ、二つの変数が同じコンテナ(オブジェクト)を指しているかどうかをチェックします。これを念頭においた上で、たいていの場合、初心者は、本当は"=="を意味することで、"is"を使いやすいです。
メンバ演算子
メンバ演算子は複合のオブジェクトの中の一員であるかをチェックします。そうですね、例えば、こう書きます:
In [24]:
1 in [1, 2, 3]
Out[24]:
True
In [25]:
2 not in [1, 2, 3]
Out[25]:
False
これらのメンバ演算子は、PythonがCのような低級言語と比較してとても使いやすくさせる例です。Cでは、メンバは一般的にリストを網羅するループを手動で作ってそれぞれの値をの等しさを調べることによって決まります。Pythonでは、まっすぐそのままの英語の散文を思わせて、あなたが知りたいことを単にタイプします。