見出し画像

Pythonの基本④ 関数


関数とは?

関数とは、一定の処理を再利用できる形にまとめておいたものです。漠然とし過ぎて分かりにくいので、腎機能計算をする時を例に考えてみましょう。
腎機能計算では、Cockcroft-Gault式やeGFRをよく使用します。

毎回上記のような計算式を打ち込んでも良いですが、さすがに面倒です。計算するたびに変化するのは、年齢や体重、血清クレアチニン値などのパラメータ(引数 ←"ひきすう"と読みます)で、それらを掛けたり割ったりする処理自体は同じです。
この定型処理に引数を渡して、答え(戻り値)を得るための機能が関数です。

関数を書いてみよう

それでは実際に書いてみましょう。以下のような感じで記述します。

関数の構文

Cockcroft-Gault式を例に書いてみると、引数は性別、年齢、体重および血清クレアチニン値であり、戻り値はクレアチニンクリアランスとなります。性別で0.85を掛けるかどうかが決まるので、辞書を用いて係数を変えたり、条件分岐で場合分けしても良いかもしれません。辞書や条件分岐については、過去の投稿をご参照ください。
今回は、辞書を用いて係数を変える方法で記述しています。

def CG_formula(genser, age, bw, scr):
  coefficient = {'m': 1, 'f': 0.85}  # keyをgenderとし、それに応じた係数(value)を返します
  clcr = (140-age)*bw/(72*scr)*coefficient[gender]
  return clcr

ここでは、関数を定義しているだけなので、実行しても何も起きません。
実際に引数にデータを渡して、計算できるが確認してみましょう。input関数を使用して、それぞれの引数にデータを代入します。文字列、整数、小数などデータ型に注意してください。

# データ入力
gender = input('性別(m or f): ')
age = int(input('年齢: '))
bw = float(input('体重(kg): '))
scr = float(input('血清クレアチニン値(mg/dL): '))

例えば、以下のように入力したとします。
> 性別(m or f): f
   年齢: 23
   体重(kg): 45
   血清クレアチニン値(mg/dL): 0.68

それでは関数を使用してみましょう。ここでは、計算結果を"CLcr"という変数に代入し、print関数で表示させてみます。

CLcr = CG_formula(gender, age, bw, scr)
print(f'CLcr = {CLcr} (mL/min)')

実行すると、
> CLcr = 91.40625 (mL/min)
と表示されます。
小数点以下の桁数が多くて見にくいですね。そういう場合は、

print(f'CLcr = {CLcr:.1f} (mL/min)')

というように、変数:.1f と付けることで表示する桁数を指定することが出来ます。1を指定すると小数点以下第一位まで表示されます。
> CLcr = 91.4 (mL/min)

今回のコードの場合、性別をmかfというように指定した文字を入力すれば正しく計算されますが、大文字や全角、まったく別の文字列を入力された場合は辞書で係数を指定する段階(coefficient[gender] の部分)でエラーが起こりそうですよね。プルダウンから性別を選ぶような仕組みだったら良いですが、入力者に依存する場合はエラー回避のための条件分岐が必要になるので注意しましょう。
また、もし肥満だった場合はCockcroft-Gault式を使用すると腎機能を過大評価してしまいます。例えば、BMIが25以上の場合は標準体重を代わりに使用する、、、といった条件分岐もあるとより実用的になります。

腎機能関連を一気に計算!

以上を踏まえて、eGFRも含め一括して計算できる関数を作成してみました。BMIで肥満かどうか判定する条件式も加えています。

def renal_clearance(gender, age, height, bw, scr):
  #肥満かどうか判定し、肥満の場合はBMI 22となる体重に補正
  BMI = bw/(height/100)**2
  if BMI >= 25:
    bw = 22 * (height/100)**2
    obesity_index = f'肥満(体重は{bw:.1f}kgで計算)'
  else:
    obesity_index = ''
  #CG
  coefficient1 = {'m': 1, 'f': 0.85}
  clcr = (140-age)*bw/(72*scr)*coefficient1[gender]
  #BSA
  BSA = height**0.725 * bw**0.425 * 0.007184
  #eGFR
  coefficient2 = {'m': 1, 'f': 0.739}
  eGFR = 194 * age**-0.287 * scr**-1.094 * coefficient2[gender]
  eGFR_BSAadj = eGFR * BSA/1.73

  return BMI, obesity_index, clcr, BSA, eGFR, eGFR_BSAadj

注1)pythonでは「〇の2乗」などのべき乗は「〇**2」というように表現します。

# データ入力
gender = input('性別(m or f): ')
if gender != 'm' and gender != 'f':
  print('性別を正しく入力してください')
else:
  age = int(input('年齢: '))
  height = float(input('身長(cm); '))
  bw = float(input('体重(kg): '))
  scr = float(input('血清クレアチニン値(mg/dL): '))

注2)「!=」は「等しくない 」という意味で、
「if gender != 'm' and gender != 'f':」とすることで、mでもfでもない入力値のとき(=意図しない入力値)の時が"真"となるので、先に進まないようにしています。
※ただし、それ以降の年齢などの入力も数字ではなく文字列を入力されるとエラーとなるので、もう一工夫必要ですね。

# 関数の実行
BMI, obesity_index, clcr, BSA, eGFR, eGFR_BSAadj = renal_clearance(gender, age, height, bw, scr)

# 結果の出力
print(f'BMI: {BMI:.1f} {obesity_index}')
print(f'BSA = {BSA:.2f} (m2)')
print(f'CLcr = {clcr:.1f} (mL/min)')
print(f'eGFR = {eGFR:.1f} (mL/min/1.73)')
print(f'BSA未補正eGFR = {eGFR_BSAadj:.1f} (mL/min)')

注3)今回の関数では戻り値が6個あるので、関数の実行時に戻り値を代入する変数も6個用意していないとエラーが出ます。


CLcrやeGFRの計算では共通するパラメータ(引数)があるため、一括して計算することが出来ます。それぞれの式に毎回数字を入力して計算するよりはるかに楽で正確です。
今回みたいにBMIの値によって、補正体重を使用する場合分けも出来ます。体表面積計算には補正体重を使用したくないときは、BSA計算の部分を肥満判定の前に移動すれば入力値のままBSA計算が実行されます。
このように、自分がよく使用する計算方法にカスタマイズして使用することができます。さらに、腎機能に応じた投与量を表示するなど戻り値を使用した更なる処理も追加することも出来そうです。


今回は、引数を入力すると戻り値が返ってくる関数を紹介しました。処理によっては引数や戻り値が省略されることもあります。関数を上手く使用することで、コード全体がスッキリ見えますし、メンテナンスも楽になります。ぜひ、活用してみてください!

この記事が気に入ったらサポートをしてみませんか?