Встроенные типы данных в Python 3: руководство программиста
Встроенные типы данных в Python 3
Python 3 предлагает богатый набор встроенных типов данных, которые можно разделить на несколько категорий: числовые, последовательности, отображения, множества, двоичные типы и специальный тип None. Каждый тип обладает своими свойствами, методами и правилами изменяемости. Понимание этих типов является основой для эффективного программирования.
Как создать целое число произвольной точности?
Основной тип для целых чисел - int. Python автоматически поддерживает целые числа любой длины, ограниченной только памятью.
a = 10
b = -5
c = 0xFF # 255 в шестнадцатеричной системе
d = 0b1010 # 10 в двоичнойType class python (класс type в python)
Для создания чисел используются литералы или функция int():
x = int('42') # из строки
y = int(3.14) # отбрасывание дробной частиPython string types (строковые типы в python)
Типичные проблемы и ошибки:
- Приведение строки с нечисловыми символами вызовет
ValueError. - Деление
/возвращаетfloat, даже если числа целые. Для целочисленного деления используется//.
Как работать с числами с плавающей точкой?
Тип float представляет вещественные числа двойной точности (64 бита).
pi = 3.14159
inf = float('inf')
nan = float('nan')
Python type str (тип str в python)
Осторожно: float не подходит для точных денежных расчётов из‑за ошибок округления.
Типичные проблемы и ошибки:
- Сравнение
0.1 + 0.2 == 0.3даётFalseиз‑за двоичного представления. - Бесконечность и
NaNведут себя неочевидно при арифметике.
Решение:
- Использовать
round()или модульdecimalдля финансовых вычислений. - Проверять близость чисел через
math.isclose().
Как использовать комплексные числа?
Тип complex представлен в виде real + imag*j.
c1 = 3 + 4j
c2 = complex(1, -2)
print(c1.real, c1.imag) # 3.0 4.0Python object type (тип объекта в python)
Поддерживаются все арифметические операции, модуль cmath для тригонометрии.
Как работать с логическими значениями?
Тип bool имеет два значения: True и False. Он является подклассом int, True == 1, False == 0.
flag = True
if flag:
print('Включено')
# Логические операции: and, or, notPython 3 types (типы данных в python 3)
Любое значение может быть преобразовано в bool через bool(value). Пустые последовательности, нули, None - False.
Как создавать и изменять строки?
Тип str - неизменяемая последовательность символов Unicode. Строки можно создавать в одинарных, двойных или тройных кавычках.
s1 = 'Привет'
s2 = "Мир"
s3 = '''Многострочный
текст'''Python float types (типы с плавающей запятой в python)
Основные методы: upper(), lower(), split(), join(), replace(), срезы.
text = 'Python 3'
print(text[:6]) # 'Python'
print(' - '.join(['a', 'b', 'c'])) # 'a - b - c'Python int types (целочисленные типы в python)
Типичные ошибки:
- Попытка изменить символ по индексу приведёт к
TypeError. - Неверное экранирование обратной косой черты.
Как использовать списки?
Тип list - изменяемая последовательность, элементы могут быть разных типов.
nums = [1, 2, 3]
nums.append(4)
nums.extend([5, 6])
print(nums[1:3]) # [2, 3]Списки поддерживают вложенность, сортировку, генераторы списков.
squares = [x**2 for x in range(5)] # [0, 1, 4, 9, 16]Типичные ошибки:
- Использование изменяемого объекта как значение по умолчанию в функции.
- Путаница между
copy()и поверхностным копированием.
Когда стоит применять кортежи?
Тип tuple - неизменяемая последовательность. Часто используется для возврата нескольких значений из функции или как ключ словаря.
t = (1, 2, 3)
single = (42,) # обязательная запятая
# Распаковка
a, b, c = tКортежи занимают меньше памяти и быстрее списков.
Как сгенерировать последовательность чисел без списка?
Тип range представляет арифметическую прогрессию. Экономит память.
r = range(0, 10, 2) # 0,2,4,6,8
for i in r:
print(i)
print(list(r)) # [0, 2, 4, 6, 8]Поддерживает индексацию, длину, проверку вхождения.
Как организовать данные в формате ключ-значение?
Тип dict - отображение, ключи должны быть неизменяемыми (числа, строки, кортежи).
d = {'name': 'Alice', 'age': 25}
d['city'] = 'Moscow'
print(d.get('name'))
# Итерация по ключам/значениямСловари сохраняют порядок вставки с Python 3.7+.
Типичные ошибки:
- Попытка использовать список как ключ приведёт к
TypeError. - Изменение словаря во время итерации.
Как работать с уникальными элементами?
Тип set - неупорядоченная коллекция уникальных элементов. frozenset - неизменяемая версия.
s = {1, 2, 3}
s.add(4)
s.remove(2)
# Операции: объединение, пересечение, разностьfrozenset можно использовать как ключ словаря.
Типичные ошибки:
- Создание пустого множества через
{}даёт словарь, нужноset().
Как работать с двоичными данными?
Типы bytes (неизменяемый) и bytearray (изменяемый) представляют последовательности байтов.
b = b'hello'
ba = bytearray(b'world')
ba[0] = 87 # 'W'Используются при работе с сетевыми протоколами, файлами в двоичном режиме.
Тип memoryview позволяет получить доступ к буферу памяти без копирования.
mv = memoryview(b'abc')
print(mv[0]) # 97Что такое None и когда его применять?
Тип NoneType имеет единственное значение None, обозначающее отсутствие значения.
result = None
if result is None:
print('Нет результата')Часто используется как возвращаемое значение функций без return или как значение по умолчанию.
Как проверить тип данных и выполнить приведение?
Функция type() возвращает тип объекта, isinstance(obj, type) проверяет принадлежность классу или кортежу классов.
x = 5
print(type(x)) # <class 'int'>
print(isinstance(x, (int, float))) # TrueЯвное приведение: int(), str(), list(), set() и т.д.
Проблемы:
- Некорректное преобразование строки в число может вызвать исключение.
- Приведение
floatкintтеряет дробную часть.
Расширенные примеры работы с типами данных
Здесь представлены нестандартные ситуации и углублённые приёмы.
Как обрабатывать большие целые числа и точные дроби?
import decimal, fractions
# Десятичные числа с заданной точностью
decimal.getcontext().prec = 50
pi = decimal.Decimal('3.14159265358979323846264338327950288419716939937510')
print(pi * 2)
# Дроби
frac = fractions.Fraction(1, 3)
print(float(frac)) # 0.3333333333333333
6.2831853071795864769252867665590057683943387987502 0.3333333333333333
Как использовать memoryview для эффективного копирования?
import array
arr = array.array('H', [1, 2, 3, 4]) # unsigned short
mv = memoryview(arr)
mv2 = mv.cast('B') # переинтерпретация как байты
print(mv2.tolist()) # [1,0,2,0,3,0,4,0] (little-endian)
[1, 0, 2, 0, 3, 0, 4, 0]
Как создать словарь с объединением и обновлением?
d1 = {'a': 1, 'b': 2}
d2 = {'b': 3, 'c': 4}
# Оператор | для объединения (Python 3.9+)
merged = d1 | d2
print(merged) # {'a': 1, 'b': 3, 'c': 4}
# Обновление на месте
d1.update(d2)
print(d1) # {'a': 1, 'b': 3, 'c': 4}
{'a': 1, 'b': 3, 'c': 4}
{'a': 1, 'b': 3, 'c': 4}Как использовать frozenset как ключ словаря?
key = frozenset([1, 2, 3])
d = {key: 'value'}
print(d[frozenset([3, 2, 1])]) # Порядок не важен, содержимое совпадает
value
Как безопасно преобразовать строку в число с обработкой ошибок?
def safe_int(s):
try:
return int(s)
except ValueError:
return None
print(safe_int('123')) # 123
print(safe_int('abc')) # None
print(safe_int('0x10')) # ValueError для int(), если base не указан
# Для разных систем счисления используйте int(s, base)
print(int('0x10', 16)) # 16
123 None 16
Как работать с неизменяемыми множествами и проверкой подмножеств?
a = frozenset(range(5))
b = frozenset([2, 3])
print(b.issubset(a)) # True
print(a.issuperset(b))# True
# Разность множеств
print(a - b) # frozenset({0, 1, 4})
True
True
frozenset({0, 1, 4})Как преобразовать строку байтов в строку Unicode и обратно?
data = 'Привет'.encode('utf-8') # bytes
print(data) # b'\xd0\x9f...'
text = data.decode('utf-8')
print(text) # Привет
# Ошибка при неверной кодировке
# data.decode('ascii') -> UnicodeDecodeError
b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82' Привет
Как использовать slice объекты для расширенных срезов?
s = 'PythonProgramming'
sl = slice(0, 6, 2) # start, stop, step
print(s[sl]) # Pto
# Создание среза динамически
def custom_slice(seq, start, stop, step):
return seq[slice(start, stop, step)]
print(custom_slice(s, 6, None, 3)) # Pgm
Pto Pgm
Как получить тип объекта и его имя?
obj = [1, 2, 3]
print(type(obj).__name__) # 'list'
print(isinstance(obj, (list, tuple))) # True
# Проверка на точное совпадение типа без учёта наследования
if type(obj) is list:
print('Точно list')
list True Точно list