python入門講座 | 変数の型を学ぼう(int/float/strなど)[第14回]

アラサーOLのためのpython入門講座
まずは基本の3つの型、int、float、strを覚えましょう!

Ciao!みなさんこんにちは!このブログでは主に
(1)pythonデータ解析,
(2)DTM音楽作成,
(3)お料理,
(4)博士転職
の4つのトピックについて発信しています。

今回は「アラサーOLのためのpython入門講座」です!
この講座では、プログラミング初心者アラサーOLのMi坊さんに、pythonを学習する上でのアドバイスを行います!
パソコンもプログラミングも初心者だけど、プログラミングができるようになりたい!」という方のためにstep-by-stepで解説していきます。

今日はPythonの変数の型について解説します!
変数には整数、浮動小数点、文字列など型と呼ばれる類型が存在します。
変数の型が一致していないとエラーになったり思わぬ挙動をすることがあるので、Pythonを習得する上で変数の型について知っておく必要があります。
最後までお付き合いください!

Kaiko
Kaiko

この記事はこんな人におすすめ

  • 初心者だけどpythonを始めた!
  • pythonの基本的な使い方を知りたい!
  • 独学で学んだpythonの知識を整理したい!

Abstract | 代表的な3つの型: int, float, str

Pythonの変数には3つの代表的な型が存在します。
1つ目のint型は整数値を扱うために用意された型です。2つ目のfloatは小数点を持つ値を扱うために用意された型です。最後のstrは文字列を扱うための型です。
他にもいろいろな型が存在しますが、これら3つを組み合わせたり複数個使うなどしたものなので、基本はこの3つです。
異なる型同士の演算は基本的にできなかったり、float型には数値の上下限値や精度が存在するなど知っておくべき知識がいくつかあります。
今回はint型変数, float型変数, str型変数の基礎知識をご紹介します!



Background | プログラミングと変数の型

プログラミングでは言語に関わらず変数を使います。
大抵のプログラミング言語では整数型、浮動小数点型、文字列といった代表的な型の変数が用意されています。
実はPythonなどのインタプリタ言語では変数の型を意識する機会は他の言語ほど多くありません。前々回の記事「python入門講座 | 変数を使いこなそう1(変数の定義方法と基本ルール)」で扱ったように、変数を定義するときには

var1 = 1

などと特に変数の型を気にせずにコーディングします。

一方で、C言語などのコンパイル言語では常に変数の型を意識する必要があり、変数を定義するときには

int var1 = 1;

などと先頭で変数の型を宣言する必要があります。
さらに、C言語では型の異なる変数同士での演算はできません。

Pythonでは変数を定義するときに自動的に変数の型が決められ、型の異なる変数同士で演算をしてしまっても多くの場合、「型の変換」という処理が自動的に行われます。
ただ、場合によっては型が異なる変数同士ではできない演算や、浮動小数点型を想定した計算に整数型を突っ込むと想定とは異なる結果になってしまうということがあります。
変数の型について知っておくことで、このようなエラーやバグを防ぐことができます。
本記事で基礎を学びましょう!



Method | 代表的な変数の型と型の確認方法

Pythonの変数には

  • int型(整数型)
  • float型(浮動小数点型)
  • str型(文字列型)

をベースとして他にもlist型、dict型など様々なものがあります。
まずは基礎となるint, float, strについて知りましょう!

int型(整数型)

int型の変数は整数値を格納する変数です。
「int」とは「integer(整数)」の略です。
例えば、1や0、-1など小数点を持たない数値のことです。
Pythonでは変数を定義する際に小数点なしの数値を格納すると自動的にint型となります。

a = 15

ちなみに型変換が行われることを「キャスト(cast)される」と言います。プログラミングよく出てくる言葉なので覚えておくと良いでしょう。

変数の方の確認方法 | type()

変数の方はtype()という関数で確認できます。

a = 15
print(type(a))

と実行すれば

<class 'int'>

のように表示され、int型であることがわかります。

変数に割り当てられているメモリサイズとその確認方法 | sys.getsizeof()

すこし難しい話をします。初心者の方は読み飛ばしていただいても構いません。
多くのプログラミング言語ではint型の変数には格納することができる上限値が設定されていますが、Python3ではint型の変数の上限値がありません。コンピューターのメモリが許す限りの大きさの変数を格納できます。
通常の変数の上限値は変数1つに割り当てるメモリのサイズによって決まっています。int型の場合にはデフォルトでは28byteですが、大きな値をint型の変数に格納するとメモリサイズが増えます。

メモリサイズはsysライブラリのgetsizeof()という関数で取得できます。

import sys

a = 15 # small value
print(sys.getsizeof(a)) # size of int is 28

a = 1012345678901234567890 # large value
print(sys.getsizeof(a)) # 36 for large int value

といった具合でaという変数のメモリサイズが確認できます。
通常の大きさのintは28byteですが、2つ目のように大きな値ではメモリサイズが36byteなどに増えます。

蛇足ですが、numpyなどの各種ライブラリにおけるint型(厳密にはint16, int64)などの上限値もマシンリミット(パソコンのメモリザイズで決まる)となっています。こちらはnumpyのiinfo()という関数で取得できます。

import numpy as np
print(np.iinfo('int'))

numpyについては別の機会に扱うのでここでは理解しなくて構いません。



float型(浮動小数点)

float型の変数は小数点を持つ数値を格納する変数です。
小数点を持つ数値は浮動小数点、floating pointと呼ばれます。
例えば、1.1、3.14、2.73などです。

Pythonでは変数を定義するときに浮動小数点を付けると自動的にfloat型となります。

a = 3.14
print(a)
print(type(a))

また、小数点以下は0だけれどもfloat型にしておきたい場合、小数点だけ付けておくとfloat型として定義することができます。小数点なしだとint型になります。

b = 12 # b becomes int
print(b) # 12
print(type(b)) # int

b = 12. # becomes float
print(b) # 12.0
print(type(b)) # float

float型の上限値 | sys.float_info.max

Pythonのfloat型変数には上限値が存在します。
この上限値、正の値の最大値はsys.float_info.maxで参照可能です。

import sys
# print max of float
print(sys.float_info.max)

多くの環境で、sys.float_info.maxは1.7976931348623157e+308となるようです。
この値を超えると無限大(int)として認識されます。

# try to define a too large float variable
val_float = 2.0e+309
print(val_float) # infinity

float型として定義することができる値は、マイナスの上限値からプラスの上限値の間、すなわち

- sys.float_info.max <= float_variable <= sys.float_info.max

となります。

float型の下限値 | sys.float_info.min

限りなくゼロに近い正の数(下限値)も設定されており、sys.float_info.minで取得可能です。

# print min of float
print(sys.float_info.min)

こちらは2.2250738585072014e-308となります。

sys.float_info.minの方は、下限値を下回るとすぐにゼロになるわけではなく、仮数部(次章参照)の精度を落とすことでもっと小さい数字も表現できるようになっているようです。

# smaller float than min can be defined to some extent
val_float = 2.2250738585072014e-320
print(val_float, val_float == 0.) # 2.2253e-320 and False

下記のようにものすごく小さい数値を代入すると0となります。

# try to define a too small float variable
val_float = 2.2250738585072014e-325
print(val_float, val_float == 0.) # 0.0 and True

float型の精度 | 17桁で16桁までは正確、17桁目は丸め込まれる

Pythonだけでなく、プログラミング言語のfloat型には精度という概念が存在します。
小数点以下何桁まで考慮されるかということです。
ある一定以上の桁数については精度が保証されません。
Pythonのfloat型はC言語のdouble型に相当し、厳密には「倍精度浮動小数点(double precision floating point)」と呼ばれる型です。
これに対し、通常の浮動小数点(C言語のfloat型)は「単精度浮動小数点」と呼ばれます。

浮動小数点型は\(+1.2345 \times 10^{12}\)のように、「符号部(sign)」+「仮数部(fraction)」+「指数部(exponent)」で構成され、プログラミングでよく使われる表現では

+1.2345e+12

のように表されます。+が符号部分、1.2345が仮数部分、e+12が指数部分です。
ここで、仮数部分として扱える桁数を精度や有効桁数と言います。これ以上の桁数を扱うことはできないという意味です。

倍精度浮動小数点の有効桁数は17桁です。
約16桁までは正確に表現され、17桁目は丸め込まれまた数字となります。
倍精度浮動小数点は64ビットで、1ビット目が符号部、2–12ビットが指数部、13–64ビットが仮数部に割り当てられています。
仮数部は52ビット分ですが、一つ上の桁に暗黙の1ビットが存在するとみなす「ケチ表現」と呼ばれる表現方法で53ビットとなっています。
したがって、仮数部の数字が\(2^{53} – 1 = 9007199254740991\)、すなわち9.007199254740991という仮数までは正確に表現できます。
これを超える仮数部については正確に表現できなくなります。

以下を実行するとfloatの精度を確認することができます。

a = 1.2345678901234565 # 17-digit float
b = 1.2345678901234567 # 17-digit float
c = 1.2345678901234568 # 17-digit float
d = 1.23456789012345678 # 18-digit float
print(a, b, c, d)
print(a == b) # False
print(b == c) # True
print(b == d) # True

print(a, b, c, d)の結果はa以外は全て1.2345678901234567と表示されます。
また、a == bの結果はFalse、b == cやb==dの結果はTrueとなります。
a, b, cはすべて異なる数値ですが、float型変数としてはaとbは異なる値でも、bとcとdは同じ値として扱われている事がわかります。
つまり、16桁目の1.234567890123456までは正確に表現されており、17桁目の5, 7, 8には丸め込みが入っているということです。18桁目はそもそも扱うことができません。

かなり踏み込んだ内容でしたが、floatの精度という概念を知っておくとプログラミングで思わぬバグを防ぐことができます。
17桁以上の有効桁数を持つ数値を計算してしまうと思い通りの計算結果が得られないなどの不具合につながります。
普段16桁や17桁という数字を扱うことは稀だとは思いますが、桁数の大きな数値を扱うときには注意しましょう。



str型(文字列)

str型は文字列を格納する変数です。
これまでの記事にも何度か登場しているとおり、Pythonでは「’」シングルクオーテーションや「”」ダブルクオーテーションで文字列を囲んで変数に代入することで文字列型の変数が定義できます。
シングルとダブルどちらでも良いですが、なるべく統一しておいたほうがすっきりします。
以下のようにtype()関数で型を確かめればstr型と表示されます。

my_hobby = 'python' # with single quotation
print(my_hobby)
print(type(my_hobby))

my_hobby = "programming" # with double quotation
print(my_hobby)
print(type(my_hobby))

「str」は「string(文字列)」の略です。
ちなみにC言語など他のプログラミング言語にはchar型という変数も存在します。こちらはcharacter(文字)の略で一文字だけの変数です。Pythonではchar型は存在せず、str型で処理します。



Result | 実際にやってみよう

実際に手を動かしてみましょう!
今回もJupyter Notebookでコーディングしましょう!
もしコーディングの方法がわからなければ練習問題の後に例を示すので、そちらを参照してください。

準備 | python notebookの新規作成

まずはpython notebookを用意しましょう。
いつものpython_practiceのディレクトリに「practice_variable_type」という名前のpython notebookを作成してください。
ターミナルを立ち上げて~/python_practiceに移動、jupyter notebookを起動し、ブラウザから新規→Python3でpython notebookを開いて、ファイル→リネームでファイル名を決定します。
もしやり方がわからなければ、前回記事「python入門講座 | 変数を使いこなそう1(変数の定義方法と基本ルール)」や過去記事「python入門講座|pythonを使ってみよう2(Jupyter Notebookを使う方法)」で詳しく解説しているので、これらを見ながらやってみてください。

int型変数の例

上記で取り上げた変数の更新の例を実際にやってみましょう。
まずは最初のセルをMarkdownセルにして

# int型変数の例

と書いておきましょう。後で見返したときにわかりやすくなります。
Markdownセルやコードセルなどの用語やこれらの使い方は過去記事「python入門講座|pythonを使ってみよう2(Jupyter Notebookを使う方法)」を参照してください。

次のコードセルで以下を実行し、int型変数の定義とその変数の型確認を行いましょう。

# define a variable
var_int = 15 # automatically casted to int

# print its value and type
print(var_int)
print(type(var_int))

実行すると、

15
<class 'int'>

と表示されるはずです。

int型変数のメモリサイズ(発展編)

int型変数のメモリサイズを確かめてみましょう。例によってMarkdownセルに適当に説明を書いてから、次のコードセルで以下を実行してみましょう。

import sys

# check size of a small int value
a = 15 # small value
print('small value:', sys.getsizeof(a)) # size of int is 28

# check size of a large int value
a = 1012345678901234567890 # large value
print('large value:', sys.getsizeof(a)) # 36 for the large int value

値が小さいint型変数のメモリサイズは28バイト、大きいものは36バイトになります。



float型変数の例

float型変数を定義し、型の確認をしてみましょう。例によってMarkdownセルに説明を書いてから、以下を実行してみましょう。

# define a float variable
var_float = 3.14

# print its value and type
print(var_float)
print(type(var_float))

実行すると、

3.14
<class 'float'>

と表示されます。

整数値をfloat型変数として定義する

整数値をint型ではなくfloat型変数として定義してみましょう。自動キャスト(型変換)機能を使います。以下を実行してみましょう。

# integer as an int variable
var_float = 12 # automatically casted to int
print('int as int:', var_float) # 12
print(type(var_float)) # int

# integer as a float variable
var_float = 12. # automatically casted to float
print('int as float:', var_float) # 12.0
print(type(var_float)) # float

最初は「var_float = 12」と小数点を付けずに変数を定義しているので、自動的にint型変数となります。2回目は「var_float = 12.」と小数点を付けたため、自動的にfloat型変数として定義されます。
実行結果は

int as int: 12
<class 'int'>
int as float: 12.0
<class 'float'>

となります。

float型の上限値

float型の上限値を確認してみましょう。まずはfloat型の上限値を出力してみます。以下を実行しましょう。

# print max of float
print(sys.float_info.max)

「1.7976931348623157e+308」と出力されます。

次にこの上限値を少し上回る数を定義し、値を確認してみましょう。以下を実行してみましょう。

# try to define a too large float variable
val_float = 2.0e+309
print(val_float) # infinity

この結果は「inf」と表示されます。infとはinfinity(無限大)のことです。上限値より大きい数字はinfとなってしまい、float型変数として扱うことはできないとわかります。

float型の下限値

次に下限値も確認してみましょう。まずは下限値の確認のため、以下を実行しましょう。

# print min of float
print(sys.float_info.min)

「2.2250738585072014e-308」と表示されます。

次に、この下限値を少し下回る数を定義して値を確認してみましょう。以下を実行しましょう。

# smaller float than min can be defined to some extent
val_float = 2.2250738585072014e-320
print(val_float, val_float == 0.) # 2.2253e-320 and False

10の-308乗の代わりに10の-320乗にしてみました。結果は

2.2253e-320 False

となります。4桁目の2.225までは正しい数字となっていますが、5桁目はもともと定義したときの数(0)と異なる値(3)となっています。
17桁あった仮数部(2.2250738585072014)が5桁(2.2253)に圧縮されることで、一応は10の-320乗という小さな数が表現されています。

もっと小さな数を定義してみましょう。以下を実行してみましょう。

# try to define a too small float variable
val_float = 2.2250738585072014e-325
print(val_float, val_float == 0.) # 0.0 and True

今度の結果は

0.0 True

となります。これだけ小さな数(10の-325乗)を定義すると、もはやfloat型として扱うことはできずゼロとなってしまいます。



float型変数の精度(発展編)

float型変数の精度を確認してみましょう。float型変数は有効数字約16桁までは精度がありますが、17桁目は丸め込みが入ることがあります。
まずは以下を実行してみましょう。

# define a variable
var_float1 = 1.2345678901234565 # 17-digit float
print(var_float1) #1.2345678901234565

# define another variable
var_float2 = 1.2345678901234567 # 17-digit float
print(var_float2) #1.2345678901234567

# var_float1 and var_float2 can be discriminated
print(var_float1 == var_float2) # False

結果は

1.2345678901234565
1.2345678901234567
False

となるはずです。「var_float1 == var_float2」では、これら2つの変数が一致しているか否かを確認しています。Falseとなるので一致していません。
このように17桁目が5のときと7のときは、別の数字として区別できていることがわかります。

次に17桁目が7のときと8のときにどうなるかやってみましょう。以下を実行してみます。

# define the third float variable
var_float3 = 1.2345678901234568 # 17-digit float
print(var_float3) #1.2345678901234567

# var_float2 and var_float3 can NOT be discriminated
print(var_float2 == var_float3) # True

今度の実行結果は

1.2345678901234567
True

となります。「1.2345678901234568」という数値をval_float3として定義したのに、val_float3の値は「1.2345678901234567」となっています。
さらに、「var_float2 == var_float3」として、これらの変数の値が一致しているか確かめると「True」となるので、一致していることも確かめられます。
このように、17桁目は値によっては正しく扱えないことがあります。

さらに、18桁目に数字を入れてみましょう。以下を実行しましょう。

# define the fourth float variable
var_float4 = 1.23456789012345678 # 18-digit float but rounded to 17 digits
print(var_float4) #1.2345678901234567

# var_float2 and var_float4 can NOT be discriminated
print(var_float2 == var_float4) # True

結果は

1.2345678901234567
True

となるはずです。
18桁目に「8」という数字を定義したにも関わらず、17桁目までしか表示されません。
さらに、var_float2(1.2345678901234567)と比較すると一致します。
このように18桁目は丸め込まれて(この場合切り捨てられて)います。



str型変数の例

str型変数を定義して値を確認してみましょう。以下を実行してみましょう。

# define a str variable
my_hobby = 'python' # with single quotation
print(my_hobby)
print(type(my_hobby))

# define a str variable
my_hobby = "programming" # with double quotation
print(my_hobby)
print(type(my_hobby))

実行結果は

python
<class 'str'>
programming
<class 'str'>

となるはずです。
1回目はシングルクオーテーション、2回目はダブルクオーテーションで定義しています。
どちらを使っても構いません。



練習問題

最後に練習問題をやってみましょう!
以下の処理をするコードを書いてみてください。

  1. 変数 pi_int に3を代入し、pi_intの値と型を出力してください。
  2. 変数 pi_float に3.141592を代入し、pi_floatの値と型を出力してください。
  3. 変数 pi_round に3をfloat型として代入し、pi_roundの値と型を出力してください。
  4. 変数 pi_str にPiという文字列を代入し、pi_strの値と型を出力してください。

練習問題の回答例

できたら回答例を確認しましょう!下の画面をスクロールすると回答例が見られます!
今回の記事で出てきた他のコードも載っているので参考にしてください!

練習問題おつかれさまでした!
今日はここまでです。Python Notebookを終了しておきましょう。もしPython Notebookを終了方法がわからなければ過去記事「python入門講座|pythonを使ってみよう2(Jupyter Notebookを使う方法)」の「Python Notebookの起動・終了方法」の章を参照してください!



Conclusion | まとめ

最後までご覧いただきありがとうございました!
Pythonの変数の代表的な型について解説しました!

Pythonでは様々な型の変数が利用できますが、基礎となるのは今回解説した3つです。
Pythonで変数の型を特別意識する場面は少ないですが、変数の型の知識が無いと想定と異なる処理をしてしまうなど思わぬエラーを招いてしまうことがあります。
変数の型や扱い方をしっかり身につけ、正確でわかりやすいコードを速く掛けるようになりましょう!

以上「python入門講座 | 変数の型を学ぼう(int/float/strなど)」でした!
またお会いしましょう!Ciao!



References | 参考

参考教科書

以下の教科書を参考にして進めています!より詳しく学びたい方は購入して読んでください!

コメント

タイトルとURLをコピーしました