Python
Python to wysokopoziomowy język programowania ogólnego przeznaczenia, zaprojektowany z naciskiem na czytelność kodu i prostotę składni. Jego twórcą jest Guido van Rossum, a pierwsze publiczne wydanie pojawiło się w 1991 roku. Od początku zakładano, że język ma być narzędziem praktycznym: umożliwiać szybkie tworzenie oprogramowania, minimalizować ilość „szumu składniowego” oraz zachęcać do klarownego stylu.
Spis treści
Co to jest Python w sensie technicznym? Jest to język:
- interpretowany (standardowa implementacja CPython kompiluje do bajtkodu wykonywanego przez maszynę wirtualną),
- dynamicznie typowany,
- z automatycznym zarządzaniem pamięcią,
- wieloparadygmatowy (imperatywny, obiektowy, funkcyjny).
Język Python znajduje zastosowanie w:
- automatyzacji zadań systemowych,
- analizie danych i obliczeniach numerycznych,
- aplikacjach webowych,
- testowaniu oprogramowania,
- przetwarzaniu tekstu,
- edukacji programistycznej.
Python ma być narzędziem czytelnym. Bloki kodu są definiowane przez wcięcia, a nie przez nawiasy klamrowe. To wymusza jednolity styl i eliminuje część błędów strukturalnych typowych dla języków takich jak C czy C++.
Python – składnia, typy danych, model wykonywania i podstawowe kody Python
Struktura programu i wykonywanie kodu
Plik źródłowy zawiera instrukcje wykonywane sekwencyjnie. Interpreter analizuje kod, kompiluje go do bajtkodu i uruchamia w maszynie wirtualnej.
Najprostszy program:
print("Witaj świecie")Brak funkcji main, brak deklaracji typu zmiennych. Wykonywanie zaczyna się od pierwszej instrukcji w pliku.
Dla porównania w C:
#include <stdio.h>int main() {
printf("Witaj świecie\n");
return 0;
}Różnica jest istotna: Python redukuje warstwę techniczną potrzebną do uruchomienia programu.
Dynamiczne typowanie i obiekty
W Pythonie każda wartość jest obiektem. Zmienna jest jedynie referencją do obiektu.
x = 10
x = "tekst"
Ta sama nazwa może wskazywać różne typy w czasie wykonania.
W C:
int x = 10;
x = 20;
Typ jest stały i znany w czasie kompilacji.
Konsekwencje dynamicznego typowania:
- większa elastyczność,
- mniej kodu,
- potencjalne błędy wykrywane dopiero w czasie wykonania.
Podstawowe typy danych
Najważniejsze wbudowane typy:
int– liczby całkowite (dowolna precyzja),float– liczby zmiennoprzecinkowe (podwójna precyzja),bool– wartości logiczne,str– łańcuchy znaków,list– lista dynamiczna,tuple– krotka niemodyfikowalna,dict– słownik (tablica mieszająca),set– zbiór.
Przykład:
a = 5
b = 3.14
c = "napis"
d = [1, 2, 3]
e = {"klucz": 42}
Lista jest strukturą dynamiczną – może zmieniać rozmiar w trakcie działania programu. W C analogiczna struktura wymaga ręcznej alokacji pamięci.
Wcięcia jako element składni
Bloki kodu definiuje się poprzez wcięcia:
if x > 0:
print("Dodatnia")
else:
print("Niedodatnia")
Interpreter wymaga spójnego wcięcia (zwykle 4 spacje). To eliminuje błędy związane z przypadkowym pominięciem nawiasu klamrowego, ale wprowadza nową kategorię błędów – nieprawidłowe wcięcia.
Funkcje i model przekazywania argumentów
Definicja funkcji:
def dodaj(a, b):
return a + b
Argumenty przekazywane są przez przypisanie referencji (call by object reference). Jeśli przekazany obiekt jest modyfikowalny (np. lista), funkcja może zmienić jego zawartość.
def zmien(lista):
lista.append(100)dane = [1, 2]
zmien(dane)
dane zostaje zmodyfikowane.
W C analogiczny efekt wymaga wskaźników.
Python – moduły, środowisko uruchomieniowe, zarządzanie pamięcią i informacje Python o implementacji
Moduły i przestrzenie nazw
Plik .py jest modułem. Import:
import math
print(math.sqrt(16))
Każdy moduł posiada własną przestrzeń nazw. Zapobiega to konfliktom identyfikatorów.
Możliwe jest:
from math import sqrt
W większych projektach struktura modułów pozwala logicznie dzielić kod.
Model pamięci i garbage collector
Python używa:
- Zliczania referencji,
- Cyclic garbage collector do usuwania cykli.
Gdy liczba referencji do obiektu spada do zera – pamięć jest zwalniana. Problemem są cykle referencji:
a = []
b = [a]
a.append(b)
Tu potrzebny jest dodatkowy mechanizm wykrywania cykli.
W C programista zarządza pamięcią ręcznie (malloc, free). Python upraszcza to, ale kosztem mniejszej kontroli i potencjalnych opóźnień związanych z GC.
Interpreter CPython i bajtkod
Standardowa implementacja to CPython. Kod źródłowy kompilowany jest do bajtkodu .pyc.
Można podejrzeć bajtkod:
import disdef f(x):
return x + 1dis.dis(f)
Bajtkod wykonywany jest przez wirtualną maszynę stosową. Operacje są stosunkowo wysokiego poziomu, co wpływa na wydajność w porównaniu z językami kompilowanymi do kodu maszynowego.
Global Interpreter Lock (GIL)
W CPython istnieje mechanizm GIL – tylko jeden wątek może wykonywać kod Pythona naraz. Ogranicza to równoległość w programach CPU-bound.
W przypadku operacji I/O GIL nie stanowi istotnego problemu, ale w obliczeniach numerycznych może ograniczać skalowalność.
Alternatywy:
- multiprocessing,
- biblioteki napisane w C,
- inne implementacje (np. PyPy).
Kody Python w kontekście skryptów systemowych
Python często używany jest jako język skryptowy.
Przykład przetwarzania pliku:
with open("dane.txt") as f:
for linia in f:
print(linia.strip())Ten sam problem w C wymaga większej liczby instrukcji i ręcznego zarządzania buforem.
Obsługa wyjątków
Mechanizm wyjątków:
try:
x = 10 / 0
except ZeroDivisionError:
print("Dzielenie przez zero")
Wyjątki propagują się w górę stosu wywołań. To strukturalny sposób obsługi błędów, w przeciwieństwie do kodów błędów w C.
Typowanie statyczne jako rozszerzenie
Chociaż Python jest dynamiczny, można stosować adnotacje typów:
def suma(a: int, b: int) -> int:
return a + b
Adnotacje nie są wymuszane przez interpreter, ale mogą być analizowane przez narzędzia (np. mypy).
To kompromis między elastycznością a bezpieczeństwem typów.
Uwagi praktyczne i typowe pułapki
- Modyfikowalne argumenty domyślne:
def f(lista=[]):
lista.append(1)
return lista
Lista tworzona jest tylko raz – efekt uboczny między wywołaniami.
- Kopiowanie list:
a = [1, 2]
b = a
To nie kopia, tylko druga referencja.
- Porównywanie tożsamości vs równości:
a == b
a is b
== porównuje wartości, is – tożsamość obiektu.
- Wydajność pętli w czystym Pythonie jest niższa niż w C/C++. W obliczeniach numerycznych lepiej używać bibliotek zoptymalizowanych w C.
Zakończenie
Język Python łączy prostotę składni z rozbudowanym środowiskiem standardowym i czytelnym modelem programowania. Jego siła wynika z równowagi między elastycznością a strukturą. Nie jest to język najszybszy ani najbliższy sprzętowi, ale w ogromnej liczbie zastosowań pozwala uzyskać poprawne rozwiązanie szybciej niż języki niższego poziomu.