Гайд для C#-разработчиков
Python для C#-разработчиков: осваивай Python на основе того, что уже знаешь
Уже знаешь C#? Узнай, как знакомые концепции программирования выглядят в Python, что работает иначе и как быстрее всего начать писать продуктивно.
C# и Python: бок о бок
Каждая пара ниже решает одну и ту же задачу. Начни со знакомого кода и посмотри, как то же самое выражается в Python.
Статическая и динамическая типизация
int count = 3;
count = "three"; // compile error
string Greet(string name) => $"Hi {name}";count = 3
count = "three" # allowed
def greet(name: str) -> str:
return f"Hi {name}"В C# компилятор отклонит count = "three". В Python имя можно связать с любым значением, а типы проверяются только при выполнении строки. Аннотации вроде name: str читают инструменты, например mypy, но во время выполнения они не проверяются.
Классы и свойства
public class Account
{
public decimal Balance { get; private set; }
public void Deposit(decimal amount) => Balance += amount;
}class Account:
def __init__(self):
self.balance = 0
def deposit(self, amount):
self.balance += amountТам, где в C# автосвойство, в Python используется обычный атрибут, а позже можно перейти на @property, не меняя вызывающий код. private set нет; ведущее подчёркивание, как в _balance, по соглашению означает «внутреннее».
LINQ, генераторы списков и генераторные выражения
var names = people
.Where(p => p.Active)
.Select(p => p.Name)
.ToList();names = [p.name for p in people if p.active]
# lazy: nothing runs until you iterate it
active = (p for p in people if p.active)Генератор списка сразу строит весь список, как ToList(). Генераторное выражение в скобках ленивое, но его можно пройти только один раз, в отличие от запроса LINQ, который можно перечислить снова. Соответствие не один к одному: для GroupBy или OrderBy ты будешь использовать словари и sorted.
async/await
async Task<string[]> FetchAllAsync(IEnumerable<string> urls)
{
return await Task.WhenAll(urls.Select(FetchAsync));
}import asyncio
async def fetch_all(urls):
return await asyncio.gather(*(fetch(url) for url in urls))Оба языка используют async и await, но корутина Python ничего не делает, пока её не ожидают или не запланируют, например через asyncio.run(...), а Task в C# начинает выполняться сразу после создания. asyncio однопоточный, поэтому подходит для ожидания ввода-вывода, а не для тяжёлых вычислений.
От чего C#-разработчику стоит отучиться
Некоторые привычки плохо переносятся. Вот самые важные сдвиги.
Отступы — это синтаксис
Блок начинается с двоеточия и задаётся отступами, а не фигурными скобками. Используй четыре пробела и будь последователен.
Типы проверяются во время выполнения
Динамическая типизация означает, что имя может ссылаться на любое значение, а ошибки типов проявляются при выполнении строки. Необязательные аннотации типов и проверка с помощью
mypyвозвращают часть безопасности C#.Генераторы списков заменяют большую часть LINQ
Генератор списка вроде
[p.name for p in people if p.active]заменяет привычные цепочкиWhereиSelectодной читаемой строкой.Опирайся на встроенные коллекции
Списки, словари, множества и кортежи покрывают большую часть того, к чему ты обращаешься в
System.Collections.Generic. Проверяй принадлежность черезin, а вместо свойстваCountиспользуйlen(items).Пиши на Python, а не на C# внутри Python
Геттеры, сеттеры и классы с одним методом не нужны. Используй
withтам, где в C# был быusing, а имена пиши вsnake_case, а не вPascalCase.
Твой план перехода с 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