Попробуйте, кроме числа с плавающей запятой, но не целого числа

Итак, я подошел к препятствию в упражнении по программированию. Я понимаю концепцию try, кроме, но как я могу использовать обработчик try, кроме, чтобы принимать только число с плавающей запятой или десятичное число, и если введено целое число или целое число, он выдает сообщение об ошибке. Я знаю, что теоретически это невозможно, но есть ли способ?

В идеале я хочу использовать блок кода try, кроме блока кода, так как это текущий урок, на котором я сейчас.

Спасибо всем заранее!


person Gallieon474    schedule 07.10.2015    source источник


Ответы (4)


Как насчет использования .is_integer() на float?

>>> float(5).is_integer()
True
>>> float(5.12).is_integer()
False
>>> 

so

if float(x).is_integer():
    raise ValueError('Non integers please')
person karthikr    schedule 07.10.2015
comment
пока лучший ответ. что вы думаете о if float(x) == int(x): ? - person John Ruddell; 08.10.2015
comment
@karthikr Это здорово! Не могу поверить, что все эти годы программировал на Python и не знал об этом. Большое спасибо. - person saulspatz; 08.10.2015
comment
@JohnRuddell уверен, но разве чистый эффект не тот же? - person karthikr; 08.10.2015
comment
@saulspatz рад, что это помогло - person karthikr; 08.10.2015
comment
@karthikr да, я так думаю. Я не знаю, какова временная сложность для is_integer(), просто интересно, эффективнее ли один, чем другой - person John Ruddell; 08.10.2015

Здесь есть хорошие ответы, но пока в ответах не используются попытки/за исключением случаев, когда это было запрошено. Чтобы использовать try, кроме, вам нужно попробовать что-то, что вызовет исключение, если оно ложно, а затем перехватит исключение.

try:
    x / (x - int(x))
except ZeroDivisionError:
    raise Exception("No integers allowed.")
person RobertB    schedule 07.10.2015

if type(variable) is not float:
    raise ValueError('Invalid number provided')

OR

if type(variable) is int:
    raise ValueError('Invalid number provided')

ИЛИ (чтобы проверить целое число):

if abs(variable) - floor(abs(variable)) < 1.0e-9:
    raise ValueError('Invalid number provided')
person R Nar    schedule 07.10.2015
comment
это еще поплавок. если вы имеете в виду, что хотите, чтобы он также вызывал исключение, просто добавьте больше случаев. или, если вы просто не хотите принимать int, используйте вместо этого второй оператор. - person R Nar; 08.10.2015
comment
снова отредактировал. я действительно думаю, что этот вопрос изначально был о возбуждении исключения, а не о том, как проверить целые числа, ну да ладно :) - person R Nar; 08.10.2015
comment
@PeterWood запрос оператора заключается в том, что все, кроме числа с плавающей запятой / десятичного числа, недействительно. первая проверка делает это. запрос оператора only accept a float or decimal, и он использует python, который является рассматриваемым языком. так в чем проблема? - person John Ruddell; 08.10.2015
comment
да ладно, тогда просто используйте сравнение с плавающей запятой и целым числом if float(5) == int(5): raise ValueError() и да, я не видел последнюю часть, так как это было редактирование впоследствии - person John Ruddell; 08.10.2015

person    schedule
comment
ты имеешь в виду if type(num) in (float, int, Decimal):? - person Pynchia; 08.10.2015