【入門編】「BMI計算プログラム」で、Pythonのデータ型の理解を深める

スキルアップ

はじめに

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が良い感じに取り計らってくれます。
しかし、それに甘えて理解を疎かにすると、複雑なプログラムを作成するときにつまずく危険があります

面倒かもしれませんが、この機会にプログラムで使用する変数の「データ型」をチェックするクセを付けてみてはいかがでしょうか?

コメント

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