您没有向我们展示调用 的代码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
.