Найти - Пользователи
Полная версия: не понимаю... преобразование str в int внутри функции def
Начало » Python для новичков » не понимаю... преобразование str в int внутри функции def
1
APytB
надо взять на вход число и убедиться, что оно правильное. и хочется убедиться, что это вообще число. пытаюсь написать функцию is_valid, которая проверяет input по условиям и возвращает введенный str в виде int. вот только она не конвертирует str в int - на выходе str и остается. усугубляет досадность то, что в виде записи без функции конверсия случается… что за дела? как это решить?
вот пример кода для функции
num = input()
def is_valid(num):
if num.isdigit() and int(num) >= 1 and int(num) <= 1000:
num = int(num)
return num
print(type(num))

вот код без функции
num = input()
if num.isdigit() and int(num) >= 1 and int(num) <= 1000:
num = int(num)
print(type(num))

где я косячу?
AD0DE412
ну для начала здесь смотрим ниже (.. в самом низу этого сообщения .. я о подписи)
второе не мешайте все в кучу (в проверке да и вобще) это плохо для понимания
отсюда в начале убедитесь что это число потом преобразуйте это в инт и только потом сравнивайте
py.user.next
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')
Как видишь, все ошибки различаются сразу. Также имена переменных: мы всегда видим, что в каждом имени находится, строка там или число там. Потому что мы одно имя для всего не используем, а все имена разделяем. Так всегда видно, с чем мы работаем в данный момент и у нас нет сомнений “а что там внутри в этом имени сейчас находится? а там точно строка? а там точно число?”.
APytB
py.user.next
Как видишь, все ошибки различаются сразу. Также имена переменных: мы всегда видим, что в каждом имени находится, строка там или число там. Потому что мы одно имя для всего не используем, а все имена разделяем. Так всегда видно, с чем мы работаем в данный момент и у нас нет сомнений “а что там внутри в этом имени сейчас находится? а там точно строка? а там точно число?”.

Прям огромное спасибо! Да, это очень ценно. С вызовом - да, косяк. Любопытно, что без присвоения новой переменной даже при вызове это все еще str. Но в целом понятно.

Спасибо!
APytB
AD0DE412
ну для начала здесь (смотрим ниже .. в самом низу этого сообщения .. я о подписи)второе не мешайте все в кучу (в проверке да и вобще) это плохо для пониманияотсюда в начале убедитесь что это число потом преобразуйте это в инт и только потом сравнивайте
ок, учту. спасибо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB