Найти - Пользователи
Полная версия: Функции проверки ввода int/float/дроби("/"). Регулярные выражения. "ЗАЩИТА от тестеров и дураков"
Начало » Python для новичков » Функции проверки ввода int/float/дроби("/"). Регулярные выражения. "ЗАЩИТА от тестеров и дураков"
1
Amaxiy

Высчитывает массу цилиндра по 3-ём введенным от пользователя параметрам.
Нужно провести проверку чисел на тип float.
Всё прекрасно работает, но стоит ввести в первый раз неправильно параметр (РАДИУС), а потом ввести уже корректную циферку, то потом далее при вводе корректной цифры в ВЫСОТУ вылетает ошибка.
Плюс ко всему подобный код на проверку видится мне излишне громоздким. Как лучше подобное провернуть с минимальным кол-вом кода? Заранее благодарю.
*****
from math import pi as PI

def is_number(s): #проверка ввода на число типа float
try:
float(s)
return True
except ValueError:
return False

def radius():
n = input('Диаметр цилиндра, см: ')
if is_number(n):
print('Введено число')
n = float(n)/2
return n
else:
print('Введено НЕ число')
radius()
def height():
n = float(input('Высота цилиндра, см: '))
return n
py.user.next
Amaxiy
Всё прекрасно работает, но стоит ввести в первый раз неправильно параметр (РАДИУС), а потом ввести уже корректную циферку, то потом далее при вводе корректной цифры в ВЫСОТУ вылетает ошибка.
Надо использовать циклы для ввода значений.
Тут можешь посмотреть пример, как вводить данные, пока они не будут введены правильно, и как реагировать на неправильно введённые данные.
Amaxiy
py.user.next
if answer.isdigit() and float(answer) > 0: не работает
Не пропускает 1.6 и 3/4.
py.user.next
  
>>> 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
>>>
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