Гайд для C#-разработчиков

Python для C#-разработчиков: осваивай Python на основе того, что уже знаешь

Уже знаешь C#? Узнай, как знакомые концепции программирования выглядят в Python, что работает иначе и как быстрее всего начать писать продуктивно.

C# и Python: бок о бок

Каждая пара ниже решает одну и ту же задачу. Начни со знакомого кода и посмотри, как то же самое выражается в Python.

Статическая и динамическая типизация

C#
int count = 3;
count = "three";   // compile error

string Greet(string name) => $"Hi {name}";
Python
count = 3
count = "three"    # allowed

def greet(name: str) -> str:
    return f"Hi {name}"

В C# компилятор отклонит count = "three". В Python имя можно связать с любым значением, а типы проверяются только при выполнении строки. Аннотации вроде name: str читают инструменты, например mypy, но во время выполнения они не проверяются.

Классы и свойства

C#
public class Account
{
    public decimal Balance { get; private set; }

    public void Deposit(decimal amount) => Balance += amount;
}
Python
class Account:
    def __init__(self):
        self.balance = 0

    def deposit(self, amount):
        self.balance += amount

Там, где в C# автосвойство, в Python используется обычный атрибут, а позже можно перейти на @property, не меняя вызывающий код. private set нет; ведущее подчёркивание, как в _balance, по соглашению означает «внутреннее».

LINQ, генераторы списков и генераторные выражения

C#
var names = people
    .Where(p => p.Active)
    .Select(p => p.Name)
    .ToList();
Python
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

C#
async Task<string[]> FetchAllAsync(IEnumerable<string> urls)
{
    return await Task.WhenAll(urls.Select(FetchAsync));
}
Python
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

  1. Переведи знакомые концепции

    Сопоставь знакомый синтаксис и концепции с Python.

  2. Изучи отличия Python

    Коллекции, функции, идиоматичный стиль.

  3. Практикуйся на реальном коде

    Решай небольшие задачи, а не только читай.

  4. Обрети уверенность

    Более сложные и реалистичные задачи.

Трек Hintor «Python для разработчиков» рассчитан на тех, кто переходит на другой язык, а практические задания встроены прямо в уроки. Посмотреть трек «Python для разработчиков»

Мини-задача

Дан список целых чисел. Напиши код на Python, который создаёт новый список из квадратов только чётных чисел.

Вход
[1, 2, 3, 4, 5, 6]
Ожидаемый результат
[4, 16, 36]

Подсказка: в генератор списка можно добавить фильтр if, а выражение n % 2 == 0 проверяет, чётное ли число n.

Готов превратить знания C# в навыки Python?

Ты уже умеешь программировать. Теперь научись думать на Python с помощью пошаговых уроков и практики.

Начать учить Python на Hintor
Python для C#-разработчиков | Быстро освой Python – Hintor