Быстрый старт: Синтаксис Python, структуры данных и отличия от C++ и PHP
Быстрый старт: Синтаксис Python, структуры данных и отличия от C++ и PHP
Добро пожаловать в курс «Python для сбора и обработки данных». Поскольку вы уже владеете C++, PHP и SQL, мы пропустим объяснения того, что такое переменная или цикл. Ваша задача — перенести существующие ментальные модели на рельсы Python и понять, почему этот язык стал стандартом де-факто в мире Data Science.
В этой статье мы разберем ключевые отличия синтаксиса, погрузимся в структуры данных, которые вы будете использовать 90% времени при обработке информации, и научимся писать «pythonic» код.
Философия и базовый синтаксис: Культурный шок
Первое, что бросается в глаза после C++ и PHP — это чистота кода. В Python нет фигурных скобок {} для обозначения блоков кода и точек с запятой ; для завершения инструкций (хотя технически ; допустима, ее использование считается дурным тоном).
Отступы как закон
В C++ и PHP отступы служат для читаемости. В Python отступы — это синтаксис. Блок кода определяется его смещением вправо (обычно 4 пробела).
Сравним условие:
PHP / C++:
if (x > 0) {
y = x * 2;
print(y);
}
Python:
if x > 0:
y = x * 2
print(y)
Динамическая типизация и ссылки
Python — язык с сильной динамической типизацией.
- Динамическая: Тип переменной определяется в момент присваивания (как в PHP).
- Сильная: Вы не можете просто сложить строку и число (в отличие от PHP, который попытается привести типы, или JS). Python выбросит ошибку
TypeError.
Важное отличие от C++: переменные в Python — это не коробки с данными, а ссылки (ярлыки) на объекты в памяти.
Пример:
a = [1, 2, 3]
b = a # b ссылается на ТОТ ЖЕ объект, что и a
b.append(4)
# В a тоже появится 4, так как это один объект
print(a) # Вывод: [1, 2, 3, 4]
В C++ аналогом было бы использование указателей или ссылок (std::vector<int>& b = a;). В Python это поведение по умолчанию для всех изменяемых типов.
Структуры данных для обработки информации
В Data Science правильный выбор структуры данных определяет эффективность алгоритма. Рассмотрим основные встроенные типы.
Списки (Lists)
Это аналог std::vector в C++ или индексированного массива в PHP. Списки изменяемы, упорядочены и могут хранить элементы разных типов (хотя на практике обычно хранят однотипные данные).
Киллер-фича Python при работе с данными — срезы (slicing).
Синтаксис среза: list[start:stop:step].
data = [10, 20, 30, 40, 50, 60]
print(data[0]) # 10 (первый элемент)
print(data[-1]) # 60 (последний элемент, очень удобно!)
print(data[1:4]) # [20, 30, 40] (с 1-го по 4-й не включительно)
print(data[::-1]) # [60, 50, ..., 10] (разворот списка)
Срезы создают копию данных, а не ссылку на оригинальный список (для простых списков).
Словари (Dictionaries)
Аналог ассоциативных массивов в PHP ($arr['key']) или std::unordered_map в C++. Это структура «ключ-значение». В задачах сбора данных (парсинг JSON, работа с API) это самая используемая структура.
user = {
"id": 42,
"name": "Alice",
"roles": ["admin", "editor"]
}
print(user["name"]) # Alice
user["email"] = "alice@example.com" # Добавление новой пары
Поиск по ключу в словаре происходит очень быстро.
Где — время поиска элемента, а — константная временная сложность (в среднем случае), не зависящая от количества элементов в словаре.
Кортежи (Tuples)
Это неизменяемые списки. Записываются в круглых скобках (1, 2, 3).
Зачем они нужны, если есть списки?
- Защита данных: Вы гарантируете, что данные не будут изменены случайно.
- Производительность: Они занимают меньше памяти и работают быстрее списков.
- Ключи словаря: Кортеж может быть ключом словаря (так как он хешируем), а список — нет.
Множества (Sets)
Аналог std::unordered_set. Неупорядоченная коллекция уникальных элементов. Идеально подходит для удаления дубликатов из собранных данных.
raw_emails = ["a@test.com", "b@test.com", "a@test.com"]
unique_emails = set(raw_emails)
# Результат: {"a@test.com", "b@test.com"}
Управляющие конструкции и итераторы
Цикл for
Забудьте про for (int i = 0; i < n; i++). В Python цикл for — это всегда итерация по коллекции (foreach).
users = ["Alice", "Bob", "Charlie"]
for user in users:
print(f"Processing {user}")
Если вам нужен индекс, используйте функцию enumerate():
for index, user in enumerate(users):
print(f"User #{index}: {user}")
List Comprehensions (Списковые включения)
Это мощный инструмент для преобразования данных в одну строку. Это то, что отличает Python-разработчика от того, кто просто пишет на Python как на C++.
Задача: Получить список квадратов четных чисел.
Стиль C++:
numbers = [1, 2, 3, 4, 5]
squares = []
for x in numbers:
if x % 2 == 0:
squares.append(x * x)
Pythonic Style:
numbers = [1, 2, 3, 4, 5]
squares = [x * x for x in numbers if x % 2 == 0]
Это читается как естественный язык: «Список из для каждого в numbers, если четный».
Функции
Функции объявляются ключевым словом def. Важное отличие от C++: функция может возвращать несколько значений (технически это возвращается кортеж).
def parse_url(url):
# Логика парсинга...
domain = "example.com"
path = "/index"
return domain, path
d, p = parse_url("http://example.com/index")
Аргументы
Python поддерживает именованные аргументы и значения по умолчанию, что делает вызовы функций очень читаемыми.
def connect_db(host, port=5432, timeout=10):
pass
# Можно вызывать так, пропуская port:
connect_db("localhost", timeout=30)
Работа с файлами (Context Managers)
В C++ вы должны помнить о закрытии файла или использовать RAII. В Python для этого есть оператор with.
# Файл автоматически закроется после выхода из блока
with open("data.txt", "r", encoding="utf-8") as f:
content = f.read()
Это гарантирует освобождение ресурсов даже в случае возникновения исключения внутри блока.
Заключение
Переход с C++/PHP на Python для работы с данными требует смены парадигмы:
- Меньше шаблонного кода (boilerplate).
- Больше работы со встроенными структурами данных (списки, словари).
- Использование срезов и списковых включений вместо явных циклов с индексами.
В следующей статье мы рассмотрим библиотеки NumPy и Pandas, которые превращают Python в мощнейший инструмент аналитики, сравнимый с MATLAB и R.