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
,