Гайд для C++-разработчиков
Python для C++-разработчиков: осваивай Python на основе того, что уже знаешь
Уже знаешь C++? Узнай, как знакомые концепции программирования выглядят в Python, что работает иначе и как быстрее всего начать писать продуктивно.
C++ и Python: бок о бок
Каждая пара ниже решает одну и ту же задачу. Начни со знакомого кода и посмотри, как то же самое выражается в Python.
Статическая и динамическая типизация
int count = 3;
count = "three"; // compile error
std::string name = "Ada";count = 3
count = "three" # allowed
name: str = "Ada"C++ фиксирует тип каждой переменной при компиляции. В Python имя можно связать со значением любого типа, а типы проверяются только при выполнении строки. Аннотации вроде name: str читают инструменты, например mypy, но во время выполнения они не проверяются, а целые числа не переполняются.
Память, указатели и ссылки
int value = 10;
int* ptr = &value;
*ptr = 20;
void bump(int& n) { n += 1; }a = [1, 2]
b = a
b.append(3)
print(a) # [1, 2, 3]В Python нет указателей и ручного управления памятью: каждое имя — ссылка на объект, а объекты освобождаются, когда на них больше ничто не ссылается. b = a копирует ссылку, а не список. Целые числа и строки неизменяемы, поэтому n += 1 внутри функции привязывает локальное имя заново, а не меняет значение у вызывающего кода.
std::vector и списки
std::vector<int> nums = {1, 2, 3};
nums.push_back(4);
// holds only ints, stored side by sidenums = [1, 2, 3]
nums.append(4)
mixed = [1, "two", 3.0]std::vector хранит значения одного типа подряд в памяти. Список Python хранит ссылки на объекты, поэтому может смешивать типы: это гибко, но тяжелее и медленнее для больших объёмов числовых данных. Для компактного хранения чисел используй модуль array или NumPy.
Циклы и алгоритмы STL
std::vector<int> evens;
for (int n : nums) {
if (n % 2 == 0) evens.push_back(n);
}
int total = std::accumulate(nums.begin(), nums.end(), 0);
std::sort(nums.begin(), nums.end());evens = [n for n in nums if n % 2 == 0]
total = sum(nums)
nums.sort()Большинство алгоритмов STL превращаются в генераторы списков или встроенные функции вроде sum, min, max, any и all, а передаёшь ты саму коллекцию, а не пару итераторов. nums.sort() сортирует на месте, а sorted(nums) возвращает новый список.
От чего C++-разработчику стоит отучиться
Некоторые привычки плохо переносятся. Вот самые важные сдвиги.
Отступы — это синтаксис
Блок начинается с двоеточия и задаётся отступами, а не фигурными скобками. Используй четыре пробела и будь последователен.
Типы проверяются во время выполнения
Динамическая типизация означает, что имя может ссылаться на любое значение, а ошибки типов проявляются при выполнении строки. Необязательные аннотации типов и проверка с помощью
mypyвозвращают часть безопасности C++.Перебирай элементы, а не индексы
Проходи по самой коллекции. Прежде чем писать
range(len(items)), подумай оenumerateилиzip.Опирайся на встроенные коллекции
Списки, словари, множества и кортежи покрывают большую часть того, что ты импортируешь из STL. Генератор списка вроде
[len(w) for w in words]заменяет простой цикл, который наполняет список; добавьifв конце, чтобы отфильтровать элементы.Никакого ручного управления памятью
Не нужно управлять указателями и освобождать память, нет разделения на заголовок и реализацию и нет секции
private:: Python сам убирает объекты. Используйwithтам, где ты полагался бы на RAII, а имена пиши вsnake_case.
Твой план перехода с C++ на Python
Переведи знакомые концепции
Сопоставь знакомый синтаксис и концепции с Python.
Изучи отличия Python
Коллекции, функции, идиоматичный стиль.
Практикуйся на реальном коде
Решай небольшие задачи, а не только читай.
Обрети уверенность
Более сложные и реалистичные задачи.
Трек Hintor «Python для разработчиков» рассчитан на тех, кто переходит на другой язык, а практические задания встроены прямо в уроки. Посмотреть трек «Python для разработчиков»
Мини-задача
Дан список целых чисел. Напиши код на Python, который создаёт новый список из квадратов только чётных чисел.
- Вход
- [1, 2, 3, 4, 5, 6]
- Ожидаемый результат
- [4, 16, 36]
Подсказка: в генератор списка можно добавить фильтр if, а выражение n % 2 == 0 проверяет, чётное ли число n.
numbers = [1, 2, 3, 4, 5, 6]
even_squares = [n * n for n in numbers if n % 2 == 0]
print(even_squares) # [4, 16, 36]Генератор списка читается слева направо: вычислить n * n для каждого n из numbers, оставив только чётные. Обычный цикл for с append тоже подойдёт; генератор списка — идиоматичное сокращение.
Готов превратить знания C++ в навыки Python?
Ты уже умеешь программировать. Теперь научись думать на Python с помощью пошаговых уроков и практики.
Начать учить Python на Hintor