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))

在这里,如果sides是任何大于 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支票并执行 a 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 回答