Комментарии (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:
- Коллекции используешь в коде (обработка данных)
- Пакеты используешь для структурирования проекта (архитектура)