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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

4705閲覧

int のみ受け入れ str, float をはじきたい

dws

総合スコア17

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/01/17 10:00

Python3 であっち向いてホイのゲームを作ろうとしています。

じゃんけんの自手の入力(数字)とその数字によってグー、チョキ、パーの区別をする関数を設定しました。

指示通りに整数を入力されれば意図したとおりに動作します。しかし、小数や文字列を入力されたときにエラーとなってしまいます。

int(input()) を変えて修正しようといろいろ試みたのですが、うまくいきません。どうしたらよいか教えてください。

以下がコードです。
def inputjanken(): の me = int(input())
def inputAcchi(): の FaceM = int(input())
の部分で困っています。

ほかの箇所は参考になるかと思って載せましたが、問題とは関係ないです。
よろしくお願いします。

python

1import random 2 3def inputjanken(): 4 print("1,2,3 がそれぞれ グー、チョキ、パー に該当します。\n1~3の中で好きな数字を選んで下さい。") 5 global me 6 global teM 7 me = int(input()) 8 if me == 1: 9 teM = "グー" 10 elif me == 2: 11 teM = "チョキ" 12 elif me == 3: 13 teM = "パー" 14 else: 15 teM = "不明、やり直して下さい。\n" 16 print("あなたの手は "+teM) 17 18def PCjanken(): 19 global PC 20 global teP 21 PC = random.randint(1,3) 22 if PC == 1: 23 teP = "グー" 24 elif PC == 2: 25 teP = "チョキ" 26 elif PC == 3: 27 teP = "パー" 28 else: 29 teP = "不明、やり直して下さい。" 30 print(" \nPCの手は "+teP) 31 print(" ") 32 33def janken(): 34 global me 35 global PC 36 global ResultJ 37 if me == PC: 38 ResultJ = [1,"あいこ、もう一回\n"] 39 elif (me == 1 and PC == 2) or (me == 2 and PC == 3) or (me == 3 and PC == 1): 40 ResultJ = [2,"じゃんけんで、あなたが勝ちました"] 41 elif (me == 1 and PC == 3) or (me == 2 and PC == 1) or (me == 3 and PC == 2): 42 ResultJ = [3,"じゃんけんで、あなたは負けました"] 43 print(ResultJ[1]) 44 45def inputAcchi(): 46 global FaceM 47 global FaceP 48 global Dir 49 print(" \n1,2,3,4 が それぞれ 上、下、左、右 に該当します。\n1~4の中で好きな数字を選んで下さい。") 50 FaceM = int(input()) 51 FaceP = random.randint(1,4) 52 if FaceM == 1: 53 Dir[0] = "上" 54 elif FaceM == 2: 55 Dir[0] = "下" 56 elif FaceM == 3: 57 Dir[0] = "左" 58 elif FaceM == 4: 59 Dir[0] = "右" 60 else: 61 Dir[0] = "正しい入力ではありません。" 62 63 if FaceP == 1: 64 Dir[1] = "上" 65 elif FaceP == 2: 66 Dir[1] = "下" 67 elif FaceP == 3: 68 Dir[1] = "左" 69 elif FaceP == 4: 70 Dir[1] = "右" 71 72 print("あなたの顔の向きは "+Dir[0]) 73 print("\nPCの顔の向きは "+Dir[1]) 74 75def hanteiAcchi(): 76 global ResultA 77 if 1 <= FaceM and 4 >= FaceM: 78 if FaceM == FaceP: 79 ResultA = [1,"当たり"] 80 elif FaceM != FaceP: 81 ResultA = [2,"外れ"] 82 print("") 83 print(ResultA[1]) 84 else: 85 print("入力が間違っています") 86 87def hanteiAll(): 88 global ResultJ 89 global ResultA 90 global ResultF 91 if ResultJ[0] == 2 and ResultA[0] == 1: 92 ResultF = [1,"あなたの勝ちです!!"] 93 elif ResultJ[0] == 3 and ResultA[0] == 1: 94 ResultF = [2,"あなたの負けです……"] 95 elif ResultA[0] == 2: 96 ResultF = [0,"もう一度じゃんけんです \n"] 97 print(ResultF[1]) 98 99def is_int(s): 100 try: 101 int(s) 102 except: 103 return False 104 return True 105 106me = "" 107teM = "" 108PC = "" 109teP = "" 110ResultJ = [] 111ResultA = [] 112ResultF = ["",""] 113Dir = ["",""] 114 115 116print("今からPCと「あっち向いてほい」をしてもらいます。\n") 117while True: 118 while True: 119 while True: 120 inputjanken() 121 if (me == 1) or (me == 2) or (me == 3): 122 break 123 PCjanken() 124 janken() 125 if ResultJ[0] != 1: 126 break 127 while True: 128 inputAcchi() 129 if (FaceM == 1) or (FaceM == 2) or (FaceM == 3) or (FaceM == 4): 130 break 131 hanteiAcchi() 132 hanteiAll() 133 if ResultF[0] != 0: 134 break

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

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

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

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

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

guest

回答4

0

ベストアンサー

『はじく』というのが『再入力を要求する』という意味ならば、例外とループを併用すれば良いです。

Python

1while True: 2 try: 3 num = int(input('整数を入れてね: ')) 4 break 5 except ValueError: 6 pass

また、global宣言は可能な限り使わないようにしてください。
変数への再代入が必要な場合は、返り値で値を返し呼び出し元で代入します。

変数の非影響範囲が広いとバグの原因の特定が非常に困難になります。
globalが悪というわけではありませんが、一つも使わないでコーディングするのが理想的です。

投稿2019/01/17 10:04

編集2019/01/17 11:32
LouiS0616

総合スコア35660

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

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

dws

2019/01/18 02:46

inputjanken() と inputAcchi() の中に教えていただいたコードを組み込むことで解決することができました。 >>また、global宣言は可能な限り使わないようにしてください。 >>変数への再代入が必要な場合は、返り値で値を返し呼び出し元で代入します。 >>変数の非影響範囲が広いとバグの原因の特定が非常に困難になります。 >>globalが悪というわけではありませんが、一つも使わないでコーディングするのが理想的です。 global宣言を使うとバグの原因の特定が困難になるというのは考えたことはなかったですが、確かにそうですね。次にプログラムを組むときは意識してやってみたいと思います。 ありがとうございました。
guest

0

例外補足を使う回答がもう付いているので使わない方法についても書いておくと、文字列のstr.isdecimalメソッドで「文字列が半角・全角のアラビア数字のみから構成されている」場合真、そうでなければ偽という判定ができます。似たようなメソッドはいろいろあるので、興味があれば調べてみてください。

python

1while True: 2 s = input('整数を入れてね: ') 3 if s.isdecimal(): 4 num = int(s) 5 break

今回の例程度であればValueError拾っても概ねうまくいくと思いますが、もう少し仕様が細かったりする場合はこういう方針で対応したりとか、正規表現で受け付けられる文字列かどうか判定する、といった処理をはさんだりします。

投稿2019/01/17 10:52

hayataka2049

総合スコア30933

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

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

dws

2019/01/18 02:53

s.isdecimal() が数字のみから構成されているものを真とするということは 文字列や小数点が入っていたら偽となる → 整数の場合のみ真となる ということですね。ありがとうございます。
guest

0

小数や文字列を入力されたときにエラーとなってしまいます。

以下のようにValueErrorを捕捉すると簡潔に実現できます。

Python

1 try: 2 me = int(input()) 3 except ValueError: 4 me = -1

投稿2019/01/17 10:06

can110

総合スコア38256

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

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

dws

2019/01/18 02:49

恥ずかしながらValueErrorと打つことで例外補足を使えることを知りませんでしたので、大変参考になりました。ありがとうございます。
guest

0

参考情報

  • Pythonで特定の範囲内の数字が選ばれるまで質問を繰り返す

https://teratail.com/questions/168641

投稿2019/01/17 21:35

編集2019/01/18 20:55
katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問