今回は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:以下表の当日の投与リストを作成
下記リスト使用してください。
# 患者ID(腕につけるバーコードの代わり), 薬種類, 薬の量
today_list = [['111', 'A', 100],
['222', 'B', 50],
[333, 'B', 80],
['444', 'C', 120],]
STEP2:薬検索関数の作成
# 薬の問い合わせ
# 引数:患者ID
# 返り値:薬種類、薬の量
def search_medicine(patient_id):
# 対象のpatient_idを検索
for p_id, med, val in today_list:
if --- コード追加 ---:
return --- コード追加 ---
STEP3:search_medicineを使って、患者ID’111’の薬検索。結果を表示
# 患者ID 「111」を検索
patient_id = '111'
med, val = --- コード追加 ---
print('検索結果:', patient_id, med, val)
出力例
検索結果: 111 A 100
STEP4:search_medicineを使って、患者ID’333’の薬検索。結果を表示
# 患者ID 「333」を検索
patient_id = '333'
med, val = --- コード追加 ---
print('検索結果:', patient_id, med, val)出力例。これではエラーが発生してしまいますね。
---------------------------------------------------------------------------
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’で検索
投与ミスが起きうるコードになります。
# 患者ID 「333」を検索
patient_id = '333'
try:
med, val = search_medicine(patient_id)
except --- コード追加 ---:
--- コード追加 ---
print('検索結果:', patient_id, med, val)出力例
検索結果: 333 A 100
STEP6:search_medicine検索のエラー対策。
exceptで検索エラー表示、elseの正常時のみprintで薬の種類、薬の量表示。患者ID ‘111’と’333’で検索
# 患者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:
--- コード追加 ---出力例
検索結果: 111 A 100 検索エラーです。 cannot unpack non-iterable NoneType object
STEP7:エラー名がわかりにくい。
search_medicineの中で、検索できない場合はraise Exception(‘メッセージ’)を使ってエラーを発生処理を追加
# 薬の問い合わせ
# 引数:患者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’で検索して確認
# 患者ID 「333」を検索
patient_id = '333'
try:
med, val = search_medicine(patient_id)
except --- コード追加 ---:
--- コード追加 ---
else:
--- コード追加 ---出力例です。文言は各自自由に設定です。
検索エラーです。 患者ID検索できず
STEP9:today_listから投与後の対象患者データ削除する関数を作成
# 投与後の登録で、リストから削除
# 引数:患者ID
def register(patient_id):
for l in today_list:
if --- コード追加 ---:
--- コード追加 ---
補足! リストから削除する remove関数 は同じ内容を削除します。
ですので多次元のリストは多次元の内容を remove関数 に渡す必要があります。
下記コードで再確認してみましょう。
list1 = [1, 2, 3, 4, 5, 6] print(list1) list1.remove(2) print(list1)
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を表示
patient_id = '111' --- コード追加 --- --- コード追加 ---
出力例
[['222', 'B', 50], [333, 'B', 80], ['444', 'C', 120]]
STEP11:患者ID’333’を関数を使って削除、today_listを表示
リストから削除できないので、2重投与の恐れがある
patient_id = '333' --- コード追加 --- --- コード追加 ---
出力例
[['222', 'B', 50], [333, 'B', 80], ['444', 'C', 120]]
STEP12:register関数内で、registerで削除処理しない場合には、raise Exception(‘メッセージ’)を使ってエラーを発生処理を追加
# 投与後の登録で、リストから削除
# 引数:患者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’で登録処理。
patient_id = '333'
try:
register(patient_id)
except --- コード追加 ---:
--- コード追加 ---出力例です。文言は自由に設定してください。
登録エラーです。 投与完了登録エラー
解答例

解答例(google driveリンク)を参照いただければと思います。
STEP1 :以下表の当日の投与リストを作成
下記リスト使用してください。
# 患者ID(腕につけるバーコードの代わり), 薬種類, 薬の量
today_list = [['111', 'A', 100],
['222', 'B', 50],
[333, 'B', 80],
['444', 'C', 120],]
STEP2:薬検索関数の作成
# 薬の問い合わせ
# 引数:患者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’の薬検索。結果を表示
# 患者ID 「111」を検索
patient_id = '111'
med, val = search_medicine(patient_id)
print('検索結果:', patient_id, med, val)
STEP4:search_medicineを使って、患者ID’333’の薬検索。結果を表示
# 患者ID 「333」を検索
patient_id = '333'
med, val = search_medicine(patient_id)
print('検索結果:', patient_id, med, val)
STEP5:search_medicineで検索時にtry文を使ってでエラー対策、exceptにpassを使う。患者ID’333’で検索
投与ミスが起きうるコードになります。
# 患者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’で検索
# 患者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(‘メッセージ’)を使ってエラーを発生処理を追加
# 薬の問い合わせ
# 引数:患者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’で検索して確認
# 患者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から投与後の対象患者データ削除する関数を作成
# 投与後の登録で、リストから削除
# 引数:患者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を表示
patient_id = '111' register(patient_id) today_list
STEP11:患者ID’333’を関数を使って削除、today_listを表示
リストから削除できないので、2重投与の恐れがある。
patient_id = '333' register(patient_id) today_list
STEP12:register関数内で、registerで削除処理しない場合には、raise Exception(‘メッセージ’)を使ってエラーを発生処理を追加
# 投与後の登録で、リストから削除
# 引数:患者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’で登録処理。
patient_id = '333'
try:
register(patient_id)
except Exception as e:
print('登録エラーです。', e)
まとめ|Pythonの例外処理の練習問題【try-except文の使用】

Pythonの例外処理を用いた練習問題を行いました。
try except文の理解を十分にしておく事が非常に重要ですので、途中でつまづいた方は再度以下のPythonの例外処理の記事を読み直す様にして下さい。
-

Pythonの例外処理【try,except文の扱い方について】
続きを見る
今回は以上となります。
