到目前为止,这是我的代码:
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之间的随机数
任何帮助将不胜感激,提前谢谢!
答案 0 :(得分: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到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
检查并且只是return random.randint(1, sides)
,则传递小于1的数字会引发ValueError: empty range for randrange() (1, 0, 0)
之类的异常。这对用户来说有点难以理解。而你(我认为)在原始版本中明确检查了这种情况。所以,我进行了一个更简单的显式检查,它会给你一个更好的错误信息:ValueError: can't roll a 0-sided die
。