>>> def radius():
... n = None
... while True:
... answer = input('Диаметр цилиндра, см: ')
... try:
... n = float(answer)
... break
... except ValueError:
... pass
... print('Некорректные данные, попробуйте снова')
... return n
...
>>> radius()
Диаметр цилиндра, см: x
Некорректные данные, попробуйте снова
Диаметр цилиндра, см: a1
Некорректные данные, попробуйте снова
Диаметр цилиндра, см: 1a
Некорректные данные, попробуйте снова
Диаметр цилиндра, см: 123.456
123.456
>>>
Amaxiy
Не пропускает 1.6 и 3/4.
Для обыкновенных дробей надо другой алгоритм использовать. Напиши пока
всю программу на десятичных дробях. А вот потом можно будет часть программы по вводу дробей разработать дальше, чтобы можно было вводить как десятичные, так и обыкновенные дроби.
Также распознавать дроби при вводе можно как текст без использования конструкции проверки на возникновение исключения. Но для этого тебе придётся использовать регулярные выражения.
Пример распознавания
python.org. re. example. scanf
>>> import re
>>>
>>> pat = r'^\d+(.\d+)?$'
>>>
>>> text = '123'
>>> re.search(pat, text) is not None
True
>>>
>>> text = 'x'
>>> re.search(pat, text) is not None
False
>>>
>>> text = '123.456'
>>> re.search(pat, text) is not None
True
>>>
>>> text = '123.456x'
>>> re.search(pat, text) is not None
False
>>>
>>> import re
>>>
>>> pat_div = r'^(\d+)/(\d+)$'
>>> text = '1/2'
>>> match = re.search(pat_div, text)
>>> if match is not None:
... n1, n2 = int(match.group(1)), int(match.group(2))
... if n2 == 0:
... print('division by zero')
... else:
... result = n1 / n2
... print('ok', result)
...
ok 0.5
>>>
>>> import re
>>>
>>> pat_div = r'^(\d+)/(\d+)$'
>>> text = '1/0'
>>> match = re.search(pat_div, text)
>>> if match is not None:
... n1, n2 = int(match.group(1)), int(match.group(2))
... if n2 == 0:
... print('division by zero')
... else:
... result = n1 / n2
... print('ok', result)
...
division by zero
>>>