Типы данных Python на собеседовании аналитика

Зачем аналитику знать типы данных

Типы данных — фундамент, на котором строится всё остальное. На собеседовании вопросы по типам кажутся базовыми, но именно здесь кандидаты допускают ошибки, которые выдают поверхностное понимание Python. Интервьюер проверяет не запоминание списка типов, а понимание поведения: почему 0.1 + 0.2 не равно 0.3, почему нельзя менять элементы кортежа, почему pandas показывает object вместо str.

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

Вопрос «чем отличается list от tuple» звучит на каждом втором собеседовании. Правильный ответ — не просто «tuple неизменяемый», а объяснение, почему это важно: хешируемость, безопасность, использование как ключ словаря.

Базовые типы

int — целые числа. В Python 3 нет ограничения на размер: можно хранить числа с тысячами цифр. На собеседовании могут спросить, чем int в Python отличается от int в C или SQL — ответ: нет переполнения.

float — числа с плавающей точкой. Стандарт IEEE 754, 64 бита. Классическая ловушка: 0.1 + 0.2 == 0.3 возвращает False из-за ошибки представления. Для точных финансовых расчётов используйте decimal.Decimal.

str — строки. Неизменяемые, поддерживают индексацию и срезы. Методы upper(), lower(), strip(), split(), replace() спрашивают на каждом собеседовании. f-строки для форматирования: f"Hello, {name}".

bool — True и False. Наследуется от int: True == 1, False == 0. Это позволяет суммировать булевы значения: sum([True, False, True]) вернёт 2. На собеседовании могут спросить, что вернёт True + True.

NoneType — тип значения None. Проверка: x is None, не x == None. Это идиоматический Python и частый вопрос.

Mutable vs immutable

Неизменяемые (immutable): int, float, str, tuple, frozenset. Нельзя изменить объект — можно только создать новый. s = 'hello'; s[0] = 'H' вызовет ошибку.

Изменяемые (mutable): list, dict, set. Можно менять содержимое на месте. lst = [1, 2, 3]; lst[0] = 10 — работает.

Почему это важно:

  • Неизменяемые объекты хешируемы — их можно использовать как ключи словаря и элементы множества. Tuple — можно, list — нет.
  • Изменяемые объекты как аргументы по умолчанию — классическая ловушка: def func(lst=[]) создаёт один список на все вызовы. Правильно: def func(lst=None).
  • При передаче в функцию изменяемый объект может быть изменён внутри функции — это побочный эффект, о котором нужно помнить.

Приведение типов

Явное приведение: int('42'), float('3.14'), str(42), bool(0). На собеседовании могут спросить, что вернёт bool('') (False), bool('0') (True — непустая строка) или int(True) (1).

Неявное приведение: Python автоматически приводит int к float в арифметике: 1 + 2.0 вернёт 3.0. bool к int: True + 1 вернёт 2. Строки не приводятся автоматически: '2' + 2 вызовет TypeError.

Falsy-значения — значения, которые приводятся к False: 0, 0.0, '', [], {}, set(), None, False. Всё остальное — truthy. Это важно для условий: if data: проверяет, что data непуст.

dtypes в pandas

object — тип по умолчанию для строковых колонок. Фактически хранит Python-объекты, поэтому медленнее специализированных типов. Если видите object — проверьте, не нужна ли конвертация.

int64 / float64 — числовые типы по умолчанию. float64 появляется даже для целых чисел, если есть пропуски (NaN — это float). В pandas 1.0+ есть nullable integer: pd.Int64Dtype(), который допускает пропуски без конвертации в float.

category — категориальный тип для колонок с малым числом уникальных значений: пол, город, статус. Экономит память и ускоряет группировку. df['city'] = df['city'].astype('category').

datetime64 — тип для дат. Создаётся через pd.to_datetime. Без явной конвертации pandas может оставить даты как object — и dt-аксессор будет недоступен.

На собеседовании часто просят оптимизировать память DataFrame. Ответ: category для строк с повторами, int8/int16/int32 вместо int64 для малых чисел, downcast в pd.to_numeric. На миллионах строк это снижает память в 5-10 раз.

FAQ

Чем list отличается от tuple?

list изменяемый — можно добавлять, удалять и менять элементы. tuple неизменяемый — после создания его содержимое нельзя изменить. Практические следствия: tuple хешируем (можно использовать как ключ словаря), безопаснее при передаче в функции, немного быстрее при итерации.

Почему 0.1 + 0.2 не равно 0.3?

Числа с плавающей точкой хранятся в двоичном формате, и 0.1 не имеет точного двоичного представления. Результат 0.1 + 0.2 — 0.30000000000000004. Для сравнения используйте math.isclose(a, b) или abs(a - b) < epsilon. Для финансовых расчётов — decimal.Decimal.

Как проверить тип переменной?

type(x) возвращает тип, isinstance(x, int) проверяет принадлежность к типу (включая наследование). isinstance предпочтительнее: isinstance(True, int) вернёт True, потому что bool наследует от int. Больше тем — в разделе Python и подготовка.

Смотрите также