Python - 空白范围默认为预设范围

时间:2013-10-23 23:50:53

标签: python random default dice

到目前为止,这是我的代码:

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之间的随机数

任何帮助将不胜感激,提前谢谢!

1 个答案:

答案 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