今回はPythonの例外処理(特にtry-except文を使用した)の練習問題になります。
Pythonの例外処理については、以下の記事を参考にして下さい。
Pythonの例外処理【try,except文の扱い方について】
続きを見る
【try-except文】Pythonの例外処理の練習問題【病院での患者の点滴、薬の投与】
病院での薬の投与を題材に try-except
文を学んでいきたいと思います。
課題のイメージは下記図になります。
きちんとエラー処理がされずに、「投与ミス」「2重投与」など医療ミスが起きうる状態と、その対策についてPythonで確認していきましょう。
あくまで課題ですので、実際の現場のシステムとは違う点はご了承ください。
仕様(実装手順)
仕様(実装手順)は以下です。
仕様(実装手順)
- 以下表の当日の投与リストを作成する。
- 薬を検索する関数の作成する。
- search_medicineを使って、患者ID’111’の薬検索。結果を表示する。
- search_medicineを使って、患者ID’333’の薬検索。結果を表示する。
- search_medicineで検索時にtry文を使ってでエラー対策を行う。
exceptにpassを使う。
患者ID’333’で検索する。 - search_medicine検索のエラー対策を行う。
exceptで検索エラー表示、elseの正常時のみprintで薬の種類、薬の量表示する。
患者ID ‘111’と’333’で検索する。 - search_medicineの中で、検索できない場合はraise Exception(‘メッセージ’)を使ってエラーを発生処理を追加する。
- 患者ID’333’で検索して確認する。
- today_listから投与後の対象患者データ削除する関数を作成する。
- registerを使って、患者ID’111’を削除。today_listを表示する。
- 患者ID’333’を関数を使って削除、today_listを表示する。
リストから削除できないので、2重投与の恐れがある。 - register関数内で、registerで削除処理しない場合には、raise Exception(‘メッセージ’)を使ってエラーを発生処理を追加する。
- register関数使用時もtry文でエラー処理を追加。exceptでエラー名を表示。患者ID’333’で登録処理する。
以下、当日の投与リストの表になります。
患者ID 333 だけエラー発生用に数値で登録されたとします。
患者ID | 薬の種類 | 薬の量 |
‘111’ | ‘A’ | 100 |
‘222’ | ‘B’ | 50 |
333 | ‘B’ | 80 |
‘444’ | ‘C’ | 120 |
では cording を行う際の各々のステップについて、見ていきましょう。
step
1薬検索関数の作成
- 関数名:
search_medicine
- 引数:
患者ID
- 返り値:
薬種類、薬の量
step
2search_medicineを使って、患者ID’111’の薬検索。結果を表示
step
3search_medicineを使って、患者ID’333’の薬検索。結果を表示
step
4search_medicineで検索時にtry文を使ってでエラー対策、exceptにpassを使う。患者ID’333’で検索
投与ミスが起きうるコードになります。
step
5search_medicine検索のエラー対策
exceptで検索エラー表示、elseの正常時のみprintで薬の種類、薬の量表示。患者ID ‘111’と’333’で検索
step
6raise Exception(‘メッセージ’)を使ってエラーを発生処理を追加
エラー名がわかりにくいので、search_medicineの中で、検索できない場合はraise Exception(‘メッセージ’)を使ってエラーを発生処理を追加
step
7患者ID’333’で検索して確認
step
8today_listから投与後の対象患者データ削除する関数を作成
- 関数名:
register
- 引数:
患者ID
step
9registerを使って、患者ID’111’を削除。today_listを表示
step
10患者ID’333’を関数を使って削除、today_listを表示
リストから削除できないので、2重投与の恐れがあるので注意。
step
11register関数内で、registerで削除処理しない場合には、raise Exception(‘メッセージ’)を使ってエラーを発生処理を追加
step
12register関数使用時もtry文でエラー処理を追加。exceptでエラー名を表示。患者ID’333’で登録処理。
演習方法1 | 自分で全てcordingを行う
課題と仕様(実装手順)を見て、自身でコーディングしてみてください。
コーディングに不安な方は、演習方法2のコードの穴埋めにて演習を実施してください。
演習方法2 | google drive を利用する
— コード追加 —
に1行ずつコードを埋めていって、プログラムを完成させてください。
演習のJupyter notebookをご利用される方は演習(google driveリンク)を参照いただければと思います。
STEP1:以下表の当日の投与リストを作成
下記リスト使用してください。
1 2 3 4 5 | # 患者ID(腕につけるバーコードの代わり), 薬種類, 薬の量 today_list = [['111', 'A', 100], ['222', 'B', 50], [333, 'B', 80], ['444', 'C', 120],] |
STEP2:薬検索関数の作成
1 2 3 4 5 6 7 8 | # 薬の問い合わせ # 引数:患者ID # 返り値:薬種類、薬の量 def search_medicine(patient_id): # 対象のpatient_idを検索 for p_id, med, val in today_list: if --- コード追加 ---: return --- コード追加 --- |
STEP3:search_medicineを使って、患者ID’111’の薬検索。結果を表示
1 2 3 4 | # 患者ID 「111」を検索 patient_id = '111' med, val = --- コード追加 --- print('検索結果:', patient_id, med, val) |
出力例
1 | 検索結果: 111 A 100 |
STEP4:search_medicineを使って、患者ID’333’の薬検索。結果を表示
1 2 3 4 | # 患者ID 「333」を検索 patient_id = '333' med, val = --- コード追加 --- print('検索結果:', patient_id, med, val) |
出力例。これではエラーが発生してしまいますね。
1 2 3 4 5 6 7 8 9 | --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-4-0805ef9b2907> in <module> 1 # 患者ID 「333」を検索 2 patient_id = '333' ----> 3 med, val = search_medicine(patient_id) 4 print('検索結果:', patient_id, med, val) TypeError: cannot unpack non-iterable NoneType object |
STEP5:search_medicineで検索時にtry文を使ってでエラー対策、exceptにpassを使う。患者ID’333’で検索
投与ミスが起きうるコードになります。
1 2 3 4 5 6 7 | # 患者ID 「333」を検索 patient_id = '333' try: med, val = search_medicine(patient_id) except --- コード追加 ---: --- コード追加 --- print('検索結果:', patient_id, med, val) |
出力例
1 | 検索結果: 333 A 100 |
STEP6:search_medicine検索のエラー対策。
exceptで検索エラー表示、elseの正常時のみprintで薬の種類、薬の量表示。患者ID ‘111’と’333’で検索
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # 患者ID 「111」を検索 patient_id = '111' try: med, val = search_medicine(patient_id) except --- コード追加 ---: --- コード追加 --- else: --- コード追加 --- # 患者ID 「333」を検索 patient_id = '333' try: med, val = search_medicine(patient_id) except --- コード追加 ---: --- コード追加 --- else: --- コード追加 --- |
出力例
1 2 | 検索結果: 111 A 100 検索エラーです。 cannot unpack non-iterable NoneType object |
STEP7:エラー名がわかりにくい。
search_medicineの中で、検索できない場合はraise Exception(‘メッセージ’)を使ってエラーを発生処理を追加
1 2 3 4 5 6 7 8 9 | # 薬の問い合わせ # 引数:患者ID # 返り値:薬種類、薬の量 def search_medicine(patient_id): # 対象のpatient_idを検索 for p_id, med, val in today_list: if p_id == patient_id: return med, val raise --- コード追加 --- |
STEP8:患者ID’333’で検索して確認
1 2 3 4 5 6 7 8 | # 患者ID 「333」を検索 patient_id = '333' try: med, val = search_medicine(patient_id) except --- コード追加 ---: --- コード追加 --- else: --- コード追加 --- |
出力例です。文言は各自自由に設定です。
1 | 検索エラーです。 患者ID検索できず |
STEP9:today_listから投与後の対象患者データ削除する関数を作成
1 2 3 4 5 6 | # 投与後の登録で、リストから削除 # 引数:患者ID def register(patient_id): for l in today_list: if --- コード追加 ---: --- コード追加 --- |
補足! リストから削除する remove関数
は同じ内容を削除します。
ですので多次元のリストは多次元の内容を remove関数
に渡す必要があります。
下記コードで再確認してみましょう。
1 2 3 4 | list1 = [1, 2, 3, 4, 5, 6] print(list1) list1.remove(2) print(list1) |
1 2 3 4 5 6 7 8 | list2 = [[1, 2], [3, 4], [5, 6]] print(list2) list2.remove([1, 2]) print(list2) list2.remove(3) # 3と同じ要素はないのでエラー print(list2) |
STEP10:registerを使って、患者ID’111’を削除。today_listを表示
1 2 3 | patient_id = '111' --- コード追加 --- --- コード追加 --- |
出力例
1 | [['222', 'B', 50], [333, 'B', 80], ['444', 'C', 120]] |
STEP11:患者ID’333’を関数を使って削除、today_listを表示
リストから削除できないので、2重投与の恐れがある
1 2 3 | patient_id = '333' --- コード追加 --- --- コード追加 --- |
出力例
1 | [['222', 'B', 50], [333, 'B', 80], ['444', 'C', 120]] |
STEP12:register関数内で、registerで削除処理しない場合には、raise Exception(‘メッセージ’)を使ってエラーを発生処理を追加
1 2 3 4 5 6 7 8 9 10 11 | # 投与後の登録で、リストから削除 # 引数:患者ID def register(patient_id): done_remove = False for l in today_list: if patient_id == l[0]: today_list.remove(l) done_remove = True if not done_remove: --- コード追加 --- |
STEP13:register関数使用時もtry文でエラー処理を追加。exceptでエラー名を表示。患者ID’333’で登録処理。
1 2 3 4 5 | patient_id = '333' try: register(patient_id) except --- コード追加 ---: --- コード追加 --- |
出力例です。文言は自由に設定してください。
1 | 登録エラーです。 投与完了登録エラー |
解答例
解答例(google driveリンク)を参照いただければと思います。
STEP1 :以下表の当日の投与リストを作成
下記リスト使用してください。
1 2 3 4 5 | # 患者ID(腕につけるバーコードの代わり), 薬種類, 薬の量 today_list = [['111', 'A', 100], ['222', 'B', 50], [333, 'B', 80], ['444', 'C', 120],] |
STEP2:薬検索関数の作成
1 2 3 4 5 6 7 8 | # 薬の問い合わせ # 引数:患者ID # 返り値:薬種類、薬の量 def search_medicine(patient_id): # 対象のpatient_idを検索 for p_id, med, val in today_list: if p_id == patient_id: return med, val |
STEP3:search_medicineを使って、患者ID’111’の薬検索。結果を表示
1 2 3 4 | # 患者ID 「111」を検索 patient_id = '111' med, val = search_medicine(patient_id) print('検索結果:', patient_id, med, val) |
STEP4:search_medicineを使って、患者ID’333’の薬検索。結果を表示
1 2 3 4 | # 患者ID 「333」を検索 patient_id = '333' med, val = search_medicine(patient_id) print('検索結果:', patient_id, med, val) |
STEP5:search_medicineで検索時にtry文を使ってでエラー対策、exceptにpassを使う。患者ID’333’で検索
投与ミスが起きうるコードになります。
1 2 3 4 5 6 7 | # 患者ID 「333」を検索 patient_id = '333' try: med, val = search_medicine(patient_id) except Exception as e: pass print('検索結果:', patient_id, med, val) |
STEP6:search_medicine検索のエラー対策。
exceptで検索エラー表示、elseの正常時のみprintで薬の種類、薬の量表示。患者ID ‘111’と’333’で検索
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | # 患者ID 「111」を検索 patient_id = '111' try: med, val = search_medicine(patient_id) except Exception as e: print('検索エラーです。', e) else: print('検索結果:', patient_id, med, val) # 患者ID 「333」を検索 patient_id = '333' try: med, val = search_medicine(patient_id) except Exception as e: print('検索エラーです。', e) else: print('検索結果:', patient_id, med, val) |
STEP7:エラー名がわかりにくいので、search_medicineの中で、
検索できない場合はraise Exception(‘メッセージ’)を使ってエラーを発生処理を追加
1 2 3 4 5 6 7 8 9 | # 薬の問い合わせ # 引数:患者ID # 返り値:薬種類、薬の量 def search_medicine(patient_id): # 対象のpatient_idを検索 for p_id, med, val in today_list: if p_id == patient_id: return med, val raise Exception('患者ID検索できず') |
STEP8:患者ID’333’で検索して確認
1 2 3 4 5 6 7 8 | # 患者ID 「333」を検索 patient_id = '333' try: med, val = search_medicine(patient_id) except Exception as e: print('検索エラーです。', e) else: print('検索結果:', patient_id, med, val) |
STEP9:today_listから投与後の対象患者データ削除する関数を作成
1 2 3 4 5 6 | # 投与後の登録で、リストから削除 # 引数:患者ID def register(patient_id): for l in today_list: if patient_id == l[0]: today_list.remove(l) |
STEP10:registerを使って、患者ID’111’を削除。today_listを表示
1 2 3 | patient_id = '111' register(patient_id) today_list |
STEP11:患者ID’333’を関数を使って削除、today_listを表示
リストから削除できないので、2重投与の恐れがある。
1 2 3 | patient_id = '333' register(patient_id) today_list |
STEP12:register関数内で、registerで削除処理しない場合には、raise Exception(‘メッセージ’)を使ってエラーを発生処理を追加
1 2 3 4 5 6 7 8 9 10 11 | # 投与後の登録で、リストから削除 # 引数:患者ID def register(patient_id): done_remove = False for l in today_list: if patient_id == l[0]: today_list.remove(l) done_remove = True if not done_remove: raise Exception('投与完了登録エラー') |
STEP13:register関数使用時もtry文でエラー処理を追加。exceptでエラー名を表示。患者ID’333’で登録処理。
1 2 3 4 5 | patient_id = '333' try: register(patient_id) except Exception as e: print('登録エラーです。', e) |
まとめ|Pythonの例外処理の練習問題【try-except文の使用】
Pythonの例外処理を用いた練習問題を行いました。
try except文の理解を十分にしておく事が非常に重要ですので、途中でつまづいた方は再度以下のPythonの例外処理の記事を読み直す様にして下さい。
Pythonの例外処理【try,except文の扱い方について】
続きを見る
今回は以上となります。