練習問題

8.5 練習問題

本章で習った内容を元に練習問題を解いてください。

問1 次の設問①~⑤について○か×で答えなさい。

設問
① 例外が発生すると必ずexceptブロックが処理される。
② 例外が発生していない場合でも、必ずfinallyブロック内の処理は実行される。
③ exceptブロックは複数記載することはできない
④ exceptでas 変数名を利用すると、例外の詳細な情報を取得できる。
⑤ raise文を使うことで意図的に例外を発生させることができる

問2 以下に示すソースコードを実行した結果として正しいものを答えなさい。

選択肢
① Redのみ画面に表示される。
② Red、Blue、Yellow、Pink、Black全て表示される。
③ Red、Blue、Pink、Blackが表示される。
④ Yellowのみ画面に表示される。
⑤ Red、Blue、Yellow、Pinkが表示される。
⑥ Blackのみ画面に表示される。

ソースコード

ソース・フォルダー: /Desktop/Python基礎講座
ファイル名: 第8章.ipynb
アクセスURL: http://localhost:8888/notebooks/Desktop/Python基礎講座/第8章.ipynb

    print('Red')
    try:
        numbers = range(2)
        print('Blue')
        print(numbers[2])
        print('Yellow')
    except IndexError:
        print('Pink')
    finally:
        print('Black')
	

問3 以下に示すソースコードを実行した場合、発生する可能性のある選択肢の例外を○か×で答えなさい。

選択肢
① KeyError(辞書など指定したキーに対応する要素がない場合に発生する例外)
② ZeroDivisionError(0除算エラー)
③ IndexError(リストでインデックス番号に対応する要素がない際に発生する例外)
④ ValueError(操作対象のオブジェクトの型は合っているけど、適切でない場合に発生するエラー(「int(‘three’)」))

ソースコード

ソース・フォルダー: /Desktop/Python基礎講座
ファイル名: 第8章.ipynb
アクセスURL: http://localhost:8888/notebooks/Desktop/Python基礎講座/第8章.ipynb

    cnt = 0
    total = 0
    ave = 0
    num = [0,1,2]

    #繰り返し処理(配列の要素数分)
    while True:
        #キーボードより数値を入力し配列に格納
        tmpNum = int(input('数値を入力して下さい。(999で強制終了)>'))
        #入力数値が999なら強制でループを抜ける
        if tmpNum == 999:
            break
        elif tmpNum < 999:
            num[cnt] = tmpNum
            cnt += 1
        else:
            num[cnt] = tmpNum

        for i in range(cnt):
            total += num[i]

        ave = total/cnt

        print('入力数は',cnt, 'です。')
        print('合計点は',total,'です。')
        print('平均点は',ave ,'です。') 
	

問4 問3のを実行して、ソースコードから整数文字以外を入力すると例外が発生します。整数文字以外が入力された際には、以下の実行結果になるプログラムを作成しなさい。作成する場合は問3のソースコードを利用し、変更仕様に従って下さい。

ソースコード

ソース・フォルダー: /Desktop/Python基礎講座
ファイル名: 第8章.ipynb
アクセスURL: http://localhost:8888/notebooks/Desktop/Python基礎講座/第8章.ipynb

変更仕様
  • 繰り返し処理内に例外処理(try~except)を追加し、再度キーボード入力を行えるようにする。
  • tryブロック内に含める処理は、whileブロック内全ての処理を含める。
  • exceptする例外はValueErrorを指定する。
  • exceptブロック内の処理は、「文字が入力されました。数値を入力して下さい。」のメッセージを画面に出力する。

問5 問4でキーボード入力値に関する例外は処理しましたが、それ以外にも以下に示す例外が発生します。

  • 999より大きい値を入力された場合:0除算の例外
  • 4回以上入力した場合:最大配列要素数越えの例外

上記を対処するあらゆる例外を処理するような例外処理を組み込んだプログラムを作成しなさい。
問4で作成したソースコードを利用し、変更仕様に従って作成して下さい。

ソースコード

ソース・フォルダー: /Desktop/Python基礎講座
ファイル名: 第8章.ipynb
アクセスURL: http://localhost:8888/notebooks/Desktop/Python基礎講座/第8章.ipynb

実行結果
  • 999より大きい値を入力した場合
	数値を入力して下さい。(999で強制終了)>1000
	---------------------------------------------------------------------------
	ZeroDivisionError                         Traceback (most recent call last)
	<ipython-input-7-caf05ff69d16> in <module>
	     20         total += num[i]
	     21 
	---> 22     ave = total/cnt
	     23 
	     24     print('入力数は',cnt, 'です。')

	ZeroDivisionError: division by zero
	
  • 4回以上入力した場合
	数値を入力して下さい。(999で強制終了)>66
	入力数は 1 です。
	合計点は 66 です。
	平均点は 66.0 です。
	数値を入力して下さい。(999で強制終了)>55
	入力数は 2 です。
	合計点は 187 です。
	平均点は 93.5 です。
	数値を入力して下さい。(999で強制終了)>20
	入力数は 3 です。
	合計点は 328 です。
	平均点は 109.33333333333333 です。
	数値を入力して下さい。(999で強制終了)>10
	---------------------------------------------------------------------------
	IndexError                                Traceback (most recent call last)
	<ipython-input-8-caf05ff69d16> in <module>
	     12         break
	     13     elif tmpNum < 999:
	---> 14         num[cnt] = tmpNum
	     15         cnt += 1
	     16     else:

	IndexError: list assignment index out of range
	

変更仕様
・tryブロックに含める処理に問3におけるwhile文内の全ての処理を含める。
・exceptブロック内の処理は、例外の詳細情報を画面に出力する。
  →「エラーの原因はxxxxです。」
   ※xxxx=例外の詳細情報


NEXT>> 8.6 練習問題 解答