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
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}"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
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 += amountTam, 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
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)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
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))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
mypyprzywracają 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ńcuchyWhereiSelectjedną 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żyjin, aby sprawdzić przynależność, alen(items)zamiast właściwościCount.Pisz po pythonowemu, a nie w stylu C#
Pomiń gettery, settery i klasy z jedną metodą. Używaj
withtam, gdzie w C# użyłbyśusing, a nazwy zapisuj wsnake_case, a nie wPascalCase.
Twój plan nauki: z C# do Pythona
Przełóż znane pojęcia
Dopasuj znaną składnię i pojęcia do Pythona.
Poznaj różnice w Pythonie
Kolekcje, funkcje, idiomatyczny styl.
Ćwicz na prawdziwym kodzie
Rozwiązuj małe zadania, nie tylko czytaj.
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.
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]Wyrażenie listowe czyta się od lewej do prawej: oblicz n * n dla każdego n z numbers, zachowując tylko parzyste. Zwykła pętla for z append też zadziała; wyrażenie listowe to idiomatyczny skrót.
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