質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

1430閲覧

Pythonでも例外処理について

rikubon_

総合スコア39

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/07/02 08:02

前提・実現したいこと

Pythonで複数のinput()を定義して途中のinput()でエラーが起きた際一番最初のinput()にもどってしまいます。解決策はありますでしょうか?例えばとして適当ですがじゃんけんゲームを例として書いてみました。勝負回数のところで文字列や4以上の数字を打つと最初から戻るので問題ないのですがじゃんけん中に3以上の数字や文字列を入力してしまうと最初からになってしまいます。改善策はありますでしょうか。

該当のソースコード

python3

1 2import random 3import time 4 5win = 0 6lose = 0 7draw = 0 8 9print('==じゃんけんしましょう!==') 10 11while True: 12 try: 13 count = int(input('何回勝負する?\ 14 \n1:1回\n2:3回\n3:5回\n4:それ以上')) 15 16 if count == 4: 17 num = int(input('何回勝負する?')) 18 else: 19 num = 0 20 21 count_dic = {1:1, 2:3, 3:5, 4:num} 22 hand_dic = {1:'グー', 2:'チョキ', 3:'パー'} 23 play_count = count_dic[count] 24 25 for i in range(play_count): 26 27 print(f'あなたの手はなに?({i+1}回目)\ 28 \n1:グー\n2:チョキ\n3:パー') 29 30 my_num = int(input('1から3の数字を入力してね。')) 31 32 com_num = random.randint(1,3) 33 34 my_hand = hand_dic[my_num] 35 com_hand = hand_dic[com_num] 36 37 if my_hand == com_hand: 38 print('あいこ!') 39 draw += 1 40 print(f'現在戦績 {win}勝{lose}敗{draw}引き分け') 41 time.sleep(0.5) 42 43 elif my_hand == 'グー': 44 if com_hand == 'パー': 45 print(f'君が{my_hand},相手が{com_hand}で君の負け') 46 lose += 1 47 elif com_hand == 'チョキ': 48 print(f'君が{my_hand},相手が{com_hand}で君の勝ち') 49 win += 1 50 print(f'現在戦績 {win}勝{lose}敗{draw}引き分け') 51 time.sleep(0.5) 52 53 elif my_hand == 'チョキ': 54 if com_hand == 'グー': 55 print(f'君が{my_hand},相手が{com_hand}で君の負け') 56 lose += 1 57 elif com_hand == 'パー': 58 print(f'君が{my_hand},相手が{com_hand}で君の勝ち') 59 win += 1 60 print(f'現在戦績 {win}勝{lose}敗{draw}引き分け') 61 time.sleep(0.5) 62 63 elif my_hand == 'パー': 64 if com_hand == 'チョキ': 65 print(f'君が{my_hand},相手が{com_hand}で君の負け') 66 lose += 1 67 elif com_hand == 'グー': 68 print(f'君が{my_hand},相手が{com_hand}で君の勝ち') 69 win += 1 70 print(f'現在戦績 {win}勝{lose}敗{draw}引き分け') 71 time.sleep(0.5) 72 73 except (KeyError, ValueError): 74 print('正しい数字を入力してね。') 75 76 77 78print('結果発表!!!') 79time.sleep(2) 80print(f'現在戦績 {win}勝{lose}敗{draw}引き分け') 81print(f'勝率 {(win/play_count)*100}%')

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

元の回答

次の箇所を書き換えます:

python

1 for i in range(play_count): 2 3 print(f'あなたの手はなに?({i+1}回目)\ 4 \n1:グー\n2:チョキ\n3:パー') 5 6 my_num = int(input('1から3の数字を入力してね。')) 7 8 com_num = random.randint(1,3) 9 10 my_hand = hand_dic[my_num] 11 com_hand = hand_dic[com_num] 12 13 if my_hand == com_hand: 14 print('あいこ!')

python

1 for i in range(play_count): 2 while True: 3 print(f'あなたの手はなに?({i+1}回目)\ 4 \n1:グー\n2:チョキ\n3:パー') 5 try: 6 my_num = int(input('1から3の数字を入力してね。')) 7 8 my_hand = hand_dic[my_num] 9 break 10 except (KeyError, ValueError): 11 print('正しい数字を入力してね。') 12 13 com_num = random.randint(1,3) 14 com_hand = hand_dic[com_num] 15 16 if my_hand == com_hand: 17 print('あいこ!')

新たな while ブロックを設け、その中で break を使い、
新たに設けた while ブロックによるループを抜けて、
while ブロックの後の、続きの処理を実行するようにするのがポイントです
(元からある while ブロックのループまでは抜けないことに注意します)

追記

このまま実行すると
最後の結果発表が出ずに
「何回勝負する?」の場所に戻ってきてしまいます。
解決策はありますか?

次に、解決策を含めた全体のコードを示します:

python

1import random 2import time 3 4win = 0 5lose = 0 6draw = 0 7 8print('==じゃんけんしましょう!==') 9 10while True: 11 count = int(input('何回勝負する?\ 12 \n1:1回\n2:3回\n3:5回\n4:それ以上')) 13 14 if count == 4: 15 num = int(input('何回勝負する?')) 16 else: 17 num = 0 18 19 count_dic = {1:1, 2:3, 3:5, 4:num} 20 try: 21 play_count = count_dic[count] 22 break 23 except (KeyError, ValueError): 24 print('正しい数字を入力してね。') 25 26hand_dic = {1:'グー', 2:'チョキ', 3:'パー'} 27 28for i in range(play_count): 29 while True: 30 print(f'あなたの手はなに?({i+1}回目)\ 31 \n1:グー\n2:チョキ\n3:パー') 32 33 my_num = int(input('1から3の数字を入力してね。')) 34 try: 35 my_hand = hand_dic[my_num] 36 break 37 except (KeyError, ValueError): 38 print('正しい数字を入力してね。') 39 40 com_num = random.randint(1,3) 41 com_hand = hand_dic[com_num] 42 43 if my_hand == com_hand: 44 print('あいこ!') 45 draw += 1 46 print(f'現在戦績 {win}{lose}{draw}引き分け') 47 time.sleep(0.5) 48 49 elif my_hand == 'グー': 50 if com_hand == 'パー': 51 print(f'君が{my_hand},相手が{com_hand}で君の負け') 52 lose += 1 53 elif com_hand == 'チョキ': 54 print(f'君が{my_hand},相手が{com_hand}で君の勝ち') 55 win += 1 56 print(f'現在戦績 {win}{lose}{draw}引き分け') 57 time.sleep(0.5) 58 59 elif my_hand == 'チョキ': 60 if com_hand == 'グー': 61 print(f'君が{my_hand},相手が{com_hand}で君の負け') 62 lose += 1 63 elif com_hand == 'パー': 64 print(f'君が{my_hand},相手が{com_hand}で君の勝ち') 65 win += 1 66 print(f'現在戦績 {win}{lose}{draw}引き分け') 67 time.sleep(0.5) 68 69 elif my_hand == 'パー': 70 if com_hand == 'チョキ': 71 print(f'君が{my_hand},相手が{com_hand}で君の負け') 72 lose += 1 73 elif com_hand == 'グー': 74 print(f'君が{my_hand},相手が{com_hand}で君の勝ち') 75 win += 1 76 print(f'現在戦績 {win}{lose}{draw}引き分け') 77 time.sleep(0.5) 78 79print('結果発表!!!') 80time.sleep(2) 81print(f'現在戦績 {win}{lose}{draw}引き分け') 82print(f'勝率 {(win/play_count)*100}%')

実行結果:

console

1$ python test.py 2==じゃんけんしましょう!== 3何回勝負する? 41:1回 52:3回 63:5回 74:それ以上1 8あなたの手はなに?(1回目) 91:グー 102:チョキ 113:パー 121から3の数字を入力してね。1 13君がグー,相手がチョキで君の勝ち 14現在戦績 1勝0敗0引き分け 15結果発表!!! 16現在戦績 1勝0敗0引き分け 17勝率 100.0% 18 19$

解決のポイント

最後の結果発表が出ずに
「何回勝負する?」の場所に戻ってきてしまいます。

この原因は、元からある while ブロックのループです
この while ブロックに break を追加してループから抜けることで
問題が解決します

While ブロックをなるべく小さくしよう

while ブロックが大きくなってくると
while ブロック自体を作ったことを忘れてしまったりして
プログラムが意図せず繰り返されてしまうときに
自分でも原因がわかりにくくなったりします

このとき、while が必要な理由を考え、
while ブロックの大きさを最小限にしておくと
繰り返し処理のコードの見通しがよくなり、
どこに bleak を追加すればよいかが見つけやすくなります

元からある while は、
おそらく「何回勝負する?」の問いに
正しい数字が入力されるまで繰り返したかったので
配置されたものと思われます

while のブロックを、正しい数字が入力されるまでの範囲だけに狭め、
正しい数字が入力された場合に break 行に到達するように処理を変更します:

python

1while True: 2 count = int(input('何回勝負する?\ 3 \n1:1回\n2:3回\n3:5回\n4:それ以上')) 4 5 if count == 4: 6 num = int(input('何回勝負する?')) 7 else: 8 num = 0 9 10 count_dic = {1:1, 2:3, 3:5, 4:num} 11 try: 12 play_count = count_dic[count] 13 break 14 except (KeyError, ValueError): 15 print('正しい数字を入力してね。')

投稿2020/07/02 08:20

編集2020/07/02 11:02
y_shinoda

総合スコア3272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rikubon_

2020/07/02 10:00

ありがとうございます。僕がしっかり写経できてないだけかもしれませんがこのまま実行すると最後の結果発表が出ずに南海勝負する?の場所に戻ってきてしまいます。解決策はありますか? ``` # 勝負回数と勝率の表示 import random import time win = 0 lose = 0 draw = 0 print('==じゃんけんしましょう!==') while True: try: count = int(input('何回勝負する?\ \n1:1回\n2:3回\n3:5回\n4:それ以上')) if count == 4: num = int(input('何回勝負する?')) else: num = 0 count_dic = {1:1, 2:3, 3:5, 4:num} hand_dic = {1:'グー', 2:'チョキ', 3:'パー'} play_count = count_dic[count] for i in range(play_count): while True: print(f'あなたの手はなに?({i+1}回目)\ \n1:グー\n2:チョキ\n3:パー') try: my_num = int(input('1から3の数字を入力してね。')) my_hand = hand_dic[my_num] break except (KeyError, ValueError): print('正しい数字を入力してね。') time.sleep(0.7) com_num = random.randint(1,3) com_hand = hand_dic[com_num] if my_hand == com_hand: print('あいこ!') draw += 1 print(f'現在戦績 {win}勝{lose}敗{draw}引き分け') time.sleep(0.5) elif my_hand == 'グー': if com_hand == 'パー': print(f'君が{my_hand},相手が{com_hand}で君の負け') lose += 1 elif com_hand == 'チョキ': print(f'君が{my_hand},相手が{com_hand}で君の勝ち') win += 1 print(f'現在戦績 {win}勝{lose}敗{draw}引き分け') time.sleep(0.5) elif my_hand == 'チョキ': if com_hand == 'グー': print(f'君が{my_hand},相手が{com_hand}で君の負け') lose += 1 elif com_hand == 'パー': print(f'君が{my_hand},相手が{com_hand}で君の勝ち') win += 1 print(f'現在戦績 {win}勝{lose}敗{draw}引き分け') time.sleep(0.5) elif my_hand == 'パー': if com_hand == 'チョキ': print(f'君が{my_hand},相手が{com_hand}で君の負け') lose += 1 elif com_hand == 'グー': print(f'君が{my_hand},相手が{com_hand}で君の勝ち') win += 1 print(f'現在戦績 {win}勝{lose}敗{draw}引き分け') time.sleep(0.5) except (KeyError, ValueError): print('正しい数字を入力してね。') time.sleep(0.7) print('結果発表!!!') time.sleep(2) print(f'現在戦績 {win}勝{lose}敗{draw}引き分け') print(f'勝率 {(win/play_count)*100}%') ```
rikubon_

2020/07/02 10:01

# 勝負回数と勝率の表示 import random import time win = 0 lose = 0 draw = 0 print('==じゃんけんしましょう!==') while True: try: count = int(input('何回勝負する?\ \n1:1回\n2:3回\n3:5回\n4:それ以上')) if count == 4: num = int(input('何回勝負する?')) else: num = 0 count_dic = {1:1, 2:3, 3:5, 4:num} hand_dic = {1:'グー', 2:'チョキ', 3:'パー'} play_count = count_dic[count] for i in range(play_count): while True: print(f'あなたの手はなに?({i+1}回目)\ \n1:グー\n2:チョキ\n3:パー') try: my_num = int(input('1から3の数字を入力してね。')) my_hand = hand_dic[my_num] break except (KeyError, ValueError): print('正しい数字を入力してね。') time.sleep(0.7) com_num = random.randint(1,3) com_hand = hand_dic[com_num] if my_hand == com_hand: print('あいこ!') draw += 1 print(f'現在戦績 {win}勝{lose}敗{draw}引き分け') time.sleep(0.5) elif my_hand == 'グー': if com_hand == 'パー': print(f'君が{my_hand},相手が{com_hand}で君の負け') lose += 1 elif com_hand == 'チョキ': print(f'君が{my_hand},相手が{com_hand}で君の勝ち') win += 1 print(f'現在戦績 {win}勝{lose}敗{draw}引き分け') time.sleep(0.5) elif my_hand == 'チョキ': if com_hand == 'グー': print(f'君が{my_hand},相手が{com_hand}で君の負け') lose += 1 elif com_hand == 'パー': print(f'君が{my_hand},相手が{com_hand}で君の勝ち') win += 1 print(f'現在戦績 {win}勝{lose}敗{draw}引き分け') time.sleep(0.5) elif my_hand == 'パー': if com_hand == 'チョキ': print(f'君が{my_hand},相手が{com_hand}で君の負け') lose += 1 elif com_hand == 'グー': print(f'君が{my_hand},相手が{com_hand}で君の勝ち') win += 1 print(f'現在戦績 {win}勝{lose}敗{draw}引き分け') time.sleep(0.5) except (KeyError, ValueError): print('正しい数字を入力してね。') time.sleep(0.7) print('結果発表!!!') time.sleep(2) print(f'現在戦績 {win}勝{lose}敗{draw}引き分け') print(f'勝率 {(win/play_count)*100}%')
y_shinoda

2020/07/02 11:04

回答に追記しました、ご確認おねがいします (回答の返答欄では Phthon のコードは表現できないので 返答欄のコードは確認できていません)
guest

0

以下のように指定された範囲の数値を入力させる関数を用意して、その関数を呼べばよいでしょう。

Python

1 2def num_inp( inp_msg, min_num = 0, max_num = 0, err_msg = 'error'): 3 while True: 4 try: 5 n = int(input(inp_msg)) 6 if n >= min_num and n <= max_num: 7 return n 8 except ValueError: 9 pass 10 print(err_msg) 11 12count = num_inp('input count : ', 1, 4) 13for _ in range(count): 14 hand = num_inp('input hand : ', 0, 2) 15 print( hand) 16

投稿2020/07/02 08:17

can110

総合スコア38234

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問