同じ処理を何度も書くのは非効率でバグの原因です。「関数」を使えば、一連の処理を再利用可能な「部品」としてまとめ、プログラムをクリーンで管理しやすくできます。これは、優れたプログラムの基本原則です。
一連の処理をひとまとめにし、名前を付けた「部品」です。材料となるデータ(引数)を渡すと、中の処理を実行し、結果(戻り値)を返します。
再利用性: コピペ不要で何度も呼び出せます。
可読性: 処理内容が名前で明確になります。
保守性: 修正が関数定義の1箇所で完了します。
defキーワードで関数を定義し、returnで結果を返します。定義した関数は、名前で呼び出し、引数を渡して実行します。
はじめに:コードを「部品化」する魔法、関数
皆さん、こんにちは。前回の講義では、if文とforループを学び、プログラムに「判断力」と「勤勉さ」を与える方法を身につけましたね。これで、複数の患者さんのデータを順番に処理し、条件に応じて異なる対応ができるようになりました。私たちのプログラムも、かなり賢くなってきた気がします。
しかし、ここで一つ、新たな課題が持ち上がります。もし、「BMIを計算して、その値から肥満度を判定する」という一連の処理を、プログラムのあちこちで何度も行う必要があったらどうでしょう?そのたびに、同じようなコードを何度もコピー&ペーストするのは、面倒なだけでなく、もし後から計算式を少し修正したくなった場合に、全ての箇所を忘れずに直さなければならず、間違いやバグの温床になってしまいます。
これは、優れたプログラミングの原則である「DRY (Don’t Repeat Yourself – 同じことを繰り返すな)」に反してしまうんですね。
そこで登場するのが、一連の処理を一つの「部品」としてまとめ、それに名前を付けて、いつでも何度でも呼び出せるようにする仕組み、関数 (Function) です。関数は、プログラムを整理整頓し、再利用可能で、読みやすいものにするための、最も基本的で強力な道具の一つです。今回は、この関数の作り方と使い方を、医療現場で役立つ具体例と共に学んでいきましょう。
1. 関数とは? 〜処理をまとめる「便利な道具箱」〜
関数とは、特定の仕事をするための一連のコードをひとまとめにした「便利な道具箱」のようなものです。
例えば、「BMIを計算する」という名前の道具箱を作っておけば、私たちは「身長」と「体重」という材料をその箱に入れるだけで、箱が自動的に中身を計算してくれて、「BMIの値」という完成品を返してくれます。私たちは、箱の中で具体的にどんな計算が行われているかを毎回気にする必要はありません。ただ、必要な材料を入れて、出てきた結果を使えば良いのです。
関数の概念図
+----------------------------------+
材料 (引数) --> | | --> 完成品 (戻り値)
| 関数という名の「道具箱」 |
| (中には一連の処理が書かれている) |
+----------------------------------+
なぜ関数を使うのでしょうか? 主に3つの大きなメリットがあります。
- 再利用性 (Reusability): 一度作れば、同じ処理を何度でも呼び出せます。コピー&ペーストはもう必要ありません。
- 可読性 (Readability):
calculate_bmi(weight, height)というコードは、複雑な計算式がそのまま書かれているよりも、何をしているかが一目で分かります。プログラムが物語のように読みやすくなります。 - 保守性 (Maintainability): もしBMIの計算ロジックを変更する必要が出た場合、修正箇所はその関数の中の一か所だけで済みます。これにより、修正漏れがなくなり、バグの発生を劇的に減らすことができます。
2. 関数の作り方と使い方
Pythonで関数を作るには、def(defineの略)というキーワードを使います。基本的な構造は以下の通りです。
def 関数名(引数1, 引数2, ...):
"""
この関数が何をするのかを説明する文章(Docstringと言います)。
"""
# このインデントされたブロック内に、関数が行う処理を書きます。
処理1
処理2
...
# return文で、関数の実行結果(完成品)を呼び出し元に返します。
return 戻り値
重要な用語:
- 定義 (Definition):
defを使って、関数の設計図を作ること。 - 呼び出し (Calling): 作った関数を、名前を使って実際に実行すること。
- 引数 (Argument/Parameter): 関数に渡す「材料」となるデータ。
- 戻り値 (Return Value): 関数が処理を終えて返す「結果」となるデータ。
returnがない場合、関数はNoneという「何もなし」を意味する値を返します。
Pythonコード例:簡単なBMI計算関数
では、身長と体重を受け取ってBMIを計算して返す、という簡単な関数を実際に作って使ってみましょう。
# --- 1. BMIを計算する関数を「定義」する ---
# defキーワードで、calculate_bmiという名前の関数を作り始めます。
# この関数は、weight_kg と height_m という2つの「引数」を受け取ります。
def calculate_bmi(weight_kg, height_m):
"""
体重(kg)と身長(m)からBMIを計算して返す関数。
"""
# BMIの計算式: 体重(kg) / (身長(m)の2乗)
# ** 2 は2乗を意味します。
bmi_value = weight_kg / (height_m ** 2)
# 計算したBMIの値を、この関数の結果として「戻り値」に設定します。
return bmi_value
# --- 2. 作成した関数を「呼び出し」てみる ---
# ある患者さんの体重と身長のデータを用意します。
patient_weight = 70.0 # kg
patient_height = 1.75 # m
# calculate_bmi関数を、具体的な値を引数として渡して呼び出します。
# 関数が返した値(戻り値)が、変数 calculated_bmi に代入されます。
calculated_bmi = calculate_bmi(weight_kg=patient_weight, height_m=patient_height)
# --- 3. 結果を表示する ---
# f-stringを使って、結果を分かりやすく表示します。
# :.2f は、小数点以下2桁まで表示するという書式指定です。
print(f"体重{patient_weight}kg, 身長{patient_height}m の患者さんのBMIは {calculated_bmi:.2f} です。")
# === ここから下が上記のprint文による実際の出力 ===
# 体重70.0kg, 身長1.75m の患者さんのBMIは 22.86 です。
3. 実践的な関数の設計 〜医療データで考える〜
関数の真価は、前回の講義で学んだif文やforループと組み合わせることで、さらに発揮されます。
Pythonコード例:BMIから肥満度を判定し、複数人を一括処理する
次に、先ほど作ったBMI計算関数を利用して、BMIの値から肥満度を判定し、さらに複数の患者さんに対してその処理をループで適用してみましょう。
# --- 1. BMIを計算する関数(再掲) ---
# この関数は、先ほど定義したものと同じです。部品として再利用します。
def calculate_bmi(weight_kg, height_m):
"""体重(kg)と身長(m)からBMIを計算して返す。"""
# 身長が0または負の値の場合のエラー処理を追加すると、より頑健になります。
if height_m <= 0:
return None # 計算できない場合はNoneを返す
return weight_kg / (height_m ** 2)
# --- 2. BMIの値から肥満度カテゴリを判定する新しい関数を定義 ---
def get_obesity_category(bmi):
"""BMIの値に基づいて、肥満度のカテゴリ(文字列)を返す関数。"""
# if-elif-else文を使って、条件に応じたカテゴリを判定します。
if bmi is None:
return "計算不能"
elif bmi < 18.5:
return "低体重"
elif bmi < 25.0:
return "普通体重"
elif bmi < 30.0:
return "肥満(1度)"
else:
return "肥満(2度以上)"
# --- 3. 複数の患者データ(辞書のリスト)を用意 ---
patient_data_list = [
{"id": "P001", "weight": 70.0, "height": 1.75},
{"id": "P002", "weight": 55.0, "height": 1.60},
{"id": "P003", "weight": 85.0, "height": 1.70},
{"id": "P004", "weight": 48.0, "height": 1.65}
]
# --- 4. forループと関数を組み合わせて、全患者を処理 ---
print("--- 全患者の肥満度チェック ---")
# リストから患者データを一人ずつ取り出してループします。
for patient in patient_data_list:
# 辞書からID、体重、身長を取り出します。
p_id = patient["id"]
p_weight = patient["weight"]
p_height = patient["height"]
# 1つ目の関数を呼び出してBMIを計算します。
bmi_result = calculate_bmi(p_weight, p_height)
# 2つ目の関数を呼び出して、計算したBMIからカテゴリを判定します。
category = get_obesity_category(bmi_result)
# 結果を分かりやすく表示します。
# bmi_resultがNoneでない場合のみ、数値をフォーマットして表示します。
if bmi_result is not None:
print(f"患者ID: {p_id}, BMI: {bmi_result:.2f}, 判定: {category}")
else:
print(f"患者ID: {p_id}, BMI: 計算不能, 判定: {category}")
# === ここから下が上記のprint文による実際の出力 ===
# --- 全患者の肥満度チェック ---
# 患者ID: P001, BMI: 22.86, 判定: 普通体重
# 患者ID: P002, BMI: 21.48, 判定: 普通体重
# 患者ID: P003, BMI: 29.41, 判定: 肥満(1度)
# 患者ID: P004, BMI: 17.63, 判定: 低体重
どうでしょうか。calculate_bmiとget_obesity_categoryという2つの「部品」を定義したことで、メインのforループの中身が非常にスッキリし、何をしているかが一目瞭然になりましたね。これが、関数を使ってプログラムを構造化する大きなメリットです。
4. まとめと次のステップへ
今回は、プログラムを整理整頓し、再利用可能にするための強力な道具、関数について学びました。
- 関数: 特定の処理をひとまとめにした「部品」。
def: 関数を「定義」するためのキーワード。- 引数: 関数に渡す「材料」。
return: 関数が返す「結果」。
この「処理を部品化する」という考え方は、プログラミングにおける最も重要な思考法の一つです。ご自身の研究で行う定型的な計算やデータ処理も、一度関数として定義しておけば、いつでも正確に、そして簡単に再利用できるようになります。
さて、関数を使って、コードの「部品」を作れるようになりました。しかし、データ(例えば患者さんの体重や身長)と、そのデータを扱う処理(calculate_bmi関数など)は、まだ別々の場所にあります。もし、「患者」という単位で、その患者さん自身が持つデータ(属性)と、その患者さんに対して行える操作(メソッド)を、一つの大きな「設計図」としてまとめられたら、もっと直感的で管理しやすそうだと思いませんか?
次回、「1.6:AI開発に欠かせないオブジェクト指向 ― クラスとインスタンスの基本」では、まさにそれを実現する、クラスとオブジェクト指向という、さらに一歩進んだプログラムの整理術について学んでいきます。
参考文献
- Python Software Foundation. Python 3.9.7 documentation – Defining Functions. [Internet]. 2021 [cited 2025 Jun 6]. Available from: https://docs.python.org/3/tutorial/controlflow.html#defining-functions
- Martin R. Clean Code: A Handbook of Agile Software Craftsmanship. Upper Saddle River, NJ: Prentice Hall; 2008. Chapter 3, Functions.
- Lutz M. Learning Python. 5th ed. Sebastopol, CA: O’Reilly Media; 2013. Part IV, Functions and Generators.
ご利用規約(免責事項)
当サイト(以下「本サイト」といいます)をご利用になる前に、本ご利用規約(以下「本規約」といいます)をよくお読みください。本サイトを利用された時点で、利用者は本規約の全ての条項に同意したものとみなします。
第1条(目的と情報の性質)
- 本サイトは、医療分野におけるAI技術に関する一般的な情報提供および技術的な学習機会の提供を唯一の目的とします。
- 本サイトで提供されるすべてのコンテンツ(文章、図表、コード、データセットの紹介等を含みますが、これらに限定されません)は、一般的な学習参考用であり、いかなる場合も医学的な助言、診断、治療、またはこれらに準ずる行為(以下「医行為等」といいます)を提供するものではありません。
- 本サイトのコンテンツは、特定の製品、技術、または治療法の有効性、安全性を保証、推奨、または広告・販売促進するものではありません。紹介する技術には研究開発段階のものが含まれており、その臨床応用には、さらなる研究と国内外の規制当局による正式な承認が別途必要です。
- 本サイトは、情報提供を目的としたものであり、特定の治療法を推奨するものではありません。健康に関するご懸念やご相談は、必ず専門の医療機関にご相談ください。
第2条(法令等の遵守)
利用者は、本サイトの利用にあたり、医師法、医薬品、医療機器等の品質、有効性及び安全性の確保等に関する法律(薬機法)、個人情報の保護に関する法律、医療法、医療広告ガイドライン、その他関連する国内外の全ての法令、条例、規則、および各省庁・学会等が定める最新のガイドライン等を、自らの責任において遵守するものとします。これらの適用判断についても、利用者が自ら関係各所に確認するものとし、本サイトは一切の責任を負いません。
第3条(医療行為における責任)
- 本サイトで紹介するAI技術・手法は、あくまで研究段階の技術的解説であり、実際の臨床現場での診断・治療を代替、補助、または推奨するものでは一切ありません。
- 医行為等に関する最終的な判断、決定、およびそれに伴う一切の責任は、必ず法律上その資格を認められた医療専門家(医師、歯科医師等)が負うものとします。AIによる出力を、資格を有する専門家による独立した検証および判断を経ずに利用することを固く禁じます。
- 本サイトの情報に基づくいかなる行為によって利用者または第三者に損害が生じた場合も、本サイト運営者は一切の責任を負いません。実際の臨床判断に際しては、必ず担当の医療専門家にご相談ください。本サイトの利用によって、利用者と本サイト運営者の間に、医師と患者の関係、またはその他いかなる専門的な関係も成立するものではありません。
第4条(情報の正確性・完全性・有用性)
- 本サイトは、掲載する情報(数値、事例、ソースコード、ライブラリのバージョン等)の正確性、完全性、網羅性、有用性、特定目的への適合性、その他一切の事項について、何ら保証するものではありません。
- 掲載情報は執筆時点のものであり、予告なく変更または削除されることがあります。また、技術の進展、ライブラリの更新等により、情報は古くなる可能性があります。利用者は、必ず自身で公式ドキュメント等の最新情報を確認し、自らの責任で情報を利用するものとします。
第5条(AI生成コンテンツに関する注意事項)
本サイトのコンテンツには、AIによる提案を基に作成された部分が含まれる場合がありますが、公開にあたっては人間による監修・編集を経ています。利用者が生成AI等を用いる際は、ハルシネーション(事実に基づかない情報の生成)やバイアスのリスクが内在することを十分に理解し、その出力を鵜呑みにすることなく、必ず専門家による検証を行うものとします。
第6条(知的財産権)
- 本サイトを構成するすべてのコンテンツに関する著作権、商標権、その他一切の知的財産権は、本サイト運営者または正当な権利を有する第三者に帰属します。
- 本サイトのコンテンツを引用、転載、複製、改変、その他の二次利用を行う場合は、著作権法その他関連法規を遵守し、必ず出典を明記するとともに、権利者の許諾を得るなど、適切な手続きを自らの責任で行うものとします。
第7条(プライバシー・倫理)
本サイトで紹介または言及されるデータセット等を利用する場合、利用者は当該データセットに付随するライセンス条件および研究倫理指針を厳格に遵守し、個人情報の匿名化や同意取得の確認など、適用される法規制に基づき必要とされるすべての措置を、自らの責任において講じるものとします。
第8条(利用環境)
本サイトで紹介するソースコードやライブラリは、執筆時点で特定のバージョンおよび実行環境(OS、ハードウェア、依存パッケージ等)を前提としています。利用者の環境における動作を保証するものではなく、互換性の問題等に起因するいかなる不利益・損害についても、本サイト運営者は責任を負いません。
第9条(免責事項)
- 本サイト運営者は、利用者が本サイトを利用したこと、または利用できなかったことによって生じる一切の損害(直接損害、間接損害、付随的損害、特別損害、懲罰的損害、逸失利益、データの消失、プログラムの毀損等を含みますが、これらに限定されません)について、その原因の如何を問わず、一切の法的責任を負わないものとします。
- 本サイトの利用は、学習および研究目的に限定されるものとし、それ以外の目的での利用はご遠慮ください。
- 本サイトの利用に関連して、利用者と第三者との間で紛争が生じた場合、利用者は自らの費用と責任においてこれを解決するものとし、本サイト運営者に一切の迷惑または損害を与えないものとします。
- 本サイト運営者は、いつでも予告なく本サイトの運営を中断、中止、または内容を変更できるものとし、これによって利用者に生じたいかなる損害についても責任を負いません。
第10条(規約の変更)
本サイト運営者は、必要と判断した場合、利用者の承諾を得ることなく、いつでも本規約を変更することができます。変更後の規約は、本サイト上に掲載された時点で効力を生じるものとし、利用者は変更後の規約に拘束されるものとします。
第11条(準拠法および合意管轄)
本規約の解釈にあたっては、日本法を準拠法とします。本サイトの利用および本規約に関連して生じる一切の紛争については、東京地方裁判所を第一審の専属的合意管轄裁判所とします。
For J³, may joy follow you.

