見出し画像

Python勉強記(5)- 演算子


演算子

Pythonの演算子一覧。

+ - * ** / // % @ << >> & | ^ ~ := < > <= >= == !=
+= -= *= /= //= %= @= &= |= ^= >>= <<= **=

https://docs.python.org/ja/3/reference/lexical_analysis.html#operators

他のプログラミング言語と共通する要素とそうでない要素があります。

二列目にある要素は公式ドキュメントの「演算子」セクションの「トークン」には含まれていますが、一般的なプログラミング言語では演算子として扱われるため、リストに加えました。
(演算と代入を組み合わせたものは累積代入演算子です)

また、論理演算子が見当たりません。
Pythonでは、これらはand, or, notなどのキーワードとして存在します。

文字列

文字列を連結するには '+' を使用します。

>>> a = "Hello"
>>> a = a + ",world"
>>> a
'Hello,world'

上記のように、同じ変数に対する連結は「+=」という累積代入演算子を使用することで、より簡潔に記述できます。

>>> a = "Hello"
>>> a += ",world"
>>> a
'Hello,world'

演算とは異なりますが、文字列から特定の部分を抽出するには「[]」や「[:]」を用います。この処理をスライスと呼びます。

>>> a
'Hello,world'
>>> a[0] # 先頭の文字
'H'
>>> a[0:4] # 先頭4文字
'Hell'
>>> a[0:5] # 全島5文字
'Hello'
>>> a[-1] # 最終文字
'd'

スライスを使用する際は、終わりの文字の指定が直感的でないことに注意が必要です。
・リストの最初はa[0]、最後はa[-1]です。
・a[0:5] とすると、a[0]からa[4]までの5つが取り出されます。

算術演算

演算子は他の言語や数学とほぼ同じで、迷うことはほとんどありません。加算は「+」、減算は「-」、乗算は「*」です。

>>> a = 1
>>> b = 2
>>> c = 3.0 
>>> type(a)  #変数の型を確認。 
<class 'int'>
>>> type(c)
<class 'float'>
>>> a + b  # int + int = int
3
>>> a + c    # int + float = float
4.0
>>> a += c # a = a + c 
>>> a
4.0

除算には注意が必要です。通常の除算「/」は、int同士で割り切れても結果はfloat型になります。

int型の除算を行いたい場合は次のようにします。
・「//」:int同士の除算で、小数点以下は切り捨てられます。
・「%」:除算「//」の際の余りを求めます。

>>> a = 4
>>> b = 2
>>> a / b # int / int = float
2.0
>>> c = 3 
>>> a // c # int // int = int
1
>>> a % c
1

べき乗「**」は数学においても右結合です。つまり、右から計算されるため注意が必要です。左から計算したい場合は、括弧を使用する必要があります。

>>> a = 2
>>> b = 3
>>> c = 4
>>> a ** b
8
>>> a ** b ** c # a ** (b ** c)
2417851639229258349412352
>>> (a ** b) ** c
4096

乗数がfloat型であっても、数学の原則と同様ですので安心です。

>>> a = 2 # sqrt(2) を計算する。
>>> b = 0.5 
>>> a ** b
1.4142135623730951
>>>

複素数の四則演算を試してみました。複素数の除算が公式通りになっているか、実部と虚部で確認しました。

$$
x = a + bj, y = c + dj \\ \text{→} \\ \dfrac{x}{y} = \dfrac{ac + bd} {c_2+d_2} + \dfrac{bc - ad} {c_2+d_2}j
$$

>>> a = 1 + 2j
>>> b = 3 + 4j 
>>> a + b
(4+6j)
>>> a - b
(-2-2j)
>>> a * b
(-5+10j)
>>> a / b
(0.44+0.08j)
>>> (1*3+2*4) / (3**2+4**2) # Re(a / b)
0.44
>>> (2*3-1*4) / (3**2+4**2)  #Im(a / b)
0.08
>>>

比較演算とbool型

意味は他の言語と完全に同じです。
比較の結果として、ブール値(TrueまたはFalse)が返されます。

大小関係:「>」はより大きい、「>=」は以上、「<」はより小さい、「<=」は以下を意味します。

等価性:「==」は等しいことを、「!=」は等しくないことを示します。

>>> 2 > 1
True
>>> 2 >= 1
True
>>> 2 <= 1
False
>>> 2 < 1
False
>>> 2 == 1
False
>>> 2 != 1
True
>>>

比較不可能な要素にはエラーが発生します。例として、複素数同士の比較はできません。

>>> a = 1 + 2j
>>> b = 3 + 4j
>>> a > b # 複素数どうしの大小は比較不能。
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '>' not supported between instances of 'complex' and 'complex'
>>> a == b
False
>>> a != b
True

比較演算子は論理演算子と組み合わせて条件式に使用されます。比較演算子は論理演算子よりも優先順位が高いため、以下の例では比較演算子の括弧は不要ですが、括弧を付けるとより明確になると私は考えます。

>>> a = 2
>>> b = 1
>>> (a > b) and (a < b) # greater and smaller = False
False
>>> (a > b) or (a < b)   # greater or smaller = True
True
>>> (a > b) and (a != b)
True
>>>

(続き)関数など

当初は続けて書く予定でしたが、演算子の説明だけでかなりの量になったので、次回に続きます。
まだ説明していないデータ型(リストやタプルなど)についても、これから少しずつ説明していきます。

この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?