2.3. 算術演算

Pythonは最初から計算機として使えます。このページでは、もっとも頻繁に使う演算子を取り上げます。数値に対する算術演算、真偽値を生成する比較、条件を組み合わせる論理演算子、そしてハードウェアレベルの作業のためのビット演算子です。

2.3.1. 算術

intfloat の値に対する標準的な算術演算子:

  • + -- 加算

  • - -- 減算(接頭辞として使うと符号反転: -x

  • * -- 乗算

  • / -- 除算。両方のオペランドが整数であっても、必ず float を返します。

  • // -- 切り捨て除算。マイナス無限大方向に丸めた整数の商を返します。

  • % -- 剰余(余り)。

  • ** -- べき乗(2 ** 10 は1024)。

>>> 7 / 2
3.5
>>> 7 // 2
3
>>> -7 // 2
-4
>>> 7 % 2
1
>>> 2 ** 16
65536

型が混在する算術演算では、整数は自動的に浮動小数点数に昇格されます:

>>> 3 + 0.5
3.5

累算代入は演算子と = を組み合わせ、その場でコンパクトに更新します:

counter = 0
counter += 1                # equivalent to counter = counter + 1
counter *= 2                # works for *= /= //= %= **= too

演算子の優先順位は慣例的な順序に従います。最初に **、次に単項の -、続いて *///%、最後に +- です。確信が持てない場合は括弧を使いましょう。実行時のコストはかかりません。

2.3.2. 比較

比較演算子は boolTrue または False)を返します:

  • ==!= -- 等しい / 等しくない。

  • <<=>>= -- 順序の比較。

>>> 3 == 3
True
>>> 3 == 3.0
True
>>> 3 < 5 <= 5
True

最後の例は連鎖した比較で、3 < 5 and 5 <= 5 とまったく同等です。

警告

= は代入し、== は比較します。if x = 5: という式が構文エラーになるのは、まさにPythonが両者をひそかに混同することを拒否するからです。

2.3.3. ブール論理

ブール値を組み合わせる3つの演算子があります:

  • and -- 両辺がともに真のときだけ True

  • or -- どちらかの辺が真のとき True

  • not -- 単一のブール値を反転します。

andor短絡評価します。結果が判明した時点で評価を停止します。False and slow_check()slow_check を決して呼び出しません。

また andor は、リテラルの TrueFalse ではなくオペランドの1つを返すため、デフォルト値をコンパクトに書けます:

name = user_name or "anonymous"   # "" / 0 / None are falsy

2.3.4. ビット演算子

ハードウェアの作業、つまりレジスタフィールドのパッキング、ビットのマスク、プロトコルヘッダーの解析などでは、ビット演算子を使うことになります。これらは int の2進表現に対して動作します:

  • & -- ビット単位のAND

  • | -- ビット単位のOR

  • ^ -- ビット単位のXOR

  • ~ -- ビット単位のNOT(1の補数)

  • << -- 左シフト

  • >> -- 右シフト

これらを読み書きする際には、16進数や2進数のリテラル形式が便利です:

>>> 0b1100 & 0b1010
8                              # 0b1000
>>> 0b1100 | 0b1010
14                             # 0b1110
>>> 0xFF ^ 0x0F
240                            # 0xF0
>>> 1 << 8
256
>>> (0xABCD >> 8) & 0xFF
171                            # extract the high byte

それぞれに累算形式があります: |=&=^=<<=>>=

注釈

and / or はブール値(または真偽性)に対して動作し、& / | はビットに対して動作します。両者を混同しないでください。0b1100 and 0b1010 は両方のオペランドが真であるため 0b1010 と評価されます。ビットを操作するときに通常望む結果ではありません。

2.3.5. 便利な数値系組み込み関数

演算子だけでは扱えない一般的な数値演算をカバーする、いくつかの組み込み関数があります:

  • round() -- 最も近い整数、または第2引数が与えられた場合は最も近い ndigits 桁の小数。round(x)int を、round(x, n)float を返します。ちょうど中間の値(0.51.5 など)は常に切り上げるのではなく、最も近い偶数に丸められます。

  • divmod() -- 1回の呼び出しで (quotient, remainder) を返します。1つの量を単位に分割する場合(秒を分と秒に、バイトをページとオフセットに)に便利です。

  • pow() -- 2引数形式では ** と同じです。3引数形式 pow(base, exp, mod) は、巨大な中間値を一切生成せずに (base ** exp) % mod を計算します。これは大きな指数に対するべき剰余を行う唯一の実用的な方法です。

>>> round(3.7)
4
>>> round(3.14159, 2)
3.14
>>> round(0.5)               # ties go to even, not always up
0
>>> round(1.5)
2

>>> divmod(125, 60)          # 125 seconds = 2 min, 5 sec
(2, 5)
>>> minutes, seconds = divmod(125, 60)

>>> pow(3, 4)                # same as 3 ** 4
81
>>> pow(3, 100, 7)           # (3 ** 100) mod 7, efficient
4

整数から文字列への基数変換(binocthex)については、文字列メソッドと書式設定 で説明します。

2.3.6. mathモジュール

一般的な数学関数は math モジュールにあります。一度インポートし、ドット付きの名前でその関数を呼び出します:

import math

print(math.sqrt(2))              # 1.4142135
print(math.sin(math.pi / 2))     # 1.0
print(math.floor(3.7))           # 3
print(math.log(100, 10))         # 2.0

MicroPythonの math モジュールには、おなじみの関数(sqrtexplogsincostanatan2floorceilpie など)が揃っています。乱数については random モジュールを参照してください。固定小数点のビット操作には、上記の演算子で通常は十分です。

2.3.7. 複素数

虚数成分が必要な数値計算のために、Pythonには j 接尾辞のリテラル(1 + 2j)を持つ complex 型があります。cmath モジュールは複素数入力に対して math を反映したものです。どちらもほとんどのMicroPythonビルドに存在しますが、カメラの作業ではめったに必要ありません。ここで触れるのは主に、それらを使うコードを移植したときに驚かないようにするためです。