Преобразование строки в Int с использованием try/except в Python

#python #python-3.x

#питон #python-3.x #python

Вопрос:

Итак, я довольно озадачен тем, как преобразовать строку в int с помощью функции try / except. Кто-нибудь знает простую функцию о том, как это сделать? Я чувствую, что все еще немного не разбираюсь в string и целых числах. Я почти уверен, что целые числа связаны с числами. Струны… Не так уж много.

Ответ №1:

Важно уточнить, какое исключение вы пытаетесь перехватить при использовании блока try / except.

 string = "abcd"
try:
    string_int = int(string)
    print(string_int)
except ValueError:
    # Handle the exception
    print('Please enter an integer')
  

Функции Try / Excepts эффективны, потому что, если что-то может выйти из строя несколькими различными способами, вы можете указать, как вы хотите, чтобы программа реагировала в каждом случае сбоя.

Комментарии:

1. 1 за конкретику. Стоит отметить, что ValueError Exception экземпляр будет содержать больше информации, а именно. «недопустимый литерал для int() с основанием 10: ‘abcd'».

2. Просто хотел упомянуть… если есть вероятность, что преобразуемая переменная является None , тогда вы захотите, чтобы ваш блок except был except (TypeError, ValueError):

Ответ №2:

Вот оно:

 s = "123"
try:
  i = int(s)
except ValueError as verr:
  pass # do job to handle: s does not contain anything convertible to int
except Exception as ex:
  pass # do job to handle: Exception occurred while converting to int
  

Комментарии:

1. -1 для перехвата почти всех возможных исключений, а не только ValueError . Вы должны улавливать только то, с чем вы знаете, как обращаться.

2. Получение большего количества, чем вам нужно, является очень плохой практикой. Скорректируйте свой ответ, и я с радостью изменю свой голос.

3. 1 Это всего лишь пример, поэтому показ шаблона для перехвата ValueError, а также других видов исключений очень поучителен. Это очень полезно, например, для анализа аргумента и установки значения по умолчанию, если оно недопустимо или не определено.

4. Так получилось, что я работаю над очень большой базой кода Python, которая выбрасывала кучу исключений влево и вправо. И в какой-то момент не было другого способа справиться с этим, кроме как перехватить все — вы не знаете, какое новое исключение член другой команды, работающий в другой стране, добавил на прошлой неделе на 10 уровней ниже вашего кода. Исходя из c , я бы сказал, что исключения в python используются чрезмерно.

Ответ №3:

Во-первых, try / except — это не функции, а инструкции.

Чтобы преобразовать строку (или любой другой тип, который можно преобразовать) в целое число в Python, просто вызовите int() встроенную функцию. int() будет raise ValueError , если это не удается, и вы должны уловить это специально:

В Python 2.x:

 >>> for value in '12345', 67890, 3.14, 42L, 0b010101, 0xFE, 'Not convertible':
...     try:
...         print '%s as an int is %d' % (str(value), int(value))
...     except ValueError as ex:
...         print '"%s" cannot be converted to an int: %s' % (value, ex)
...
12345 as an int is 12345
67890 as an int is 67890
3.14 as an int is 3
42 as an int is 42
21 as an int is 21
254 as an int is 254
"Not convertible" cannot be converted to an int: invalid literal for int() with base 10: 'Not convertible'
  

В Python 3.x

синтаксис немного изменился:

 >>> for value in '12345', 67890, 3.14, 42, 0b010101, 0xFE, 'Not convertible':
...     try:
...         print('%s as an int is %d' % (str(value), int(value)))
...     except ValueError as ex:
...         print('"%s" cannot be converted to an int: %s' % (value, ex))
...
12345 as an int is 12345
67890 as an int is 67890
3.14 as an int is 3
42 as an int is 42
21 as an int is 21
254 as an int is 254
"Not convertible" cannot be converted to an int: invalid literal for int() with base 10: 'Not convertible'
  

Комментарии:

1. Является ValueError единственным ожидаемым исключением? — в документах это не указано: docs.python.org/2/library/functions.html#int

2. int() также может вызвать TypeError .

Ответ №4:

Во многих случаях мы хотим получить от пользователя целочисленное значение. Пользователи могут вставлять нецелые значения, о которых следует предупредить, и им следует предложить повторить попытку. Следующий фрагмент можно использовать для получения от пользователя целочисленного значения и продолжения запроса пользователя вставить целое число, пока он не введет допустимое.

 def get_integer_value():
  user_value = input("Enter an integer: ")
  try:
    return int(user_value)
  except ValueError:
    print(f"{user_value} is not a valid integer. Please try again.")
    return get_integer_value()


if __name__ == "__main__":
  print(f"You have inserted: {get_integer_value()}")
    
  

Вывод:

 Enter an integer: asd
asd is not a valid integer. Please try again.
Enter an integer: 32
You have inserted: 32
  

Ответ №5:

Вы можете сделать :

 try : 
   string_integer = int(string)
except ValueError  :
   print("This string doesn't contain an integer")
  

Комментарии:

1. Синтаксис вашего оператора except неверен — он никогда ничего не поймает. Множественные исключения перехватываются с использованием except (type1, type2): синтаксиса. И нет смысла комбинировать конкретную ошибку с общим базовым классом Exception .

Ответ №6:

К сожалению, в официальной документации мало говорится об исключениях, которые int() могут возникнуть; однако, когда вы используете int() , это может вызвать по существу два исключения: TypeError , если значение не является числом или строкой (или байтами, или bytearray ), и ValueError если значение на самом деле не соответствует числу.

Вы должны управлять обоими, используя что-то вроде этого:

 try:
   int_value = int(value)
except (TypeError, ValueError):
    print('Not an integer')