Техники преобразования строки в целое число в Python

Раздел: Типы данных -> Ввод числовых данных

Основные подходы к вводу целого числа

Наиболее распространённый способ получения целого числа от пользователя в Python - это комбинация функций input() и int(). Функция input() считывает строку, а int() преобразует её в целое число. Этот метод прост и подходит для большинства случаев, когда требуется ввод одного числа.


number = int(input("Введите целое число: "))
print(f"Вы ввели: {number}")

Python input integer (ввод целого числа (integer) в python)

Если пользователь вводит нечисловые символы, возникает исключение ValueError. В базовом варианте программа аварийно завершится, поэтому для надёжности рекомендуется обрабатывать ошибки.

Основная проблема: при вводе букв, знаков пунктуации или пустой строки программа вылетает с ValueError. Решение - использовать конструкцию try-except или предварительную проверку строки.

Как избежать аварийного завершения программы при неверном вводе?

Использование блока try-except позволяет перехватить исключение и дать пользователю возможность повторить ввод или вывести сообщение об ошибке.


try:
    number = int(input("Введите целое число: "))
    print(f"Вы ввели: {number}")
except ValueError:
    print("Ошибка: введите корректное целое число.")

Python input 0 (ввод нуля в python)

Такой подход подходит для однократного ввода, когда не требуется повторять запрос. Если нужно запрашивать ввод до тех пор, пока не будет получено верное значение, применяется цикл while.

Типичная ошибка: забыть поместить всё преобразование в try-блок или перехватывать слишком широкое исключение. Следует перехватывать только ValueError, чтобы не скрыть другие ошибки.

Как проверить, что введена строка, содержащая только цифры и знак минуса?

Метод str.isdigit() проверяет, состоит ли строка только из цифр, но не учитывает знак минуса. Используя lstrip('-'), можно удалить ведущий минус перед проверкой.


user_input = input("Введите целое число: ")
if user_input.lstrip('-').isdigit():
    number = int(user_input)
    print(f"Вы ввели: {number}")
else:
    print("Некорректный ввод.")

Float input python (ввод числа с плавающей точкой (float) в python)

Этот способ позволяет избежать исключений, но не учитывает знак плюса, пробелы, а также числа в экспоненциальной записи. Подходит для простых сценариев, когда ввод строго контролируется.

Недостаток: строка вида "-123abc" не будет распознана как неверная (так как lstrip убирает только минус в начале, а isdigit вернёт False из-за букв). Нужно помнить, что для отрицательных чисел проверка корректна, но для положительных с плюсом - нет.

Как ограничить вводимое число определённым диапазоном?

Часто требуется, чтобы целое число попадало в заданный интервал, например от 1 до 100. Сочетание цикла и условной проверки позволяет добиться этого.


while True:
    try:
        number = int(input("Введите число от 1 до 100: "))
        if 1 <= number <= 100:
            print(f"Принято: {number}")
            break
        else:
            print("Число вне диапазона.")
    except ValueError:
        print("Это не целое число.")

Цикл продолжается, пока не будет введено число из указанного диапазона. Этот вариант удобен для меню выбора, ввода возраста или количества элементов.

Возможная проблема: если требуется ввести несколько чисел по очереди, данный код блокирует выполнение до получения корректного значения. Для массового ввода лучше вынести проверку в отдельную функцию.

Как ввести целое число в двоичной или шестнадцатеричной системе?

Функция int() принимает второй аргумент - основание системы счисления (от 2 до 36). Это позволяет интерпретировать строку как число в указанной системе.


binary_str = input("Введите двоичное число (только 0 и 1): ")
try:
    number = int(binary_str, 2)
    print(f"Десятичное значение: {number}")
except ValueError:
    print("Некорректное двоичное число.")

Аналогично можно работать с восьмеричной (основание 8) и шестнадцатеричной (16) системами. Такой подход полезен при работе с битовыми масками, адресами памяти или шифрованием.

Ошибки возникают, если строка содержит символы, недопустимые для выбранного основания. Например, в двоичной системе допустимы только '0' и '1'. Следует проверять корректность ввода до преобразования или перехватывать исключение.

Что делать, если пользователь ничего не ввёл или ввёл только пробелы?

Применение метода str.strip() удаляет лишние пробелы, а затем проверяется, не стала ли строка пустой. Это предотвращает возникновение ValueError при передаче пустой строки в int().


user_input = input("Введите целое число: ").strip()
if not user_input:
    print("Вы ничего не ввели.")
else:
    try:
        number = int(user_input)
        print(f"Вы ввели: {number}")
    except ValueError:
        print("Некорректное число.")

Данный вариант универсален и может быть объединён с любой другой проверкой. Рекомендуется всегда очищать ввод от пробелов в начале и конце.

Если не удалить пробелы, строка вида " 123 " вызовет ошибку, так как isdigit() вернёт False. Поэтому strip() обязателен при использовании методов проверки без преобразования.

Расширенные примеры ввода целых чисел

Ввод нескольких целых чисел через пробел

Если нужно ввести несколько целых чисел в одной строке, используется метод split() и генератор списка.

Пример

numbers_str = input("Введите целые числа через пробел: ")
try:
    numbers = [int(x) for x in numbers_str.split()]
    print(f"Введены числа: {numbers}")
except ValueError:
    print("Некорректный ввод: одна из частей не является целым числом.")
Вход: 10 20 -30 40
Выход: Введены числа: [10, 20, -30, 40]

Такой приём удобен для ввода массивов или последовательностей. Можно добавить проверку диапазона или количества чисел.

Использование регулярных выражений для строгой проверки

Регулярное выражение ^-?\d+$ проверяет, что строка состоит из необязательного минуса и одной или более цифр. Это более надёжный способ, чем isdigit(), так как он учитывает только допустимые символы.

Пример

import re

user_input = input("Введите целое число: ").strip()
if re.match(r'^-?\d+$', user_input):
    number = int(user_input)
    print(f"Число: {number}")
else:
    print("Некорректный ввод.")
Вход: -123
Выход: Число: -123
Вход: +456
Выход: Некорректный ввод. (знак плюса не допускается)

Регулярные выражения дают гибкость: можно добавить поддержку знака плюса, ведущих нулей или экспоненциальной записи. Однако они требуют импорта модуля re.

Ввод числа с плавающей точкой и преобразование в целое

Иногда пользователь может ввести десятичную дробь, а программе нужно целое число. Можно преобразовать строку во float, а затем округлить или отбросить дробную часть.

Пример

user_input = input("Введите число (можно дробное): ").strip()
try:
    number = int(float(user_input))  # сначала во float, потом в int
    print(f"Целая часть: {number}")
except ValueError:
    print("Некорректный ввод.")
Вход: 45.67
Выход: Целая часть: 45
Вход: -3.14
Выход: Целая часть: -3

Важно: такое преобразование отбрасывает дробную часть (усечение в сторону нуля). Для округления используйте round() перед int(). Данный метод подходит, когда ожидается целое число, но пользователь может случайно ввести дробь.

Ввод целого числа из командной строки с помощью argparse

При разработке скриптов, запускаемых из терминала, удобно передавать аргументы. Модуль argparse позволяет задать тип аргумента как int.

Пример

import argparse

parser = argparse.ArgumentParser(description='Пример с целым числом.')
parser.add_argument('number', type=int, help='Целое число')
args = parser.parse_args()
print(f"Получено число: {args.number}")
Команда: python script.py 42
Выход: Получено число: 42
Команда: python script.py abc
Выход: error: argument number: invalid int value: 'abc'

Это профессиональный способ для создания утилит командной строки. Он автоматически обрабатывает ошибки и выводит справку.

Ввод числа с таймаутом (на случай, если пользователь бездействует)

В интерактивных приложениях можно ограничить время ожидания ввода. Например, с использованием сигналов в Unix-подобных системах.

Пример

import signal

def timeout_handler(signum, frame):
    raise TimeoutError("Время истекло")

signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(5)  # таймаут 5 секунд

try:
    user_input = input("Введите целое число (у вас 5 секунд): ")
    signal.alarm(0)  # отключаем таймер
    number = int(user_input)
    print(f"Вы ввели: {number}")
except (ValueError, TimeoutError) as e:
    print(f"Ошибка: {e}")
(Если пользователь не вводит данные 5 секунд)
Выход: Ошибка: Время истекло

Такой подход полезен в играх, тестировании или ограниченных по времени сессиях. На платформах Windows сигналы не поддерживаются, потребуется использовать многопоточность.

Ввод целого числа (integer) в Python - comments

En
Python input integer (python)