3

私はPythonが初めてで、ユーザーが8面、12面、または24面のサイコロの使用を選択して、転がした結果を表示できるようにする簡単なプログラムを作成しようとしています。

これは私のコードですが、もう一度ロールするかどうかを入力するとエラーが発生する理由がわかりません。

import random

def dice4():
 min=1
 max=4
 print random.randint(min, max);
 return;

def dice6():
 min=1
 max=6
 print random.randint(min, max);
 return;

def dice12():
 min=1
 max=12
 print random.randint(min, max);
 return;

roll = "yes"
y = 1

while roll == "yes" or roll == "y":
  x = input("What dice do you want to use? 4/6/12?");
  if x ==8:
   dice4();
  elif x==12:
   dice6();
  elif x==16:
   dice12();
  else:
   print "You have not entered a valid dice number";

  roll = input("Do you want to roll again? y/n");

print "Thanks for rolling!";
input("Press <Enter> to quit");

助けてくれてありがとう、おそらく些細なエラーだと思います。

4

2 に答える 2

5

もう一度ロールするかどうかを入力すると、エラーが発生する理由がわかりません。

したがって、問題はコードのその部分にあります。それを見てみましょう:

roll = input("Do you want to roll again? y/n");

機能を使用していinputます。これは、Python 式として入力したものを評価しようとします。

したがって、 と入力yesすると、 の値を見つけようとし、 を発生さyesNameErrorます。nまたはについても同様ですno

と入力yすると、同じことが起こるはずです... という名前の無関係な変数がたまたまy横たわっている場合を除いて、実際には値が見つかります1. したがって、後で確認すると、 inwhile roll == "yes" or roll == "y":は明らか1にこれらの文字列のいずれとも等しくないため、そのまま終了します。

入力できる唯一の機能は"y"or "yes"(または一重引用符と同じ) です。明らかに、ユーザーが入力する必要はありません。

raw_input解決策は、代わりにを使用することですinput。これは、入力を評価しようとするのではなく、文字列として提供するだけです。

roll = raw_input("Do you want to roll again? y/n");

inputこれは、使用が通常悪い考えである理由の 1 つです。整数が必要な以前のケースでさえ、タイプミスのエラーは見苦しくなります。

さらに良い理由として、入力したときに何が起こるかを確認し__import__('os').system('dir C:\\')( ls /Windows ではなく Unix を使用している場合は代わりに入力してください)、ユーザーが他の入力でどれだけの害を及ぼす可能性があるかを想像してください。

そのため、常に使用することをお勧めしraw_inputます。入力を整数に変換する場合は、 に渡しintます。任意の型のリテラル値として扱いたい場合は、 を使用しますast.literal_eval。本当に任意の Python コードとして評価したい場合は、eval(これは より安全ではありませんinputが、少なくともより明示的です) を使用します。

于 2013-09-25T19:10:17.030 に答える