Python - пустой диапазон по умолчанию для заданного диапазона

Вот мой код до сих пор:

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 ответ

Решение

Вы не показали нам код, который вызывает roll, где проблема.

Однако, если вы хотите сделать так, чтобы roll может быть вызван без какого-либо аргумента, вы можете сделать это, используя значение параметра по умолчанию:

def roll(sides='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 проверить и просто сделал return random.randint(1, sides)пропуск числа меньше 1 вызовет исключение, подобное ValueError: empty range for randrange() (1, 0, 0), Это немного сложно для пользователя, чтобы понять. И вы (я думаю) явно проверяли этот случай в оригинальной версии. Итак, я вставил более простую явную проверку, которая дает вам более приятное сообщение об ошибке: ValueError: can't roll a 0-sided die,

Другие вопросы по тегам