2023/10/10 (火) start

Python 練習コード

問題1)
ユーザーに整数値入力を求めた時、間違って文字が入力され、int(数値型)に変換する際にValueErrorが出てしまう。このエラー処理(例外処理)に対応しつつ、2つの数を求め、何某かの演算操作の結果を出力するコードを作成せよ。演算操作は任意とする。

#2つの正数の和の正の平方根を求める.
from math import sqrt

print("第一入力で半角英字zを入力すると、ループを終了します。")
active = True

while active:
    tem_num_1 = input("\n正数を入力:")
    if tem_num_1 == 'z':
        active = False
     print("終了します。")
    else:       
        try:
            operation_num_1 = int(tem_num_1)
            tem_num_2 = input("別の正数を入力:")
            operation_num_2 = int(tem_num_2)
            result = sqrt(operation_num_1 + operation_num_2)
            
        except ValueError:
            print("文字を検出:数字キーを押下して下さい。")
            
        else:
            print("\n2数の和の正の平方根:{:.2f}".format(result))

#実行結果
第一入力で半角英字zを入力すると、ループを終了します。

正数を入力:654
別の正数を入力:254

2数の和の正の平方根:30.13

正数を入力:f
文字を検出:数字キーを押下して下さい。

正数を入力:6
別の正数を入力:s
文字を検出:数字キーを押下して下さい。

正数を入力:z
終了します。

小数点第2位表示になっているのは.format()フォーマットメッソドで指定しているからである。少し、このメソッドを説明しておこう。例えば、"明日の天候は晴れである。"で、printで出力するとして、引数を'明日','天候','晴れ'としたら、print("{0}の{1}は{2}である。".format('明日', '天候', '晴れ'))とする。数字は引数の順序であり、0から始める。数字を入れなくてもデフォルトでは{}に引数を順番で入れるようになっている。引数は変数を用いてもよい。t = '明日', w = '天候', f = '晴れ'として、print("{}の{}は{}である。".format(t, w, f))となる。過去のコラムで用いているが、f-stringsは引数を用いずにprint(f"{t}の{w}は{f}である。")で、同様の文章が出力される。
前のコラム等で言及していなかったが、データの型でstr型(文字列)、int型(数値)は意識しておいてもらいたい。上のコード内で'z'というように、' '記号でzを囲んでいるがこれはzがstr型と宣言している。input()関数のデータはstr型でint()関数を用いることで、int型に変換している。MS officeのExcelを新規で開き、何某かの書式設定を施していないならば、文字を入力するとセルの左端、数値入力ではセルの右端にと表示されるはず。Excelでもデータ型は区別している。Pythonで型が不明なときは対話型シェルでtype(変数)を入力実行すれば、数種類の型表示があるが、<クラス(class) 'str'>とか<クラス(class) 'int'>等々とかで表示される。エラーがでればトレースバックでstrやintの型エラーかは英語表示だが、よく観察すれば、練習を積んでいくうちに理解できると思っている。

問題2)
会合の欠席者に氏名を入力してもらい、欠席名簿をテキストファイルに保存せよ。

"""
集会があるとして、欠席者に名前を入力してもらい、氏名をテキストファイルに
書き込みする。
"""

filename = 'absentee.txt'

with open(filename, 'a', encoding='utf-8') as f:
    print("明日の会合に欠席する人は氏名を入力して下さい。")
    confirm_answer = input(" 欠席で宜しいなら、y を 違うなら n を入力。: ")
    while True:
        if confirm_answer == 'n':
            print("入力終了です。")
            break
        absent_name = input("氏名を入力して下さい。: ")
        f.write(f"{absent_name}\n")
        
        print("\nこれで入力を終えるなら、finを入力願います。継続入力は任意の文字キーを押下。")
        fin_answer = input("終了しますか?: ")
        
        if fin_answer == 'fin':
            print("\n終了します。ありがとうございました。")
            break

#対話シェルでの実行出力
明日の会合に欠席する人は氏名を入力して下さい。
 欠席で宜しいなら、y を 違うなら n を入力。: y
氏名を入力して下さい。: 怪盗 ルパン

これで入力を終えるなら、finを入力願います。継続入力は任意の文字キーを押下。
終了しますか?: g
氏名を入力して下さい。: 次元 大介

これで入力を終えるなら、finを入力願います。継続入力は任意の文字キーを押下。
終了しますか?: h
氏名を入力して下さい。: 峰 不二子

これで入力を終えるなら、finを入力願います。継続入力は任意の文字キーを押下。
終了しますか?: j
氏名を入力して下さい。: 銭形 幸一

これで入力を終えるなら、finを入力願います。継続入力は任意の文字キーを押下。
終了しますか?: fin

終了します。ありがとうございました。

# 第一入力で n を押下
明日の会合に欠席する人は氏名を入力して下さい。
 欠席で宜しいなら、y を 違うなら n を入力。: n
入力終了です。

# absentee.txtとして保存された内容
会合欠席者:
怪盗 ルパン
峰 不二子
次元 大介
銭形 幸一

whileを用いたループで変数にフラグを持たせ終了させる方法もあるが、breakという実行停止命令を利用。テキストファイルでは最初に'会合欠席者:'を入力しておいて保存しておいた。with open(filename, 'a')の'a'は追記モードの指定である。これであれば、プログラムを何度も実行させ、氏名入力すると、銭形の下へ新規氏名が追加されてゆく。 仮に'a'ではなく'w'での書き込みモードで行って、第一入力でnを押下し終了させると、会合欠席者:というタイトルも消えてしまう。つまり、データがオーバーライドされる。モードには、'r'と'r+'もあり、前者が読込みモード、後者が読書きモードである。指定されなければ、デフォルトでは読込みモードである。読込みモードでは最初からファイル保存されていなければ、FileNotFoundErrorのトレースバックが返される。
▲ トップへ戻る


戻る
カテゴリー