Przewodnik dla programistów C#

Python dla programistów C#: ucz się Pythona na tym, co już wiesz

Znasz już C#? Zobacz, jak znane pojęcia programistyczne przekładają się na Pythona, co działa inaczej i jaka jest najszybsza droga do produktywności.

C# i Python obok siebie

Każda para poniżej wykonuje to samo zadanie. Zacznij od znanego kodu, a potem zobacz, jak wyraża go Python.

Typowanie statyczne i dynamiczne

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}"

W C# kompilator odrzuci count = "three". W Pythonie nazwę można związać z dowolną wartością, a typy są sprawdzane dopiero przy wykonaniu linii. Adnotacje takie jak name: str czytają narzędzia, np. mypy, ale w czasie działania nigdy nie są wymuszane.

Klasy i właściwości

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

Tam, gdzie C# używa auto-właściwości, Python używa zwykłego atrybutu, a później możesz przejść na @property bez zmian po stronie wywołujących. Nie ma private set; wiodące podkreślenie, jak w _balance, z konwencji oznacza element wewnętrzny.

LINQ, wyrażenia listowe i generatory

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)

Wyrażenie listowe buduje całą listę od razu, jak ToList(). Wyrażenie generatora w nawiasach jest leniwe, ale można je zużyć tylko raz, w przeciwieństwie do zapytania LINQ, które możesz wyliczyć ponownie. To nie jest odpowiedniość jeden do jednego: do GroupBy czy OrderBy użyjesz słowników i 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))

Oba języki używają async i await, ale korutyna Pythona nic nie robi, dopóki nie zostanie oczekiwana lub zaplanowana, np. przez asyncio.run(...), podczas gdy Task w C# zaczyna działać zaraz po utworzeniu. asyncio jest jednowątkowe, więc nadaje się do oczekiwania na operacje wejścia-wyjścia, a nie do ciężkich obliczeń.

Czego programiści C# powinni się oduczyć

Niektóre nawyki źle się przenoszą. Te zmiany liczą się najbardziej.

  • Wcięcia są składnią

    Bloki zaczynają się dwukropkiem i są wyznaczane wcięciami, a nie nawiasami klamrowymi. Używaj czterech spacji i trzymaj się tego konsekwentnie.

  • Typy sprawdzane są w trakcie działania

    Typowanie dynamiczne oznacza, że nazwa może wskazywać dowolną wartość, a błędy typów ujawniają się dopiero przy wykonaniu linii. Opcjonalne adnotacje typów i narzędzie takie jak mypy przywracają część bezpieczeństwa znanego z C#.

  • Wyrażenia listowe zastępują większość LINQ

    Wyrażenie listowe, takie jak [p.name for p in people if p.active], zastępuje typowe łańcuchy Where i Select jedną czytelną linią.

  • Korzystaj z wbudowanych kolekcji

    Listy, słowniki, zbiory i krotki pokrywają większość tego, po co sięgasz do System.Collections.Generic. Użyj in, aby sprawdzić przynależność, a len(items) zamiast właściwości Count.

  • Pisz po pythonowemu, a nie w stylu C#

    Pomiń gettery, settery i klasy z jedną metodą. Używaj with tam, gdzie w C# użyłbyś using, a nazwy zapisuj w snake_case, a nie w PascalCase.

Twój plan nauki: z C# do Pythona

  1. Przełóż znane pojęcia

    Dopasuj znaną składnię i pojęcia do Pythona.

  2. Poznaj różnice w Pythonie

    Kolekcje, funkcje, idiomatyczny styl.

  3. Ćwicz na prawdziwym kodzie

    Rozwiązuj małe zadania, nie tylko czytaj.

  4. Zdobądź pewność siebie

    Trudniejsze, bardziej realistyczne wyzwania.

Ścieżka Python dla programistów w Hintor jest przeznaczona dla osób, które zmieniają język programowania, a praktyczne ćwiczenia są częścią lekcji. Zobacz ścieżkę Python dla programistów

Mini wyzwanie

Dla listy liczb całkowitych napisz kod w Pythonie, który utworzy nową listę zawierającą kwadraty wyłącznie liczb parzystych.

Dane wejściowe
[1, 2, 3, 4, 5, 6]
Oczekiwany wynik
[4, 16, 36]

Podpowiedź: wyrażenie listowe może zawierać filtr if, a n % 2 == 0 sprawdza, czy n jest parzyste.

Gotowy, by zamienić wiedzę o C# w umiejętności Pythona?

Już umiesz programować. Teraz naucz się myśleć w Pythonie dzięki prowadzonym lekcjom i praktyce.

Zacznij naukę Pythona w Hintor
Python dla programistów C# | Naucz się Pythona szybciej – Hintor