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
std::string name = "Ada";count = 3
count = "three" # allowed
name: str = "Ada"C++ ustala typ każdej zmiennej w czasie kompilacji. W Pythonie nazwę można związać z wartością dowolnego typu, a typy są sprawdzane dopiero przy wykonaniu linii. Adnotacje takie jak name: str czytają narzędzia, np. mypy, ale w czasie działania nie są wymuszane, a liczby całkowite nigdy się nie przepełniają.
Pamięć, wskaźniki i referencje
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 nie ma wskaźników ani ręcznego zarządzania pamięcią: każda nazwa to referencja do obiektu, a obiekty są zwalniane, gdy nic się już do nich nie odwołuje. b = a kopiuje referencję, a nie listę. Liczby całkowite i napisy są niezmienne, więc n += 1 w funkcji wiąże lokalną nazwę na nowo, zamiast zmieniać wartość u wywołującego.
std::vector i listy
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 przechowuje wartości jednego typu obok siebie w pamięci. Lista Pythona przechowuje referencje do obiektów, więc może mieszać typy, co jest elastyczne, ale cięższe i wolniejsze przy dużych ilościach danych liczbowych. Do zwartego przechowywania liczb użyj modułu array lub NumPy.
Pętle i algorytmy 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()Większość algorytmów STL zamienia się w wyrażenia listowe lub funkcje wbudowane, takie jak sum, min, max, any i all, a przekazujesz samą kolekcję zamiast pary iteratorów. nums.sort() sortuje w miejscu, a sorted(nums) zwraca nową listę.
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++.Iteruj po elementach, nie po indeksach
Przechodź po samej kolekcji. Zanim napiszesz
range(len(items)), sięgnij poenumeratelubzip.Korzystaj z wbudowanych kolekcji
Listy, słowniki, zbiory i krotki pokrywają większość tego, co importujesz z biblioteki STL. Wyrażenie listowe, takie jak
[len(w) for w in words], zastępuje prostą pętlę budującą listę; dodaj na końcuif, aby filtrować.Brak ręcznego zarządzania pamięcią
Nie zarządzasz wskaźnikami ani nie zwalniasz pamięci, nie ma podziału na nagłówek i implementację ani sekcji
private:: Python sprząta obiekty za ciebie. Używajwithtam, gdzie polegałbyś na RAII, a nazwy zapisuj wsnake_case.
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