やるだけPython

Yamato Nagata

[email protected]

last update: 07/22/2022

数値型

int

'integer'(整数)の略でintとなっています。 あなたのキーボードの上の方(あるいはスマホなら...どこでしょう?)についている数字がそれです!その10個のキートップを自由自在に押すことで、あなたはint型の使い手初心者になれます。

以下のものはすべて有効なint型のデータです

1
42
763
315
+100  # これは数字だけの表現ではありませんね笑
-100
99999999999999999999999999

ただし、以下のものは正しくありません

01
# 0から始めることはできません

40, 500, 500
# 残念ですが、見やすさのためにカンマを挿入することはできません
# カンマを用いると、全く別の型と認識されます
# かわりにアンダースコア(_)を使ってください
# 正) 40_500_500

私たちが日頃計算を行うように、Pythonでも整数同士の計算をすることができます

Pythonコード 結果の型 人間の記法
a + b int a + b
a - b int a - b
a * b int a × b
a ** b int a ^ b
a / b float a ÷ b
a // b int a ÷ b の商
a % b int a ÷ b の剰余

という風に計算できます。計算の優先順位は
** > ( *, /, //, % ) > ( +, - )
となっており、同じ優先順位の間では左のものを優先します。

以下のコードと、その実行結果をその真下に記入しています。

1 + 1
# 2

23 - 123
# -100

3 ** 3
# 27

3 ** 0
# 1

120 * 15
# 1800

15 / 3
# 5.0

365 / 7
# 52.142857142857146

365 // 7
# 52

365 % 7
# 1

(42 + 2) * (32 - 4)
# 1232

15 / 3365 / 7の答えが小数になりましたね!これについてはfloatで述べますので、しばしお待ちください...

さて、こういった計算の中にもやってはいけないことがあります。それは、ゼロで数字を割ること(ゼロ除算)です。

500 / 0
# ZeroDivisionError: division by zero

0 // 0
# ZeroDivisionError: division by zero
# 0 を 0 で割るのもダメです

500 % 0
# ZeroDivisionError: integer division or modulo by zero

こういった、実行してみないとわからないダメなことというのもままありますので、気を付けてください。

int型の最大値・最小値について

読者の中には、すでにC言語などの他の言語に触れていて、「intの最大値は2147483647とかそんな値ではなかったか」と思っている方もいらっしゃるかと思います。\ 実際、多くの言語ではそのように実装されていますが、ことPythonはその限りではありません。 他の多くの言語でintの最大値が2147483647なのは、intの表現に32ビット使うからです。 2^32 = 4294967296 で、+と-にいい感じに値を割り振った結果、-2147483648 ~ +2147483647 を表現できるようにしています。

それぞれの状態の1つ1つに個別の数字を割り当てているということですね。

しかし、Pythonではメモリ(コンピュータのデータを記憶する部分)の許す限り値を表現するために用いるビット数を増やすので、基本上限はありません。

こういったデータを多倍長整数と呼びますが、これのおかげでオーバーフローなどと言った問題を回避することができるのですね。やったね!

float

'floating point number'(浮動小数点数)の略でfloatとなっています。 浮動小数点数... なかなかややこしい響きですが「点がふわふわと動く数値」ですから、これはつまり、小数を持つ数字の「点」に着目してつけられた名前ですね。

以下のものはすべて有効なfloat型のデータです

1.0
1.1
1.0000000000001
-300.0
1.41421356

512.
# 512.0 と同じ

.512
# 0.512

-.512
# -0.512

3e2
# 3 * (10 ** 2) = 300.0

3e-2
# 3 * (10 ** -2) = 0.03

001.001
# intと違い、先頭に0を持ってくることが出来ます

ただし、以下のものは正しくありません

.
# 0.0 を表現するために整数部と小数部両方は省略できません
# 正) 0.0, 0., .0

5e2
.3
# 指数表記の際に小数を用いることはできません
# 正) 5 * (10 ** 2.3)

intと同様に、四則計算などを行うことができます

Pythonコード 結果の型 人間の記法
a + b float a + b
a - b float a - b
a * b float a × b
a ** b float a ^ b
a / b float a ÷ b
a // b float a ÷ b の商
a % b float a ÷ b の剰余

1.2 - 0.2のように答えが整数になる場合であっても、元の式のどちらか一方がfloatの時は答えもfloatになることに注意してください。

優先順位はintの時と同様です。

1.0 + 1.0
# 2.0

23.502 - 123.500
# -99.998

3.229 ** 3
# 33.666977989

3 ** 0.
# 1.0

920.2 * 15
# 13803.0

15.3 / 3
# 5.1000000000000005
# コンピュータでは、小さな値を表現しようとすると誤差が生じることがあります。
# こういった誤差を生じさせない形で計算を行うには、*decimal*や*fractions*といった機能を用いる必要があります。
# TODO: ライブラリに関する記述

365.25 / 7
# 52.17857142857143

365.0 // 7
# 52.0

365 % 7.0
# 1.0

(42.54 + 2) * (32 - 4.2)
# 1238.212

intのように、 0と等しい値で除算することはできません

0.0 / 0.0
# ZeroDivisionError: float division by zero

complex

'complex number'(複素数)の略でcomplexとなっています。つまり、虚数に関する数値ですね。
正直、筆者はこの値を用いている業務的なプログラムを1度も見たことがありません。数学や工学の分野で用いそうな方以外は「そんなのもあったなぁ」程度で構わないと思います。

一般的に複素数を表記しようとすると

12 + i3

のように表記すると思いますが、Pythonでは

  • iではなくjを用いる
  • 数値の後ろにjをつける

というルールがあります。

以下のものはすべて有効なcomplex型のデータです

1j
.0j
1.1j
5 + 3j
3.4 + 1j
1 + 0j

ただし、以下のものは正しくありません

.j
# 0.0jのために、0を両方省略することはできません
# なお、 0.0jと入力した場合でも、0jと解釈されます
# 正) 0.0j, 0j

j
# 1jの1を省略することはできません
# 正) 1j

一部の四則計算などを行うことができます

Pythonコード 結果の型 人間の記法
a + b complex a + b
a - b complex a - b
a * b complex a × b
a ** b complex a ^ b
a / b complex a ÷ b

計算に用いるどちらか一方でもcomplex型である場合、//%を用いることは出来ないので注意してください。

(1 + 3j) // 2
3j // 3j
# TypeError: can't take floor of complex number.

5j % 2j
5j % 2
# TypeError: can't mod complex numbers.