代码之家  ›  专栏  ›  技术社区  ›  user2913576

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

  •  1
  • user2913576  · 技术社区  · 11 年前

    这是我迄今为止的代码:

    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 回复  |  直到 11 年前
        1
  •  1
  •   abarnert    11 年前

    你还没有给我们显示调用的代码 roll ,这就是问题所在。

    然而,如果你想让它 可以在没有任何参数的情况下调用,您可以通过使用默认参数值来做到这一点:

    def roll(sides='6'):
    

    如果默认值更复杂(例如,不是“使用通常的规则,有6个边”,而是“使用不同的规则”),您只需将默认值设置为无效值。任何一个 None :

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

    或者,如果 没有一个 是一个有效的参数,一个自定义的sentinel对象:

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

    这个代码将打印出字符串 没有一个 多次,这可能不是很有用,最后从函数的末尾掉下来并返回 没有一个 .

    我想你想要的是这样的东西:

    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 .