Тип 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, то бит был единственным.