Тип int в Python: от обычных чисел до неограниченной точности

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

Целочисленный тип int в Python: основные возможности

Встроенный тип int является единственным целочисленным типом в Python. Он поддерживает произвольную точность и может представлять числа любой величины без переполнения (в пределах доступной памяти).

Неограниченная точность и базовые операции

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


# Создание целых чисел
a = 42
b = -17
c = 2 ** 1000  # очень большое число

print(type(a))  # 
print(c)

Type class python (класс type в python)


10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376

Python string types (строковые типы в python)

К числам применимы все операции: + - * // % **, побитовые & | ^ ~ << >>, а также сравнения == != < > <= >=.


x = 255
y = 10
print(x + y, x // y, x % y, x & y, x << 2)

Python type str (тип str в python)

265 25 5 10 1020

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

Возможные проблемы:

  • При делении / всегда возвращается float; для целочисленного деления следует использовать //.
  • Операции с огромными числами (тысячи бит) могут быть медленными и потреблять много памяти. Например, sys.getsizeof(2**10000) показывает размер в байтах.
  • Неявное преобразование int в float при смешанных операциях может привести к потере точности.

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

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


# Разные системы счисления
print(int('FF', 16))   # 255
print(int('377', 8))   # 255
print(int('11111111', 2))  # 255
print(int('zz', 36))   # 1295 (z=35, zz=35*36+35)

Python 3 types (типы данных в python 3)

255
255
255
1295

Python float types (типы с плавающей запятой в python)

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

  • Если строка содержит символы, недопустимые для данного основания, возникнет ValueError.
  • Основание должно быть целым числом от 2 до 36. Указание 1 или 37 вызовет ValueError.
  • Знак минус перед строкой обрабатывается корректно, но пробелы внутри строки не допускаются.

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

Метод bit_length() возвращает количество бит, необходимых для представления числа в двоичном виде (без учёта знака). Методы to_bytes() и from_bytes() позволяют преобразовывать целые числа в байтовые строки и обратно.


num = 1024
print(num.bit_length())          # 11 (2^10 = 1024)

# Преобразование в 2 байта (big-endian)
b = num.to_bytes(2, byteorder='big')
print(b)                         # b'\x04\x00'

# Восстановление из байтов
restored = int.from_bytes(b, byteorder='big')
print(restored)                  # 1024

Python int types (целочисленные типы в python)

11
b'\x04\x00'
1024

Ошибки:

  • Если количество байт недостаточно для представления числа, to_bytes вызовет OverflowError.
  • Для отрицательных чисел требуется указать signed=True, иначе возникнет OverflowError.

Как избежать ошибки при делении целых чисел?

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


# Деление с плавающей точкой
print(10 / 3)       # 3.3333333333333335

# Целочисленное деление
print(10 // 3)      # 3
print(-10 // 3)     # -4  (floor в сторону минус бесконечности)

# divmod
q, r = divmod(10, 3)
print(q, r)        # 3 1
3.3333333333333335
3
-4
3 1

Важно:

  • При делении отрицательных чисел // округляет вниз (к минус бесконечности). Это может отличаться от поведения в других языках.
  • Использование // с float тоже возможно, но результат будет float.

Как задавать целые числа с разделителями для читаемости?

В Python 3.6+ можно использовать символ подчёркивания _ для группировки цифр в числовых литералах. Это повышает читаемость больших чисел и не влияет на значение.


million = 1_000_000
credit_card = 1234_5678_9012_3456
hex_mask = 0xFFFF_0000_FFFF
print(million, credit_card, hex_mask)
1000000 1234567890123456 281470681808895

Ограничения:

  • Подчёркивания можно ставить только между цифрами или после префикса системы счисления (например, 0x_FF), но не в начале строки или рядом с десятичной точкой.
  • Эта возможность доступна только в литералах; при преобразовании из строки подчёркивания не обрабатываются.

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

Тип bool является подклассом int. Значения True и False ведут себя как 1 и 0 соответственно. Это позволяет использовать их в арифметических операциях и для подсчёта.


print(True + True)       # 2
print(False * 10)        # 0
print(isinstance(True, int))  # True

# Подсчёт истинных значений
flags = [True, False, True, True]
print(sum(flags))        # 3
2
0
True
3

Предостережение:

  • Не следует полагаться на то, что True == 1 при проверке типов. Используйте type(x) is bool, если нужно отличить булево от обычного целого.

Пример 1: Факториал большого числа

Вычисление факториала для чисел в несколько тысяч демонстрирует произвольную точность int.

Пример

import math
import sys

n = 1000
fact = math.factorial(n)
print(f"Факториал {n} содержит {len(str(fact))} цифр")
print(f"Размер объекта в памяти: {sys.getsizeof(fact)} байт")
Факториал 1000 содержит 2568 цифр
Размер объекта в памяти: 1120 байт

Число занимает более 1000 байт, но все операции, как с обычным int, по-прежнему корректны.

Пример 2: Битовые маски для флагов

Целые числа удобно использовать для хранения набора бинарных флагов. Каждый бит отвечает за один флаг.

Пример

# Определение флагов
READ = 1    # 0b001
WRITE = 2   # 0b010
EXECUTE = 4 # 0b100

flags = READ | WRITE  # 0b011 = 3
print(f"Начальные флаги: {flags:03b}")

# Проверка наличия флага
if flags & READ:
    print("Разрешение на чтение есть")

# Добавление флага
flags |= EXECUTE
print(f"После добавления: {flags:03b}")

# Снятие флага
flags &= ~WRITE
print(f"После снятия записи: {flags:03b}")
Начальные флаги: 011
Разрешение на чтение есть
После добавления: 111
После снятия записи: 101

Пример 3: Преобразование в систему счисления с произвольным основанием (2–36)

Стандартная функция int() принимает основание только до 36. Можно расширить, используя собственную реализацию или int() с предварительной конвертацией.

Пример

# Преобразование числа в строку с основанием до 36 (встроенное)
num = 255
print(bin(num))           # 0b11111111
print(oct(num))           # 0o377
print(hex(num))           # 0xff

# Собственное преобразование для основания > 36
import string
digits = string.digits + string.ascii_lowercase  # 0-9 a-z

def to_base(n, base):
    if n == 0:
        return '0'
    result = []
    while n > 0:
        result.append(digits[n % base])
        n //= base
    return ''.join(reversed(result))

print(to_base(255, 16))   # ff
print(to_base(255, 36))   # 73
0b11111111
0o377
0xff
ff
73

Пример 4: Разбор сетевого пакета с помощью int.from_bytes

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

Пример

import struct

# Имитация полученных данных (4 байта)
data = b'\x00\x01\x02\x03'

# Разные способы интерпретации
val_big = int.from_bytes(data, byteorder='big')
val_little = int.from_bytes(data, byteorder='little')
print(f"Big-endian: {val_big}")
print(f"Little-endian: {val_little}")

# С помощью struct (аналогично)
val_struct = struct.unpack('>I', data)[0]
print(f"Struct big-endian: {val_struct}")
Big-endian: 66051
Little-endian: 50462976
Struct big-endian: 66051

Пример 5: Проверка, является ли число степенью двойки

Битовые операции позволяют эффективно проверить, является ли натуральное число степенью двойки.

Пример

def is_power_of_two(n):
    # n > 0 и (n & (n-1)) == 0
    return n > 0 and (n & (n - 1)) == 0

test_numbers = [1, 2, 3, 4, 16, 255, 256, 1024]
for num in test_numbers:
    print(f"{num:5} -> {is_power_of_two(num)}")
    1 -> True
    2 -> True
    3 -> False
    4 -> True
   16 -> True
  255 -> False
  256 -> True
 1024 -> True

Алгоритм основан на том, что степень двойки имеет ровно один установленный бит. Выражение n & (n-1) обнуляет младший единичный бит; если после этого остаётся 0, то бит был единственным.

Целочисленные типы в Python - comments

En
Python int types (python)