← Назад к вопросам

Чем отличаются коллекции и пакеты в Python?

1.0 Junior🔥 201 комментариев
#Python

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Чем отличаются коллекции и пакеты в Python?

Это часто путаются в Python из-за похожих названий. Давай разберёмся на конкретных примерах.

Определение

Коллекции (Collections) — структуры данных

Коллекции — это встроенные типы данных для хранения нескольких объектов:

  • list (список)
  • tuple (кортеж)
  • dict (словарь)
  • set (множество)
  • frozenset (неизменяемое множество)
# Коллекции — это ДАННЫЕ
users = ["John", "Jane", "Bob"]  # list
coordinates = (10, 20)  # tuple
user_data = {"name": "John", "age": 30}  # dict
colors = {"red", "green", "blue"}  # set

Пакеты (Packages) — организация модулей

Пакеты — это способ организации Python файлов в иерархию директорий:

  • Папка с __init__.py = пакет
  • Позволяет импортировать модули структурированно
# Пакет — это СТРУКТУРА
my_project/
  my_package/
    __init__.py       # делает папку пакетом
    module1.py
    module2.py
    subpackage/
      __init__.py
      module3.py

# Импорт из пакета
from my_package import module1
from my_package.subpackage import module3

Коллекции: подробно

1. List — изменяемая, упорядоченная

numbers = [1, 2, 3, 4, 5]

# Изменяемость
numbers[0] = 10  # OK
numbers.append(6)  # OK

# Производительность
# Доступ O(1) — быстро
first = numbers[0]

# Поиск O(n) — медленно
index = numbers.index(3)

# Когда использовать:
# ✅ Когда нужна изменяемость
# ✅ Когда нужен порядок элементов
# ❌ Когда нужно быстро проверять принадлежность элемента (используй set)

2. Tuple — неизменяемая, упорядоченная

point = (10, 20, 30)

# Неизменяемость (immutable)
point[0] = 20  # TypeError!

# Но элементы списка в tuple могут быть изменены
data = ([1, 2], [3, 4])
data[0][0] = 999  # OK! (сам список изменился, tuple не)

# Использование в Python
return (x, y)  # Функция возвращает кортеж
a, b = 1, 2  # Распаковка
d = {(1, 2): "value"}  # Ключ словаря (tuple хешируется, list нет!)

# Когда использовать:
# ✅ Ключи словарей (dict)
# ✅ Элементы множества (set)
# ✅ Когда нужна защита от изменений
# ✅ Когда нужна меньше памяти (чем list)

3. Dict — ключ-значение

user = {"name": "John", "age": 30, "city": "NYC"}

# Доступ по ключу O(1)
print(user["name"])  # "John"

# Проверка наличия ключа
if "email" in user:
    print(user["email"])
else:
    print("No email")  # Вывод

# Добавление
user["email"] = "john@example.com"  # OK

# В Python 3.7+ dict сохраняет порядок insertion
for key in user:
    print(key)  # name, age, city, email (в порядке добавления)

# Когда использовать:
# ✅ Для быстрого поиска по ключу
# ✅ Для структурированных данных (JSON)
# ✅ Для кэширования

4. Set — уникальные элементы, быстрый поиск

colors = {"red", "green", "blue"}

# Дублирование автоматически удаляется
colors = {"red", "red", "blue"}  # Результат: {"red", "blue"}

# Проверка принадлежности O(1) — БЫСТРО!
if "red" in colors:  # Очень быстро
    print("Red is there")

# vs list (медленно)
colors_list = ["red", "blue", "green"]
if "red" in colors_list:  # O(n) — медленнее для больших данных
    print("Red is there")

# Операции над множествами
set1 = {1, 2, 3}
set2 = {2, 3, 4}

union = set1 | set2  # {1, 2, 3, 4}
intersection = set1 & set2  # {2, 3}
difference = set1 - set2  # {1}

# Когда использовать:
# ✅ Проверка принадлежности (in)
# ✅ Удаление дубликатов
# ✅ Операции типа union, intersection
# ❌ Когда нужен порядок элементов

Пакеты: подробно

1. Структура пакета

my_project/
  main.py                    # главный файл
  data_processing/           # ПАКЕТ (папка)
    __init__.py              # делает её пакетом!
    etl.py                   # модуль
    validation.py            # модуль
    utils/                   # подпакет
      __init__.py
      helpers.py

2. init.py файл

Этот файл критичен — его наличие делает папку пакетом:

# data_processing/__init__.py (может быть пустым)

# Или содержать инициализацию
from .etl import extract, load
from .validation import validate

__all__ = ['extract', 'load', 'validate']

# Тогда можем импортировать напрямую:
from data_processing import extract  # вместо from data_processing.etl import extract

3. Импорт из пакетов

# Абсолютный импорт
from data_processing.etl import extract
from data_processing.utils.helpers import format_data

# Относительный импорт (внутри пакета)
# В файле data_processing/validation.py
from .etl import extract  # из соседнего модуля в пакете
from . import utils  # подпакет
from ..main import config  # родительский пакет

# Импорт всего пакета
import data_processing

4. Пространства имён (Namespaces)

Пакеты предотвращают конфликты имён:

# Без пакетов — конфликт!
# utils.py в проекте A
def format_data(x):
    return x.upper()

# utils.py в проекте B
def format_data(x):
    return x.lower()

# С пакетами — no conflict!
from project_a.utils import format_data as format_a
from project_b.utils import format_data as format_b

format_a("Hello")  # HELLO
format_b("Hello")  # hello

Таблица сравнения

╔════════════════════════════════════════════════════════════════╗
║           КОЛЛЕКЦИИ vs ПАКЕТЫ                                  ║
╠════════════════════════════════════════════════════════════════╣
║ Коллекции              │ Пакеты                                ║
╠════════════════════════════════════════════════════════════════╣
║ Структуры данных       │ Организация кода                      ║
║ Содержат данные        │ Содержат модули/файлы                 ║
║ list, dict, set, tuple │ Папки с __init__.py                   ║
║ Встроены в Python      │ Созданы вами                          ║
║ Используются в коде    │ Используются для импорта              ║
║ O(1)-O(n) операции     │ Логическая организация                ║
╚════════════════════════════════════════════════════════════════╝

Контекст Data Engineering

Коллекции в ETL

# Чтение данных из источника и сохранение в коллекции
df_dict = {}  # dict для кэширования
df_list = []  # list для итерации
df_set = set()  # set для дедупликации

# Пример: обработка логов
users_set = set()  # быстрая проверка уникальности
log_records = []  # сохранение в порядке

for log_line in log_file:
    user_id = parse_user_id(log_line)
    users_set.add(user_id)
    log_records.append(log_line)

# Результат: unique users и все логи в порядке
print(f"Unique users: {len(users_set)}")
print(f"Total records: {len(log_records)}")

Пакеты в проекте Data Engineering

# Структура data pipeline проекта
my_data_pipeline/
  __init__.py
  config/
    __init__.py
    settings.py
    credentials.py
  
  extractors/
    __init__.py
    postgres_extractor.py
    api_extractor.py
    s3_extractor.py
  
  transformers/
    __init__.py
    cleaner.py
    normalizer.py
    aggregator.py
  
  loaders/
    __init__.py
    warehouse_loader.py
    s3_loader.py
  
  utils/
    __init__.py
    logging_utils.py
    date_utils.py
    retry_utils.py

# main.py
from my_data_pipeline.extractors import postgres_extractor
from my_data_pipeline.transformers import cleaner
from my_data_pipeline.loaders import warehouse_loader

def run_pipeline():
    data = postgres_extractor.extract()
    cleaned = cleaner.clean(data)
    warehouse_loader.load(cleaned)

Когда используется что

# Сценарий 1: обработка единственного набора данных
orders = [...]  # коллекция (list)
for order in orders:
    process(order)

# Сценарий 2: сложный проект с несколькими модулями
my_etl_pipeline/  # пакет
  extractors/
  transformers/
  loaders/

# Сценарий 3: кэширование результатов
cache = {}  # коллекция (dict)
cache["query_123"] = result  # быстрый доступ

# Сценарий 4: проверка дублей в большом наборе
unique_ids = set()  # коллекция (set)
for record in records:
    if record.id not in unique_ids:  # быстро!
        unique_ids.add(record.id)

Вывод

Коллекции — это о ДАННЫХ:

  • list: упорядоченные изменяемые данные
  • dict: быстрый поиск по ключу
  • set: уникальные элементы, быстрая проверка
  • tuple: неизменяемые данные, ключи dict

Пакеты — это о ОРГАНИЗАЦИИ КОДА:

  • Логическая структура
  • Избегание конфликтов имён
  • Облегчение переиспользования
  • Масштабируемость проекта

Для Data Engineer:

  • Коллекции используешь в коде (обработка данных)
  • Пакеты используешь для структурирования проекта (архитектура)
Чем отличаются коллекции и пакеты в Python? | PrepBro