Python 例外処理 練習問題 try except

python

Pythonの例外処理の練習問題【try-except文の使用】

今回はPythonの例外処理(特にtry-except文を使用した)の練習問題になります。

Pythonの例外処理については、以下の記事を参考にして下さい。

関連記事
Python 例外処理 try, except else finally 使い方
Pythonの例外処理【try,except文の扱い方について】

続きを見る

 

【try-except文】Pythonの例外処理の練習問題【病院での患者の点滴、薬の投与】

Python 例外処理 練習問題 try except

病院での薬の投与を題材に try-except 文を学んでいきたいと思います。

 

課題のイメージは下記図になります。

Python 例外処理 練習問題 try except

病院での患者の点滴、薬の投与の流れ

 

きちんとエラー処理がされずに、「投与ミス」「2重投与」など医療ミスが起きうる状態と、その対策についてPythonで確認していきましょう。

 

あくまで課題ですので、実際の現場のシステムとは違う点はご了承ください。

 

仕様(実装手順)

Python 例外処理 練習問題 try except

仕様(実装手順)は以下です。

 

 仕様(実装手順)

  1. 以下表の当日の投与リストを作成する。
  2. 薬を検索する関数の作成する。
  3. search_medicineを使って、患者ID’111’の薬検索。結果を表示する。
  4. search_medicineを使って、患者ID’333’の薬検索。結果を表示する。
  5. search_medicineで検索時にtry文を使ってでエラー対策を行う。
    exceptにpassを使う。
    患者ID’333’で検索する。
  6. search_medicine検索のエラー対策を行う。
    exceptで検索エラー表示、elseの正常時のみprintで薬の種類、薬の量表示する。
    患者ID ‘111’と’333’で検索する。
  7. search_medicineの中で、検索できない場合はraise Exception(‘メッセージ’)を使ってエラーを発生処理を追加する。
  8. 患者ID’333’で検索して確認する。
  9. today_listから投与後の対象患者データ削除する関数を作成する。
  10. registerを使って、患者ID’111’を削除。today_listを表示する。
  11. 患者ID’333’を関数を使って削除、today_listを表示する。
    リストから削除できないので、2重投与の恐れがある。
  12. register関数内で、registerで削除処理しない場合には、raise Exception(‘メッセージ’)を使ってエラーを発生処理を追加する。
  13. 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
2
search_medicineを使って、患者ID’111’の薬検索。結果を表示

step
3
search_medicineを使って、患者ID’333’の薬検索。結果を表示

step
4
search_medicineで検索時にtry文を使ってでエラー対策、exceptにpassを使う。患者ID’333’で検索

投与ミスが起きうるコードになります。

step
5
search_medicine検索のエラー対策

exceptで検索エラー表示、elseの正常時のみprintで薬の種類、薬の量表示。患者ID ‘111’と’333’で検索

step
6
raise Exception(‘メッセージ’)を使ってエラーを発生処理を追加

エラー名がわかりにくいので、search_medicineの中で、検索できない場合はraise Exception(‘メッセージ’)を使ってエラーを発生処理を追加

step
7
患者ID’333’で検索して確認

step
8
today_listから投与後の対象患者データ削除する関数を作成

  • 関数名:register
  • 引数:患者ID

step
9
registerを使って、患者ID’111’を削除。today_listを表示

step
10
患者ID’333’を関数を使って削除、today_listを表示

リストから削除できないので、2重投与の恐れがあるので注意。

step
11
register関数内で、registerで削除処理しない場合には、raise Exception(‘メッセージ’)を使ってエラーを発生処理を追加

step
12
register関数使用時もtry文でエラー処理を追加。exceptでエラー名を表示。患者ID’333’で登録処理。

 

演習方法1 | 自分で全てcordingを行う

Python 例外処理 練習問題 try except

課題と仕様(実装手順)を見て、自身でコーディングしてみてください。

 

コーディングに不安な方は、演習方法2のコードの穴埋めにて演習を実施してください。

 

演習方法2 | google drive を利用する

Python 例外処理 練習問題 try except

— コード追加 — に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 --- コード追加 ---:
    --- コード追加 ---

出力例です。文言は自由に設定してください。

登録エラーです。 投与完了登録エラー

 

解答例

Python 例外処理 練習問題 try 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の例外処理を用いた練習問題を行いました。

 

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

 

関連記事
Python 例外処理 try, except else finally 使い方
Pythonの例外処理【try,except文の扱い方について】

続きを見る

 

今回は以上となります。

 

 

人気記事 機械学習は挫折しやすい【←挫折が多い原因と挫折回避の方法を教えます】

人気記事 無料あり:機械学習エンジニアの僕がおすすめするAI(機械学習)特化型プログラミングスクール3社


-python
-, ,