1

これまでの私のコードは次のとおりです。

import random

normal_dice=6

def roll(sides):
    for i in range(sides == ""):
        return random.randint(1,normal_dice)
    for i in range(1,int(sides)):
        return random.randint(1,int(sides))
    for i in range(int(sides),1):
        print("None")

ユーザー入力が空白の場合を除き、すべてが機能します。エラーメッセージが表示されます。

Traceback (most recent call last):
  File "<pyshell#29>", line 1, in <module>
    roll()
TypeError: roll() missing 1 required positional argument: 'sides'

私が欲しいのは、ユーザー入力が空白の場合、1から6までの乱数が生成されることです

事前に感謝します。

4

1 に答える 1

1

を呼び出すコードが示されていませんがroll、そこに問題があります。

rollただし、引数なしで呼び出せるようにしたい場合は、デフォルトのパラメーター値を使用してそれを行うことができます。

def roll(sides='6'):

デフォルトがもっと複​​雑な場合 (たとえば、「通常の 6 面ルールを使用する」ではなく「別のルールを使用する」)、デフォルト値を無効なものに設定するだけです。いずれかNone:

def roll(sides=None):
    if sides is None:
        return special_rule()

…または、None有効な引数の場合、カスタム センチネル オブジェクト:

_sentinel = object()
def roll(sides=_sentinel):
    if sides is _sentinel:
        return special_rule()

補足として、コードはほとんどすべての入力に対して正しいことをしていません。それを見てみましょう:

for i in range(sides == ""):
    return random.randint(1,normal_dice)

これは正しいですが、非常に複雑な方法です。の場合sides == ""、0 から 1 までカウントし、最初のループで 1 から 6 までの数値を返します。それ以外の場合は、0 から 0 までカウントされます。つまり、ループ全体をスキップします。

for i in range(1,int(sides)):
    return random.randint(1,int(sides))

ここで、 ifsidesが のように 1 より大きい任意の数である場合"8"、1 から 8 までカウントしrandint(1, 1)、最初に戻るので、常に 1 を返し、ループの残りの部分に到達することはありません。1 以下の場合はループをスキップします。

for i in range(int(sides),1):
    print("None")

そして、このコードは文字列Noneを複数回出力しますが、これはあまり役に立ちません。最終的に関数の最後に落ちて を返しNoneます。

あなたが望んでいたのは次のようなものだと思います:

def roll(sides='6'):
    sides = int(sides)
    if sides > 1:
        return random.randint(1, sides)
    else:
        raise ValueError("Can't roll a {}-sided die".format(sides))

ifチェックを外して を実行した場合return random.randint(1, sides)、1 より小さい数値を渡すと のような例外が発生しValueError: empty range for randrange() (1, 0, 0)ます。これは、ユーザーが理解するのが少し難しいです。そして、あなたは(私が思うに)元のバージョンでそのケースを明示的にチェックしていました。そこで、より単純な明示的なチェックを入れました。これにより、より適切なエラー メッセージが表示されます: ValueError: can't roll a 0-sided die.

于 2013-10-23T23:56:00.030 に答える