はじめに
Pythonの基礎で学んだ「データ型」について、もう少し掘り下げてみましょう。
よく考えれば、これまではデータ型ってあまり意識していなかったと思います。
※というより、あえて具体的な説明を省略していました、、、
ではなぜ、具体的な説明がなく、よく知らなくても大丈夫だったのでしょうか?
今回は、Pythonにおける「データ型」のルールについて学びます。
Pythonプログラミングにおけるデータ型の扱い
まず、大前提としてPythonではプログラマーが明示的にデータ型を指定しない場合、Pythonが最適と判断したデータ型が自動的に設定されます。
※プログラミング言語によっては、変数を定義するときにデータ型の指定を必須とするがあります。
これは便利な反面、プログラマーが意図しないデータ型が勝手に設定されてしまう危険性もあります。
ここで、Pythonでデータ型を表示する「type関数」を使用しながら、例を見てみましょう。
「i」はint型(整数)、「j」はfloat型(浮動小数点)が自動設定されました。
「i + j」(1 + 1.0)を「k」に代入する時、「k」はfloat型(浮動小数点)として「2.0」を代入されました。
ここで、list型(配列)として「L」を作成します。
※list型は、プログラマーが[ ]によって明示的に指定しています。
さて、「L」から(先頭を0番目として数えて)2番目の要素を取得したくなりました。
ちょうど、「k」には”2″が設定されているので、これを使用したところエラーとなってしまいました・・・
みなさんは、もうその原因にお気付きかもしれません。
そうです、配列のインデックス(要素の番号)に指定するときにfloat型を指定したことが原因です。
※エラーメッセージにも、「list indices must be integers or slices, not float」(配列のインデックスは整数またはスライスである必要があります、浮動小数点ではありません)と書いてありました。
もし、「k」を使用したい場合は整数にキャスト(データ型を変換)する必要があります。
もちろん、こんな数行のプログラムでデータ型をミスする方が難しいかもしれません。
しかし、何千行、または処理が複雑化するとデータ型の違いで「エラーの発生」や「意図しない処理」が起こる可能性があります。
※「意図しない処理」の代表例に、「条件判定で数字(int型、float型)と文字(str型)を比較して、不一致と判定される」があります。
データ型はPythonが自動設定しますが、プログラマー自身も「どのデータ型が設定されているか」を把握するようにしましょう。
データ型をキャストする方法
代表的なキャスト方法と注意点は次の通りです。
関数 | 機能 | 注意点 |
---|---|---|
int() | float型やstr型を、int型に変える | int型に変換できるのは、数字のみです。 小数点以下は切り捨てとなります。 |
float() | int型やstr型を、float型に変える | float型に変換できるのは、数字のみです。 |
str() | int型やfloat型を、str型に変える | |
list(tuple) | tuple型を、list型に変える | |
tuple(list) | list型を、tuple型に変える |
「BMI計算プログラム」の全体像
今回も、プログラムの全体を眺めるところから始めましょう。
学習のためとはいえ、無理矢理に関数を作った感が出てますね・・・
######################
# [関数①] #
# 身長と体重を入力 #
######################
def inputData():
hight = float(input("身長は ? cmですか・・・"))
weight = float(input("体重は ? kgですか・・・"))
return hight, weight
###################
# [関数②] #
# BMIの計算 #
###################
def calcBMI(hight, weight):
bmi = weight / (hight /100) ** 2
print(f"BMIは、{str(round(bmi, 2))}です")
return bmi
######################
# [関数③] #
# 体型状態の判定 #
######################
def judgement(bmi):
if bmi < 18.5:
judge = "痩せ型"
elif bmi >= 18.5 and bmi < 25:
judge = "標準"
elif bmi >= 25:
judge = "肥満"
print(f"あなたは、「{judge}」です")
###################
# メイン処理 #
###################
# [関数①]身長と体重を入力
hight, weight = inputData()
# [関数②]BMIの計算
bmi = calcBMI(hight, weight)
# [関数③]体型状態の判定
judgement(bmi)
プログラムの注目ポイント
入力データのキャスト(str型 -> float型)
利用者に入力を求める「input関数」は入力結果をstr型で返します。
そのため、後続の四則演算で使用するために、float型に変換する必要があります。
float型への変換は「float()」で行うため、次のように記述します。
hight = float(input("身長は ? cmですか・・・"))
出力データの四捨五入とキャスト(float型 -> str型)
BMIの計算はfloat型を使用して行います。
そのため、BMIの計算結果「bmi」も当然のごとくfloat型になります。
「bmi」を文章中に組み込んで画面出力するためにはstr型に変換する必要があります。
もう1つ工夫として、「round関数」を利用して小数点以下の表示桁数を指定します。
「round関数」は、第1引数に数値、第2引数に小数点以下の表示桁数することで、表示外の桁で四捨五入します。
例では、第2引数を”2″で指定しているので、小数点以下の3桁目を四捨五入します。
print(f"BMIは、{str(round(bmi, 2))}です")
関数の返り値(tuple型)の受け取り方
関数の「return」に複数の変数が設定されている場合、返り値はtuple型となります。
そのため、「hight」と「weight」を受け取る場合は次のように記載できます。
userInput = inputData()
hight = userInput[0]
weight = userInput[1]
しかし、Pythonのプログラムのルールとして、1行で記載することができます。
hight, weight = inputData()
最後に
データ型について、深く掘り下げましたがご理解いただけたでしょうか?
Pythonは、良くも悪くも「良い感じに」データ型を設定してくれます。
最初の頃、簡単なプログラムを書くときは、データ型をよく理解していなくてもPythonが良い感じに取り計らってくれます。
しかし、それに甘えて理解を疎かにすると、複雑なプログラムを作成するときにつまずく危険があります。
面倒かもしれませんが、この機会にプログラムで使用する変数の「データ型」をチェックするクセを付けてみてはいかがでしょうか?
コメント