Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Python для новичков
  • » Функции проверки ввода int/float/дроби("/"). Регулярные выражения. "ЗАЩИТА от тестеров и дураков" [RSS Feed]

#1 Сен. 16, 2022 18:11:29

Amaxiy
От: Анапа
Зарегистрирован: 2022-09-16
Сообщения: 4
Репутация: +  0  -
Профиль  

Функции проверки ввода int/float/дроби("/"). Регулярные выражения. "ЗАЩИТА от тестеров и дураков"


Высчитывает массу цилиндра по 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



“Я красками мечтаний переполнен,
Я брызжу радугой сквозь все границы форм,
И я цвету, пока питают корни!
И я держусь, какой бы не был шторм!”

Отредактировано Amaxiy (Сен. 20, 2022 13:47:45)

Офлайн

#2 Сен. 17, 2022 00:06:56

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9891
Репутация: +  854  -
Профиль   Отправить e-mail  

Функции проверки ввода int/float/дроби("/"). Регулярные выражения. "ЗАЩИТА от тестеров и дураков"

Amaxiy
Всё прекрасно работает, но стоит ввести в первый раз неправильно параметр (РАДИУС), а потом ввести уже корректную циферку, то потом далее при вводе корректной цифры в ВЫСОТУ вылетает ошибка.
Надо использовать циклы для ввода значений.
Тут можешь посмотреть пример, как вводить данные, пока они не будут введены правильно, и как реагировать на неправильно введённые данные.



Офлайн

#3 Сен. 17, 2022 02:57:45

Amaxiy
От: Анапа
Зарегистрирован: 2022-09-16
Сообщения: 4
Репутация: +  0  -
Профиль  

Функции проверки ввода int/float/дроби("/"). Регулярные выражения. "ЗАЩИТА от тестеров и дураков"

py.user.next
if answer.isdigit() and float(answer) > 0: не работает
Не пропускает 1.6 и 3/4.



“Я красками мечтаний переполнен,
Я брызжу радугой сквозь все границы форм,
И я цвету, пока питают корни!
И я держусь, какой бы не был шторм!”

Отредактировано Amaxiy (Сен. 20, 2022 13:43:56)

Офлайн

#4 Сен. 17, 2022 03:57:46

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9891
Репутация: +  854  -
Профиль   Отправить e-mail  

Функции проверки ввода int/float/дроби("/"). Регулярные выражения. "ЗАЩИТА от тестеров и дураков"

  
>>> 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
>>>



Отредактировано py.user.next (Сен. 17, 2022 04:07:14)

Офлайн

  • Начало
  • » Python для новичков
  • » Функции проверки ввода int/float/дроби("/"). Регулярные выражения. "ЗАЩИТА от тестеров и дураков"[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version