APytB
где я косячу?
Ты не вызвал функцию, которую написал.
x = is_valid(num)
print(type(x))
Вообще, функции, которые начинаются на is_ или has_ , должны возвращать только True или False, потому что мы такие фукции вставляет в if'ы потом, а они именно True и False проверяют. Такая функция называется предикатом.
Поэтому при вводе строки сначала у тебя должна провериться строка, находится ли у тебя число в ней. Для этого надо сделать функцию is_number(). А потом, когда is_number() сработала и показала True, нужно число преобразовать через int() в целочисленный тип и передать это число во вторую функцию is_valid_number(), которая уже и проверяет его на величину через 1 <= x <= 1000.
Тогда у тебя будет ввод строки - это ввод строки, а проверка числа - это проверка числа. Понимаешь, сейчас оно у тебя вводится в консоли, а в будущем может поменяться эта процедура ввода и оно будет не из консоли вводиться, а из файла браться. А в файле в этом только числа будут храниться и поэтому проверка строки будет не нужна, только проверка величины числа останется нужной.
Так что разделяй операции по разным функциям. Не перекрывай имена никогда, а всегда делай новые имена для всего. Если в одной функции всё смешиваешь, то потом ситуация поменяется и станет нужна будет только половина функции, а не вся функция, и ты из-за этого не сможешь эту функцию применить. А если ты под одним именем постоянно что-то новое сохраняешь, то ты и старые данные теряешь и больше у тебя доступа к ним нет, и никогда в текущем имени не знаешь, что находится, потому что никогда не можешь быть уверен, что выше там в любом месте кода на тысячу строк что-то не перезаписал под тем же самым именем.
Вот так оно примерно должно у тебя смотреться
text = input()
if is_number(text):
num = int(text)
if is_valid_number(num)
print('number =', num)
else:
print('wrong value')
else:
print('error in string')
Как видишь, все ошибки различаются сразу. Также имена переменных: мы всегда видим, что в каждом имени находится, строка там или число там. Потому что мы одно имя для всего не используем, а все имена разделяем. Так всегда видно, с чем мы работаем в данный момент и у нас нет сомнений “а что там внутри в этом имени сейчас находится? а там точно строка? а там точно число?”.