Я хочу попросить пользователя ввести значение, а затем напечатать его длину, если ввод представляет собой строку. Если пользовательский ввод представляет собой целое или десятичное число, я хочу напечатать "Sorry, integers don't have length"
или "Sorry, floats don't have length"
соответственно.
Я использую исключение, пытаясь преобразовать ввод в число с плавающей запятой или целое число.
Вот мой код:
c=input("enter a string: ")
def length(c):
return len(c)
try:
float(c)
if float(c)==int(c):
print("Sorry integers don't have length")
else:
print("Sorry floats don't have length")
except:
print(length(c))
Результаты вывода следующие:
> enter a string: sfkelkrelte
11
> enter a string: 21
Sorry integers don't have length
> enter a string: 21.1
4
Когда я ввожу целое число, сообщение об ошибке отображается правильно, так как возможно преобразование float(). Но в случае числа с плавающей запятой интерпретатор переходит к блоку except
, хотя он должен был выполнить блок try
.
Почему это происходит?
Часть, которая вызывает исключение, это int(c)
:
c = "21.1"
print(int(c))
# ValueError: invalid literal for int() with base 10: '21.1'
Одно небольшое изменение исправит это для вас:
c = "21.1"
try:
float(c)
if "." not in c: #<---- check if "." is in the string c AFTER conversion to float
print("Sorry integers don't have length")
else:
print("Sorry floats don't have length")
except:
print(len(c))
# Sorry floats don't have length
Однако, как правило, слепо перехватывать все исключения — плохая практика. Это может привести к непреднамеренному побочному эффекту любой ошибки в вашей программе, вызывающей блок except
.
Правильнее было бы поймать только того, кого вы ожидаете.
c = "21.aakdjs1"
try:
float(c)
if "." not in c:
print("Sorry integers don't have length")
else:
print("Sorry floats don't have length")
except ValueError:
print(len(c))
# 10
Для будущей отладки вы всегда можете использовать распечатать исключение.
Я до сих пор не понимаю if float(c)==int(c):
бизнеса. Если они все равно собираются отклонять числа с плавающей запятой и целые числа, просто проверить на float
?
Похоже, им нужны разные операторы печати для int
s и float
s. Домашнее задание наверное.
в вашем коде, если введено значение «21.0», отображается строка «Извините, целые числа не имеют длины».
да потому что float("21.0") == int(21.0)
. Я сделал обновление @laxmanprasad
Введите результаты в строковый формат, чтобы преобразовать строку в число с плавающей запятой. Затем проверьте, является ли это целым числом. Измените свой код на:
old: if float(c) ==int(c):
new: if c.isdigit():
ОБНОВЛЕНО:
enter a string: 21.0
Sorry floats don't have length
если вход равен 21.0, "float(21.0) ==int(float(21.0))" будет оценен как true. следовательно, десятичные числа с дробной частью, равной 0, будут считаться целыми числами в соответствии с вашим кодом.
я обновил свой ответ. блок try, кроме блока, поймает, плавает ли он или нет. Тогда isdigit() поймает, если это целое число.
Кроме того, почему бы не применить принцип EAFP (Что такое принцип EAFP в Python?) и ко второму условию?
s = input("Input: ")
try:
float(s)
try:
int(s)
print("Sorry, you have entered an integer.")
except:
print("Sorry, you have entered a float.")
except:
print(len(s))
Я не стал проверять ValueError
как исключение, потому что вы тоже не проверили это в своем коде. Тем не менее, вы должны взглянуть на Как правильно игнорировать исключения
ваш код работает нормально. однако я не понимаю логику внутреннего блока исключений. например, если ввод "21.0", то int(21.0) не вызовет исключение. так почему же он все еще выполняет блок exclude, а не блок try?
Ошибка в том, что
int(c)
вызывает исключение, когдаc = "21.1"