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.

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:

  1. Zliczania referencji,
  2. 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

  1. Modyfikowalne argumenty domyślne:
def f(lista=[]):
lista.append(1)
return lista

Lista tworzona jest tylko raz – efekt uboczny między wywołaniami.

  1. Kopiowanie list:
a = [1, 2]
b = a

To nie kopia, tylko druga referencja.

  1. Porównywanie tożsamości vs równości:
a == b
a is b

== porównuje wartości, is – tożsamość obiektu.

  1. 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.