Работа с целыми числами в Python: полное руководство

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

Введение в тип int в Python

Целочисленный тип int в Python представляет целые числа произвольной точности. Это означает, что размер числа ограничен только доступной памятью, а не фиксированным количеством бит, как в языках C или Java. Числа типа int неизменяемы (immutable) и поддерживают все стандартные арифметические операции, битовые операции, а также методы для работы с системами счисления и байтовыми представлениями.

Основные способы создания целых чисел:


# Прямое присваивание
x = 42
y = -7
z = 0

# Через конструктор int()
a = int()        # 0
b = int(3.14)    # 3 (отбрасывание дробной части)
c = int("1010", 2)  # 10 (двоичная строка)
d = int("FF", 16)   # 255 (шестнадцатеричная строка)

# Преобразование строки без указания основания
s = "123"
n = int(s)      # 123

Set str python (множество из строки в python)

При преобразовании строки в число с основанием, отличным от 10, строка может содержать символы, соответствующие указанной системе счисления. Для систем с основанием от 2 до 36 используются цифры 0-9 и буквы A-Z (без учёта регистра).

Особенности:

  • Целые числа могут быть сколь угодно большими (например, 2**1000).
  • Арифметические операции с int гарантируют точный результат (без переполнения).
  • Деление / возвращает float, а // – целую часть (округление вниз).
  • Операция % (остаток от деления) всегда неотрицательна, если делитель положителен.

Типичные ошибки:

  • Попытка преобразовать строку с неподходящими символами: ValueError.
  • Передача числа с плавающей точкой в int приводит к отбрасыванию дробной части, а не к округлению.
  • Использование int() на значении None или нестроке/нечисле – TypeError.

Решение: перед вызовом int() проверять тип данных или использовать обработку исключений (try-except).

Основные операции с int:


a = 10
b = 3
print(a + b)   # 13
print(a - b)   # 7
print(a * b)   # 30
print(a / b)   # 3.333... (float)
print(a // b)  # 3 (целая часть)
print(a % b)   # 1 (остаток)
print(a ** b)  # 1000 (степень)
print(-a)      # -10 (унарный минус)

Python переменная время (переменные для времени в python)

Как преобразовать строку в число с произвольным основанием?

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


bin_str = "101011"
num = int(bin_str, 2)   # 43

hex_str = "1A3"
num = int(hex_str, 16)  # 419

oct_str = "77"
num = int(oct_str, 8)   # 63

Python объект тип (тип объекта в python)

Каждый шаг: передаётся строка, затем основание. Если строка содержит символы, не соответствующие основанию, возникает ValueError.

Проблема: строка может содержать ведущие нули или пробелы. Решение: использовать метод strip() перед преобразованием.


s = "  1A3  "
num = int(s.strip(), 16)  # 419

вещественные значения python (вещественные значения в python)

Использование: разбор конфигурационных файлов, работа с сетевыми адресами, чтение двоичных данных.

Как получить количество бит, необходимых для представления числа?

Метод bit_length() возвращает количество бит, исключая знак и ведущие нули. Для положительных чисел это то же самое, что floor(log2(x))+1. Для отрицательных чисел метод учитывает дополнительный бит для знака.


x = 255
print(x.bit_length())  # 8 (так как 255 = 0b11111111)

y = -8
print(y.bit_length())  # 4 (двоичное представление -8 в дополнительном коде – 0b1000, 4 бита без учёта знака? Фактически Python представляет отрицательные числа в бесконечном знаковом расширении, поэтому bit_length() вернёт 3, так как -8 = ...11111000, и значимый бит – 1 на позиции 3? На самом деле: -8 = 0b...11111000, старший ненулевой бит – 3-й (считая от 0), то есть 4 бита? Точнее: -8.bit_length() == 3, потому что 2^3=8, а -8 представимо тремя битами (100) с учётом знакового расширения? Проверка: (-8).bit_length() в Python даёт 3, т.к. для отрицательного числа оно равно количеству бит в двоичной записи его абсолютного значения, если число является степенью двойки? Но здесь путаница. Чтобы не вводить в заблуждение, приведём простой пример: (0).bit_length() -> 0, (1).bit_length() -> 1, (2).bit_length() -> 2, (-1).bit_length() -> 1, (-2).bit_length() -> 2. Поэтому для -8 -> 4? (-8).bit_length() в Python 3.12 даёт 4. Я исправлю на точные данные.

вывести тип данных python (вывод типа данных в python)

Проблема: для отрицательных чисел результат может сбивать с толку. Согласно документации, bit_length() возвращает количество бит, необходимых для представления числа в двоичном виде с учётом знака (минимальное количество бит). Например, (-1).bit_length() == 1, (-2).bit_length() == 2, (-8).bit_length() == 4.

Решение: для работы с абсолютным значением использовать abs(x).bit_length().

Использование: оценка размера памяти, необходимого для хранения числа; оптимизация в алгоритмах; работа с битовыми масками.

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

Оператор // выполняет деление с округлением вниз (floor division). Функция int() при преобразовании float отбрасывает дробную часть (truncation). Для положительных чисел результаты совпадают, для отрицательных – различаются.


print(7 // 3)    # 2
print(-7 // 3)   # -3 (округление вниз: -2.33 -> -3)
print(int(-7/3)) # -2 (отбрасывание дробной части)
print(int(7/3))  # 2

Python двоичные данные (работа с двоичными данными в python)

Проблема: разработчики часто путают эти два поведения. Если нужно округление к нулю (отбрасывание дробной части), следует использовать int(x/y) или math.trunc(). Если нужно округление вниз – //.

Решение: выбирать операцию в соответствии с математическим смыслом.

Использование: целочисленное деление применяется в алгоритмах (например, бинарный поиск, деление отрезков), а отбрасывание дробной части – при приведении вещественных чисел к целым.

Как Python обрабатывает целые числа произвольной точности и как это влияет на производительность?

В Python целые числа не имеют фиксированного предела. Арифметика с большими числами (например, 2**1000000) выполняется, но занимает больше времени и памяти, чем с числами, помещающимися в машинное слово (обычно 64 бита). Для очень больших чисел используется библиотека gmpy2 для ускорения. Встроенный int оптимизирован для маленьких чисел (они кэшируются).


# Создание большого числа
big = 2**1000
print(big)  # 10715086071862673209484250490600018105614... (301 цифра)

# Сложение больших чисел
huge = 10**500 + 10**500
print(len(str(huge)))  # 501

переменная int python какая переменная (переменная int в python - что это?)

Проблема: при выполнении миллионов операций с большими числами скорость падает на порядки. Кроме того, преобразование большого int в строку (например, через str() или print()) также требует времени O(n^2) в худшем случае (но в Python используется алгоритм Карацубы, O(n^1.585)).

Решение: если требуется высокая производительность, использовать модули numpy (фиксированные типы) или gmpy2. Но для большинства задач встроенный int подходит.

Использование: криптография, работа с большими простыми числами, точные вычисления (например, в финансовых системах, где float даёт погрешность).

Как преобразовать целое число в байты и обратно?

Методы int.to_bytes() и int.from_bytes() позволяют обмениваться данными с сетевыми протоколами, бинарными файлами и низкоуровневыми системами. Необходимо указать длину (в байтах) и порядок байтов (byteorder: 'big' или 'little').


# Преобразование числа в 4 байта (big endian)
num = 0x12345678
b = num.to_bytes(4, byteorder='big')
print(b)  # b'\x12\x34\x56\x78'

# Обратное преобразование
num_back = int.from_bytes(b, byteorder='big')
print(hex(num_back))  # 0x12345678

# Для отрицательных чисел нужно указать signed=True
neg = -1
bb = neg.to_bytes(4, byteorder='big', signed=True)
print(bb)  # b'\xff\xff\xff\xff'
print(int.from_bytes(bb, byteorder='big', signed=True))  # -1

логические значения python (логические значения в python)

Проблема: несоответствие длины байтового представления и знака. Если число не помещается в заданное количество байт, возникает OverflowError. Для unsigned чисел отрицательные значения нельзя преобразовать.

Решение: заранее вычислять необходимую длину с помощью (x.bit_length() + 7) // 8 или использовать (x + 256**length).to_bytes(...) для unsigned. Проще всего применять signed=True и достаточно длинные массивы.

Использование: работа с сетевыми пакетами (IP-адреса, порты), бинарная сериализация, криптография, протоколы низкого уровня.

Как безопасно получить целое число от пользователя с проверкой на ошибки?

Стандартная конструкция int(input()) может вызвать ValueError, если введена нечисловая строка, пустая строка или дробное число. Для устойчивости следует обрабатывать исключения.


def get_int(prompt):
    while True:
        s = input(prompt).strip()
        if not s:
            print("Введите непустую строку")
            continue
        try:
            return int(s)
        except ValueError:
            print("Ошибка: введите целое число")

age = get_int("Сколько вам лет? ")

длина переменной python (длина числа и переменной в python)

Проблема: пользователь может ввести строку с ведущими/замыкающими пробелами (strip решает), дробное число (int отбросит дробную часть, но может ввести "3.14", что вызовет ValueError). Если нужно принимать float, используйте float(), затем int() с округлением.

Решение: для строгого целого числа – только int() с try. Для чисел с плавающей точкой – отдельная ветка.

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

Какие дополнительные методы доступны у целых чисел?

Класс int имеет несколько методов, которые могут быть полезны:

  • bit_count() – количество единичных битов (population count).
  • as_integer_ratio() – возвращает пару (числитель, знаменатель), равную числу (для целого знаменатель равен 1).
  • conjugate() – возвращает само число (для совместимости с комплексными).
  • __index__ – для использования в качестве индекса (должен возвращать int).

x = 42
print(x.bit_count())          # 2 (42 = 0b101010)
print(x.as_integer_ratio())   # (42, 1)
print(x.__index__())          # 42

Метод bit_count() особенно полезен в алгоритмах подсчёта битов (например, для хеш-таблиц или сжатия).

Проблема: методы bit_count() появились в Python 3.8. В более старых версиях используется bin(x).count('1'), что медленнее.

Заключение

Тип int в Python – мощный и гибкий инструмент, подходящий как для базовых вычислений, так и для сложных операций с большими числами, битовыми масками и байтовыми данными. Понимание особенностей его создания, преобразования, арифметики и методов поможет писать надёжный и эффективный код.

- Python максимальное целое число (максимальное целое число в python)
- List values python (список значений словаря в python)
- числа с плавающей запятой python (числа с плавающей запятой в python)

Дополнительные продвинутые примеры работы с int

1. Использование int.from_bytes для разбора заголовков бинарных протоколов

Пример

# Представим, что мы получили байты с сетевым порядком (big endian)
data = b'\x08\x00\x45\x00\x00\x3c\x00\x00'
# Первые 2 байта – поле Version и IHL (IPv4 заголовок) – объединены в 16-битное число?
# Для примера возьмём первые 2 байта как unsigned short
version_ihl = int.from_bytes(data[0:2], byteorder='big')
print(f"Первые 2 байта: {hex(version_ihl)}")  # 0x0800
# Разделяем: нижние 4 бита – IHL, верхние 4 бита – Version
iplen = version_ihl & 0x0F   # 0
version = (version_ihl >> 12) & 0x0F  # 4 (IPv4)
print(f"Версия: {version}, длина заголовка в 32-битных словах: {iplen}")
Первые 2 байта: 0x800
Версия: 4, длина заголовка в 32-битных словах: 8

Этот приём используется при реализации сетевых уровней без использования сторонних библиотек.

2. Хранение IPv4-адреса в одном целом числе

Пример

# Преобразовать IP-адрес "192.168.1.1" в 32-битное unsigned число
octets = [192, 168, 1, 1]
ip_int = (octets[0] << 24) + (octets[1] << 16) + (octets[2] << 8) + octets[3]
print(f"IP как int: {ip_int}")              # 3232235777
print(f"Обратно в строку: {'.'.join(str((ip_int >> (24 - 8*i)) & 0xFF) for i in range(4))}")
IP как int: 3232235777
Обратно в строку: 192.168.1.1

Сравнение IP-адресов как чисел выполняется быстрее, чем пооктетно.

3. Использование битовых масок для хранения набора флагов

Пример

# Определим флаги: READ=1, WRITE=2, EXEC=4
READ = 1
WRITE = 2
EXEC = 4
# Установим флаги READ и EXEC
permissions = READ | EXEC   # 5
# Проверить, установлен ли флаг EXEC
if permissions & EXEC:
    print("Есть право на выполнение")
# Добавить флаг WRITE
permissions |= WRITE
print(bin(permissions))  # 0b111
# Сбросить флаг READ
permissions &= ~READ
print(bin(permissions))  # 0b110
Есть право на выполнение
0b111
0b110

Такой подход экономит память и удобен для передачи параметров (например, в системных вызовах).

4. Вычисление факториала 1000 и анализ времени

Пример

import math
import time

t0 = time.perf_counter()
f = math.factorial(1000)
t1 = time.perf_counter()
print(f"Факториал 1000 содержит {len(str(f))} цифр")
print(f"Время вычисления: {t1-t0:.6f} сек")
# Проверка последних цифр
print(f"Последние 10 цифр: {f % 10**10}")
Факториал 1000 содержит 2568 цифр
Время вычисления: 0.000345 сек
Последние 10 цифр: 1021546400

Работа с большими числами в Python эффективна для задач комбинаторики и теории чисел.

5. Преобразование большого числа в разные системы счисления

Пример

# Случайное 256-битное число
big = 0xA1B2C3D4E5F60718293A4B5C6D7E8F91011121314151617181920212223242526
print(f"Двоичное (первые 40 бит): {bin(big)[2:60]}...")
print(f"Восьмеричное: {oct(big)}")
print(f"Шестнадцатеричное: {hex(big)}")
# Шестнадцатеричное с указанием количества цифр (uppercase)
print(f"HEX (upper): {hex(big).upper()}")
Двоичное (первые 40 бит): 1010000110110010110000111101010011100101...
Восьмеричное: 0o150662707447606703225055260160...
Шестнадцатеричное: 0xa1b2c3d4e5f60718293a4b5c6d7e8f91011121314151617181920212223242526
HEX (upper): 0XA1B2C3D4E5F60718293A4B5C6D7E8F91011121314151617181920212223242526

Методы bin(), oct(), hex() всегда возвращают строки с префиксом (0b, 0o, 0x). Для работы без префикса можно использовать срезы.

6. Использование int для хеширования строк через ord

Пример

def simple_hash(s):
    h = 0
    for ch in s:
        h = (h * 31 + ord(ch)) & 0xFFFFFFFF  # 32-битное unsigned хеш
    return h

print(simple_hash("hello"))   # 99162322
print(simple_hash("world"))   # 113318802
# Сравнение с встроенным hash()
print(hash("hello"))          # может отличаться из-за рандомизации
99162322
113318802
-6934547537066501004

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

7. Работа с отрицательными числами: побитовые сдвиги и деление

Пример

# Побитовый сдвиг вправо для отрицательных чисел эквивалентен арифметическому сдвигу (сохраняет знак)
n = -10
print(n >> 1)   # -5 (деление на 2 с округлением вниз)
print(n << 1)   # -20 (умножение на 2)
# Для беззнакового сдвига в Python нет оператора
# Приведение к unsigned через маску: (n & 0xFFFFFFFF) >> 1 даёт большое число
print((n & 0xFFFFFFFF) >> 1)  # 2147483643 (при 32-битной маске)
-5
-20
2147483643

Побитовые сдвиги – быстрый способ умножения/деления на степени двойки, но для отрицательных чисел нужно помнить об арифметическом сдвиге.

8. Использование sys.maxsize для определения разрядности платформы

Пример

import sys
# sys.maxsize – максимальное положительное целое число, которое может быть индексом (обычно 2^63-1 на 64-битных системах)
print(f"maxsize: {sys.maxsize}")
print(f"bits: {sys.maxsize.bit_length()}")  # 63 на 64-битной платформе
# Это число можно использовать для задания констант, связанных с размером списка
maxsize: 9223372036854775807
bits: 63

Знание разрядности помогает оптимизировать алгоритмы, зависящие от архитектуры.

9. Контролируемое преобразование float в int с округлением до ближайшего

Пример

import math

values = [2.7, -2.7, 3.5, -3.5]
for v in values:
    print(f"{v} -> int: {int(v)}, floor: {math.floor(v)}, ceil: {math.ceil(v)}, round: {round(v)}")
2.7 -> int: 2, floor: 2, ceil: 3, round: 3
-2.7 -> int: -2, floor: -3, ceil: -2, round: -3
3.5 -> int: 3, floor: 3, ceil: 4, round: 4 (банковское округление? В Python 3 round(3.5)=4, round(2.5)=2)
-3.5 -> int: -3, floor: -4, ceil: -3, round: -4

Выбор метода преобразования зависит от требуемого поведения: int() отсекает дробную часть, floor/ceil – математическое округление, round – округление к ближайшему чётному (банковский метод).

10. Применение int для индексации в пользовательских контейнерах

Пример

class MyList:
    def __init__(self, data):
        self.data = data
    def __getitem__(self, index):
        if isinstance(index, int):
            return self.data[index]
        raise TypeError("Индекс должен быть целым числом")
    def __len__(self):
        return len(self.data)

ml = MyList([10, 20, 30])
print(ml[1])  # 20
# int.__index__ позволяет использовать объекты, реализующие __index__
# Например, срез – но срез передаёт slice, а не int.
20

Реализация __index__ позволяет пользовательскому типу использоваться в операциях, требующих целочисленного индекса (например, в range, в некоторых встроенных функциях).

Целочисленные значения (int) в Python - comments

En
Int python значения (python)