Как проверить, что введена буква, а не число?
Решил изучить питон, скачал курс. Я совсем прям новичек, изучаю 3 день. Там было такое задание:
- Попросите пользователя ввести 2 числа.
- Сохраните в переменную результат деления первого числа на второе при условии, что делитель не равен 0. Если делитель равен 0, то сохранить в переменную строку: «бесконечность».
- Вывести пользователю ответ в таком виде: «ЧИСЛО_1 / ЧИСЛО_2 = ОТВЕТ». Примечание: разумеется, вместо «ЧИСЛО_1», «ЧИСЛО_2» и «ОТВЕТ» должны быть подставлены соответствующие переменные.
Видел тут 2 года назад уже задавали тот же вопрос, решения в теме я так и не нашел. Весь вечер ломал голову над 3 пунктом задания (наверно потому что занимался почти целый день) но так и не смог решить, а с утра проснулся, позавтракал сел и сразу же понял как выполнить данную задачу. Мне так же стало интересно, как добавить в этот код следущее "if" - если пользователь вводит букву а не число - вывести принт "Можно вводить только числа"
num1 = float(input("Введите первое число: "))
num2 = float(input("Введите второе число: "))
if num2 != 0:
x = num1 / num2
print(num1, "/", num2, "=", x)
else:
print("Бесконечность")
Ответы (8 шт):
В условие для оператора if можно подставить результат метода isnumeric. Данный метод вернёт True, если строка состоит только из числовых символов.
Но добавлять такую проверку нужно до преобразования строки в число, иначе возникнет исключение ValueError.
Пример:
num1 = input('Введите первое число: ')
if num1.isnumeric():
num1 = float(num1)
else:
print('Можно вводить только числа')
Вместо проверки через условие можно использовать обработку исключений. Это куда более надёжный вариант:
try:
num1 = float(input('Введите первое число: '))
except ValueError:
print('Недопустимый ввод')
скажите можно ли добавить данную проверку через цикл while? что бы при вводе любого символа кроме числа, скрипт возвращал на строку "Введите первое число" ?
Будет работать только такой код, метод isnumeric() не распознаёт разделитель (точку) и возвращает False.
Примерно так:
def is_valid(n: list):
if len(n) == 2: # Если в числе одна точка
for i in n:
if not i.isdigit():
return False
return True
else:
return False
while True:
num1 = input()
num2 = input()
nums1 = num1.split('.') # создаём список, в котором хранится целая и дробная части числа (при вводе "2.222" в список имеет вид: ['2', '222']
nums2 = num2.split('.')
if is_valid(nums1) and is_valid(nums2):
num1, num2 = float(num1), float(num2)
break # прерываем бесконечный цикл, если всё в порядке
else:
print('Вы можете ввести только числа!') # требуем от пользователя ввести числа
if num2 != 0:
x = num1 / num2
print(num1, "/", num2, "=", x)
else:
print("Бесконечность")
Функционал кода предусматривает проверку введённых значений на соответствие типу int и абсолютно работоспособен.
Я сократил Ваш код и добавил проверку:
num1='a'
num2='a'
while not num2.isdigit() and not num1.isdigit(): num1=input('Введите число 1: '); num2=input('Введите число 2: ')
num1, num2 = float(num1), float(num2)
print(num1, "/", num2, "=", num1 / num2 if num2 != 0 else "Бесконечность")
Но можно оставить Ваш код:
num1='a'
num2='a'
while not num2.isdigit() and not num1.isdigit(): num1=input('Введите число 1: '); num2=input('Введите число 2: ')
num1, num2 = float(num1), float(num2)
if num2 != 0:
x = num1 / num2
print(num1, "/", num2, "=", x)
else:
print("Бесконечность")
проверку с циклом можно еще сделать такими способами:
while True:
try:
num1 = float(input("Введите первое число: "))
num2 = float(input("Введите второе число: "))
break
except:
print('Ошибка ввода')
if num2 != 0:
x = num1 / num2
print(num1, "/", num2, "=", x)
else:
print("Бесконечность")
или
while True:
num1 = input("Введите первое число: ")
num2 = input("Введите второе число: ")
if num1.replace('.','',1).isdigit() and num2.replace('.','',1).isdigit():
num1, num2 = float(num1), float(num2)
break
else:
print('Ошибка ввода')
if num2 != 0:
x = num1 / num2
print(num1, "/", num2, "=", x)
else:
print("Бесконечность")
Давайте напишем функцию которая печатает прилашение и читает строку. Если в строке вещественное число, функция его возвращает. Если нет, функция печатает сообщение об ошибке и начинает всё с начала. Блок try/except проверяет ввод самым непосредственным образом: пытается перевести строку в число.
def inputFloat(prompt=None):
while True:
s = input(prompt)
try:
return float(s)
except ValueError:
print('Ошибка. Ожидалось вещественное число.')
f = inputFloat('Введите число: ')
print('Вы ввели', f)
$ python input-float.py Введите число: 12ab Ошибка. Ожидалось вещественное число. Введите число: ab12 Ошибка. Ожидалось вещественное число. Введите число: 123 Вы ввели 123.0 $ python input-float.py Введите число: 1e10 Вы ввели 10000000000.0
while True:
try:
num1 = float(input("Введите первое число:"))
break
except:
print("Можно вводить только числа")
while True:
try:
num2 = float(input("Введите второе число:"))
if num2 == 0:
print("Нельзя делить на ноль")
break
except:
print("Можно вводить только числа")
if num2 != 0:
x = num1 / num2
print(num1, "/", num2, "=", x)
Я решил немного изменить ваш вариант, который мне понравился, изменил так, чтобы проверка на число была при каждом введении. Так же хотел что бы при проверке второго числа, в случае если пользователь ввёл 0, скрипт вернул его к вводу второго числа с print("нельзя делить на ноль"). Тогда и в последней части скрипта отпадёт надобность задавать условие if на проверку неравенства нулю и можно будет сразу вывести print(x = num1 / num2), верно?
Единственный вариант который выполняет задачу вместо деления на 0 выводить принт о невозможности данной операции до которого я смог додуматься - вот такой:
while True:
try:
num1 = float(input("Введите первое число:"))
break
except:
print("Можно вводить только числа")
while True:
try:
num2 = float(input("Введите второе число:"))
break
except:
print("Можно вводить только числа")
if num2 == 0:
print("Нельзя делить на ноль")
else:
x = num1 / num2
print(num1, "/", num2, "=", x)
Конечно код немного длиннее, но за то, при вводе первого числа отличного от float он не дает ввести второе значение (что уже помоему разумению лишено смысла, поскольку в первом значении уже введено неверное значение), а сразу сообщает п-лю о неверном вводе.
Условие:
- Попросите пользователя ввести 2 числа.
- Сохраните в переменную результат деления первого числа на второе при условии, что делитель не равен 0. Если делитель равен 0, то сохранить в переменную строку: «бесконечность».
- Вывести пользователю ответ в таком виде: «ЧИСЛО_1 / ЧИСЛО_2 = ОТВЕТ». Примечание: разумеется, вместо «ЧИСЛО_1», «ЧИСЛО_2» и «ОТВЕТ» должны быть подставлены соответствующие переменные.
Решение:
x1=float(input('vvedite 1 chislo '))
x2=float(input('vvedite 2 chislo '))
if x2 == 0:
x3 = 'besconechnost'
else:
x3=x1/x2
print (x1,'/',x2, '=',x3)