Tech Handbook Null Yard

Python - podstawy

Python jest dobrym językiem do automatyzacji, narzędzi CLI, backendu, testów i pracy z danymi. W praktyce ważniejsze od zapamiętywania wersji jest poprawne używanie środowisk wirtualnych, jawnych zależności i dokumentacji projektu.

Powiązane tematy: API i integracje systemów, JSON, YAML, TOML i XML, SQL i PostgreSQL dla developera, Testowanie oprogramowania oraz Programowanie w shellu.

1. Czym jest Python

Python to język programowania wysokiego poziomu, zaprojektowany tak, aby kod był możliwie czytelny.

Najważniejsze cechy:

  • prosta składnia,
  • dynamiczne typowanie,
  • automatyczne zarządzanie pamięcią,
  • ogromna liczba bibliotek,
  • działa na Linuxie, FreeBSD, macOS i Windows,
  • często używany do:
  • automatyzacji,
  • skryptów,
  • backendu,
  • analizy danych,
  • AI/ML,
  • administracji systemami,
  • testów,
  • narzędzi CLI.

Python jest językiem interpretowanym w praktycznym znaczeniu: zwykle uruchamiasz kod bez ręcznego etapu kompilacji do programu wykonywalnego.

Najpopularniejsza implementacja to CPython.


2. Jak działa Python

Typowy plik Pythona:

print("Hello world")

zapisujesz jako:

hello.py

i uruchamiasz:

python3 hello.py

Python:

  1. czyta kod,
  2. analizuje składnię,
  3. kompiluje kod do wewnętrznego bytecode,
  4. wykonuje go w maszynie wirtualnej Pythona.

Bytecode może być zapisywany w katalogach:

__pycache__/

z plikami podobnymi do:

module.cpython-313.pyc

Nie jest to samodzielny program jak binarka C czy Go.


3. Python 2 a Python 3

Obecnie używa się Pythona 3.

Sprawdzenie:

python3 --version

lub czasami:

python --version

Na Linuxie polecenie:

python

nie zawsze istnieje.

Dlatego bezpieczniej używać:

python3

4. Instalacja

Debian / Ubuntu

sudo apt update
sudo apt install python3

Przydatne dodatkowe pakiety:

sudo apt install python3-pip python3-venv

Sprawdzenie:

python3 --version
pip3 --version

FreeBSD

pkg install python3

Lista dostępnych wersji:

pkg search python3

Przykładowo system może zainstalować:

python311
python312
python313

Windows

Python można zainstalować z:

python.org

Podczas instalacji warto zaznaczyć:

Add Python to PATH

Uruchamianie:

python --version

lub:

py --version

Windows posiada także launcher:

py

Przykład:

py script.py

5. Interpreter interaktywny

Uruchom:

python3

Dostaniesz prompt:

>>>

Możesz wpisywać kod bez tworzenia pliku:

>>> 2 + 2
4

>>> print("hello")
hello

Wyjście:

exit()

albo:

Ctrl+D

na Linux/Unix.

Interpreter świetnie nadaje się do:

  • testowania składni,
  • sprawdzania bibliotek,
  • prostych obliczeń,
  • eksperymentów.

6. Uruchamianie pliku

Plik:

app.py

Uruchomienie:

python3 app.py

Można przekazać argumenty:

python3 app.py test.txt --verbose

7. Python jako wykonywalny skrypt

Na Linuxie / FreeBSD można dodać na początku:

#!/usr/bin/env python3

Przykład:

#!/usr/bin/env python3

print("Hello")

Nadaj prawa:

chmod +x script.py

Uruchom:

./script.py

8. Wcięcia są częścią składni

W Pythonie nie używa się klamer jak w C, Go czy JavaScript.

Zamiast:

if (x > 5) {
    console.log(x);
}

Python:

if x > 5:
    print(x)

Kod należący do bloku musi mieć wcięcie.

Najczęściej:

4 spacje

Przykład błędny:

if x > 5:
print(x)

Python zgłosi:

IndentationError

Nie mieszaj tabulatorów i spacji.


9. Komentarze

Komentarz jednoliniowy:

# komentarz

Przykład:

x = 10  # liczba użytkowników

Docstring:

def hello():
    """Wyświetla powitanie."""
    print("Hello")

Docstringi są używane do dokumentowania:

  • funkcji,
  • klas,
  • modułów.

10. Zmienne

Nie trzeba deklarować typu.

name = "Anna"
age = 46
price = 19.99
active = True

Typ może się zmienić:

x = 10
x = "hello"

To jest poprawne.

Python jest:

dynamicznie typowany

ale jednocześnie:

silnie typowany

Przykład:

"5" + 5

spowoduje błąd.

Trzeba zrobić:

int("5") + 5

11. Nazwy zmiennych

Typowy styl:

user_name = "Anna"
max_connections = 100

Stałe umownie:

MAX_CONNECTIONS = 100
API_URL = "https://example.com"

Nazwy klas:

class UserAccount:
    pass

Standard stylu Pythona opisuje dokument:

PEP 8

12. Podstawowe typy danych

int

Liczby całkowite:

x = 10
y = -5

float

price = 19.99

str

Tekst:

name = "Anna"

lub:

name = 'Anna'

bool

True
False

None

Brak wartości:

result = None

Odpowiednik w pewnym sensie:

null
nil

z innych języków.


13. Sprawdzanie typu

x = 10

print(type(x))

wynik:

<class 'int'>

Sprawdzanie typu:

isinstance(x, int)

14. Konwersje typów

int("123")
float("12.5")
str(100)
bool(1)

Przykład:

age = int(input("Podaj wiek: "))

15. Operatory matematyczne

a + b
a - b
a * b
a / b

Dzielenie całkowite:

10 // 3

wynik:

3

Reszta:

10 % 3

wynik:

1

Potęga:

2 ** 8

wynik:

256

16. Porównania

x == y
x != y
x > y
x < y
x >= y
x <= y

UWAGA:

=

to przypisanie.

==

to porównanie.


17. Operatory logiczne

and
or
not

Przykład:

if age >= 18 and active:
    print("OK")

18. Łańcuchy tekstowe

text = "Hello world"

Długość:

len(text)

Zmiana wielkości liter:

text.upper()
text.lower()

Usuwanie białych znaków:

text.strip()

Zamiana:

text.replace("world", "Python")

Podział:

text.split(" ")

Sprawdzenie:

"world" in text

19. f-string

Najwygodniejszy sposób składania tekstu:

name = "Anna"
age = 46

print(f"{name} ma {age} lat")

Można umieszczać wyrażenia:

print(f"2 + 2 = {2 + 2}")

Formatowanie liczb:

price = 12.3456

print(f"{price:.2f}")

wynik:

12.35

20. Dostęp do znaków tekstu

text = "Python"

Pierwszy znak:

text[0]

wynik:

P

Ostatni:

text[-1]

wynik:

n

Fragment:

text[0:3]

wynik:

Pyt

21. Listy

Lista:

users = ["Anna", "Anna", "Piotr"]

Dostęp:

users[0]

Dodawanie:

users.append("Jan")

Usuwanie:

users.remove("Anna")

Liczba elementów:

len(users)

Iteracja:

for user in users:
    print(user)

22. Tuple

Tuple jest podobne do listy, ale jest niemodyfikowalne.

point = (10, 20)

Dostęp:

point[0]

Tuple często reprezentują:

  • współrzędne,
  • pary wartości,
  • wyniki funkcji.

23. Słownik - dict

Bardzo ważny typ.

user = {
    "name": "Anna",
    "age": 46,
    "admin": True
}

Dostęp:

user["name"]

Bezpieczniejsze:

user.get("name")

Można podać wartość domyślną:

user.get("email", "brak")

Dodanie:

user["email"] = "user@example.com"

Iteracja:

for key, value in user.items():
    print(key, value)

24. Set

Zbiór unikalnych elementów:

numbers = {1, 2, 3}

Dodanie:

numbers.add(4)

Set automatycznie usuwa duplikaty.

{1, 1, 2, 2, 3}

da:

{1, 2, 3}

25. if / elif / else

age = 20

if age >= 18:
    print("dorosły")
else:
    print("niepełnoletni")

Kilka warunków:

if score >= 90:
    print("A")
elif score >= 75:
    print("B")
else:
    print("C")

26. Wartości traktowane jako False

Python traktuje jako fałsz między innymi:

False
None
0
0.0
""
[]
{}
set()

Dlatego często spotkasz:

if users:
    print("Lista nie jest pusta")

zamiast:

if len(users) > 0:

27. Pętla for

for x in [1, 2, 3]:
    print(x)

Range:

for i in range(5):
    print(i)

wynik:

0
1
2
3
4

Zakres:

range(1, 5)

wynik odpowiada:

1 2 3 4

Krok:

range(0, 10, 2)

28. enumerate

Gdy potrzebujesz indeksu:

users = ["Anna", "Anna", "Jan"]

for index, user in enumerate(users):
    print(index, user)

29. zip

Łączenie kilku kolekcji:

names = ["Anna", "Jan"]
ages = [30, 40]

for name, age in zip(names, ages):
    print(name, age)

30. Pętla while

x = 0

while x < 5:
    print(x)
    x += 1

31. break i continue

Przerwanie pętli:

for x in range(10):
    if x == 5:
        break

Pominięcie iteracji:

for x in range(10):
    if x == 5:
        continue

    print(x)

32. Funkcje

Definicja:

def hello():
    print("Hello")

Wywołanie:

hello()

Argument:

def hello(name):
    print(f"Hello {name}")

Wywołanie:

hello("Anna")

33. return

def add(a, b):
    return a + b

Użycie:

result = add(2, 3)

34. Argument domyślny

def hello(name="world"):
    print(f"Hello {name}")
hello()
hello("Anna")

35. Argumenty nazwane

def user(name, age):
    print(name, age)

Można:

user(age=30, name="Anna")

36. *args

Dowolna liczba argumentów pozycyjnych:

def add(*numbers):
    return sum(numbers)
add(1, 2, 3, 4)

37. **kwargs

Dowolne argumenty nazwane:

def show(**data):
    print(data)
show(name="Anna", age=30)

otrzymasz słownik:

{
    "name": "Anna",
    "age": 46
}

38. Typowanie opcjonalne - type hints

Python pozwala opisać typy:

def add(a: int, b: int) -> int:
    return a + b

Zmienne:

name: str = "Anna"
age: int = 46

Python zwykle nie wymusza tych typów podczas działania programu.

Służą przede wszystkim:

  • IDE,
  • analizatorom kodu,
  • programistom,
  • narzędziom takim jak mypy.

39. List comprehension

Bardzo częsta konstrukcja:

numbers = [1, 2, 3, 4]

squares = [x * x for x in numbers]

wynik:

[1, 4, 9, 16]

Z filtrem:

even = [x for x in numbers if x % 2 == 0]

40. Moduły

Plik:

math_utils.py

zawiera:

def add(a, b):
    return a + b

Inny plik:

import math_utils

print(math_utils.add(2, 3))

Można importować konkretną funkcję:

from math_utils import add

i potem:

add(2, 3)

41. Biblioteka standardowa

Python ma dużą bibliotekę standardową.

Przykłady:

import os
import sys
import json
import pathlib
import subprocess
import datetime
import logging
import argparse
import sqlite3

Nie trzeba ich instalować przez pip.


42. name i main

Bardzo częsta konstrukcja:

def main():
    print("Program startuje")


if __name__ == "__main__":
    main()

Co to oznacza?

Jeśli uruchomisz:

python3 app.py

to:

__name__

będzie miało wartość:

__main__

Jeśli natomiast plik zostanie zaimportowany jako moduł, funkcja main() nie uruchomi się automatycznie.


43. Pakiety

Przykład projektu:

project/
├── app.py
└── mypackage/
    ├── __init__.py
    ├── users.py
    └── database.py

Import:

from mypackage.users import User

__init__.py historycznie oznaczał katalog jako pakiet Pythona i nadal jest bardzo często używany.


44. pip

pip jest menedżerem pakietów Pythona.

Instalacja biblioteki:

python3 -m pip install requests

To jest zwykle lepsza forma niż:

pip3 install requests

ponieważ jednoznacznie wskazuje interpreter.

Sprawdzenie pakietów:

python3 -m pip list

Informacje:

python3 -m pip show requests

Usunięcie:

python3 -m pip uninstall requests

45. Dlaczego nie instalować wszystkiego globalnie

Jeżeli projekt A potrzebuje:

biblioteka 1.0

a projekt B:

biblioteka 2.0

mogą pojawić się konflikty.

Dlatego projekty powinny mieć własne środowiska.


46. venv - środowisko wirtualne

Tworzenie:

python3 -m venv .venv

Powstanie katalog:

.venv/

Aktywacja Linux / FreeBSD:

source .venv/bin/activate

Prompt zwykle zmieni się:

(.venv) user@server:~/project$

Od tego momentu:

python
pip

dotyczą środowiska projektu.

Instalacja:

pip install requests

Wyjście:

deactivate

47. .venv w Git

Nie wrzucaj środowiska wirtualnego do Git.

.gitignore:

.venv/
__pycache__/
*.pyc

48. requirements.txt

Klasyczny sposób zapisywania zależności.

Eksport:

pip freeze > requirements.txt

Przykład:

requests==2.32.5
flask==3.1.2

Instalacja:

pip install -r requirements.txt

49. pyproject.toml

Nowoczesne projekty Python coraz częściej używają:

pyproject.toml

Może zawierać:

  • dane projektu,
  • zależności,
  • konfigurację builda,
  • konfigurację narzędzi.

Przykład:

[project]
name = "example"
version = "0.1.0"
dependencies = [
    "requests>=2.32",
]

Jeżeli widzisz pyproject.toml, zacznij od jego przeczytania.


50. Instalacja projektu

W katalogu z projektem:

pip install .

Tryb developerski:

pip install -e .

-e oznacza editable.

Zmiany w kodzie projektu są dostępne bez ponownej instalacji.


51. Czytanie plików

Nowoczesny sposób:

from pathlib import Path

text = Path("file.txt").read_text()
print(text)

Zapis:

Path("file.txt").write_text("Hello")

Kodowanie UTF-8:

Path("file.txt").read_text(encoding="utf-8")

52. Klasyczne open()

with open("file.txt", "r", encoding="utf-8") as file:
    content = file.read()

Zapis:

with open("file.txt", "w", encoding="utf-8") as file:
    file.write("Hello")

Dopisanie:

with open("file.txt", "a", encoding="utf-8") as file:
    file.write("kolejna linia\n")

53. with

Konstrukcja:

with ...

zarządza zasobem.

Dzięki temu plik zostanie zamknięty automatycznie.

with open("file.txt") as f:
    data = f.read()

Nie trzeba:

f.close()

54. JSON

import json

Python → JSON:

data = {
    "name": "Anna",
    "age": 46
}

text = json.dumps(data)

JSON → Python:

data = json.loads(text)

Plik:

with open("data.json", "r") as f:
    data = json.load(f)

Zapis:

with open("data.json", "w") as f:
    json.dump(data, f, indent=2)

55. Wyjątki

Przykład błędu:

x = int("abc")

spowoduje:

ValueError

Obsługa:

try:
    x = int("abc")
except ValueError:
    print("Niepoprawna liczba")

56. try / except / else / finally

try:
    x = int(input("Liczba: "))
except ValueError:
    print("Błąd")
else:
    print("OK")
finally:
    print("Koniec")

finally wykona się niezależnie od wyniku.


57. raise

Można samemu zgłosić wyjątek:

if age < 0:
    raise ValueError("Wiek nie może być ujemny")

58. Klasy

Podstawowa klasa:

class User:
    def __init__(self, name):
        self.name = name

    def hello(self):
        print(f"Hello {self.name}")

Utworzenie obiektu:

user = User("Anna")

Wywołanie:

user.hello()

59. self

self oznacza bieżący obiekt.

self.name

to pole konkretnej instancji klasy.

Podobna koncepcja do:

this

w JavaScript, Java czy C++.


60. Dziedziczenie

class Animal:
    def speak(self):
        print("...")


class Dog(Animal):
    def speak(self):
        print("Woof")

61. dataclass

Do prostych struktur danych często używa się:

from dataclasses import dataclass


@dataclass
class User:
    name: str
    age: int

Użycie:

user = User("Anna", 30)

Python automatycznie tworzy między innymi konstruktor.


62. Lambda

Krótka anonimowa funkcja:

square = lambda x: x * x

Najczęściej spotkasz ją jako argument:

users.sort(key=lambda user: user["name"])

Nie należy przesadzać z lambda - zwykła funkcja jest często czytelniejsza.


63. import os

Obsługa systemu:

import os

print(os.getcwd())

Zmienne środowiskowe:

api_key = os.getenv("API_KEY")

To częsty sposób przechowywania sekretów.


64. pathlib

Nowoczesna obsługa ścieżek:

from pathlib import Path

path = Path("data") / "file.txt"

Sprawdzenie:

path.exists()

Katalog:

path.parent

Nazwa:

path.name

65. sys

import sys

Argumenty programu:

print(sys.argv)

Jeśli uruchomisz:

python3 app.py hello world

to:

sys.argv

będzie podobne do:

["app.py", "hello", "world"]

66. argparse

Do tworzenia prawdziwego CLI:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("name")
parser.add_argument("--verbose", action="store_true")

args = parser.parse_args()

print(args.name)

Uruchomienie:

python3 app.py Anna --verbose

Pomoc generowana automatycznie:

python3 app.py --help

67. subprocess

Uruchamianie poleceń systemowych:

import subprocess

subprocess.run(["ls", "-la"])

Pobranie wyniku:

result = subprocess.run(
    ["uname", "-a"],
    capture_output=True,
    text=True
)

print(result.stdout)

Unikaj składania poleceń z niesprawdzonego inputu użytkownika.


68. requests

Popularna biblioteka do HTTP.

Instalacja:

pip install requests

Kod:

import requests

response = requests.get("https://example.com")

print(response.status_code)
print(response.text)

JSON:

data = response.json()

69. Backend webowy

Popularne frameworki:

Flask

Prosty i lekki.

pip install flask

Minimalna aplikacja:

from flask import Flask

app = Flask(__name__)


@app.route("/")
def index():
    return "Hello"

Uruchomienie:

flask --app app run

FastAPI

Bardzo popularny do API.

pip install fastapi uvicorn

Kod:

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def index():
    return {"hello": "world"}

Start:

uvicorn app:app --reload

Django

Duży framework posiadający m.in.:

  • ORM,
  • panel admina,
  • routing,
  • formularze,
  • autoryzację,
  • system szablonów.

Instalacja:

pip install django

Nadaje się do większych aplikacji webowych.


70. SQLite

Python ma SQLite w bibliotece standardowej:

import sqlite3

conn = sqlite3.connect("app.db")
cursor = conn.cursor()

cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY,
    name TEXT
)
""")

conn.commit()
conn.close()

71. Logging

Zamiast wielu print() w większych programach:

import logging

logging.basicConfig(level=logging.INFO)

logging.info("Program uruchomiony")
logging.warning("Uwaga")
logging.error("Błąd")

72. Testy

Python posiada unittest:

import unittest


def add(a, b):
    return a + b


class TestMath(unittest.TestCase):
    def test_add(self):
        self.assertEqual(add(2, 3), 5)


if __name__ == "__main__":
    unittest.main()

Popularniejsze w wielu projektach jest:

pytest

Instalacja:

pip install pytest

Test:

def test_add():
    assert 2 + 3 == 5

Uruchomienie:

pytest

73. Debugowanie

Najprostsze:

print(variable)

Lepsze:

breakpoint()

Przykład:

x = 10

breakpoint()

print(x)

Uruchomienie programu zatrzyma się w debuggerze Pythona.

Podstawowe komendy:

n

next

s

step

c

continue

p x

print wartości x

q

quit


74. Traceback

Gdy program się wywróci, Python pokaże traceback.

Przykład:

Traceback (most recent call last):
  File "/home/user/app.py", line 12, in <module>
    run()
  File "/home/user/app.py", line 8, in run
    x = int("abc")
ValueError: invalid literal for int()

Czytaj od końca:

ValueError

to typ błędu.

Następnie zobacz:

File ...
line ...

Traceback pokazuje drogę, którą program doszedł do błędu.


75. Formatowanie kodu

Popularny formatter:

black

Instalacja:

pip install black

Uruchomienie:

black .

76. Ruff

Bardzo szybkie narzędzie do lintingu i formatowania.

Instalacja:

pip install ruff

Sprawdzenie kodu:

ruff check .

Automatyczne poprawki:

ruff check . --fix

Formatowanie:

ruff format .

77. mypy

Statyczne sprawdzanie type hints:

pip install mypy

Uruchomienie:

mypy app.py

78. Typowa struktura prostego projektu

project/
├── .gitignore
├── README.md
├── pyproject.toml
├── .venv/
├── src/
│   └── app/
│       ├── __init__.py
│       ├── main.py
│       └── utils.py
└── tests/
    └── test_main.py

W mniejszych projektach spotkasz też:

project/
├── app.py
├── utils.py
├── requirements.txt
└── README.md

79. Jak uruchomić cudzy projekt

Najpierw:

git clone ADRES_REPO
cd projekt

Sprawdź:

ls -la

Szukaj:

README.md
pyproject.toml
requirements.txt
setup.py
Pipfile
poetry.lock
uv.lock

Najważniejszy jest zwykle:

README.md

80. Typowy workflow z requirements.txt

git clone ...
cd projekt

python3 -m venv .venv

source .venv/bin/activate

pip install -r requirements.txt

Potem np.:

python app.py

81. Typowy workflow z pyproject.toml

python3 -m venv .venv
source .venv/bin/activate

pip install .

albo developersko:

pip install -e .

Następnie przeczytaj README, aby znaleźć komendę startową.


82. Uruchamianie modułu przez -m

Można uruchamiać moduły:

python3 -m moduł

Przykład:

python3 -m http.server

uruchamia prosty serwer HTTP.

Domyślnie:

http://localhost:8000

Inny port:

python3 -m http.server 9000

83. python -m pip

Lepsze:

python3 -m pip install requests

niż:

pip3 install requests

Dlaczego?

Bo masz pewność, że pip należy do tego samego interpretera:

python3

84. Sprawdzanie interpretera

which python3

Przykład:

/usr/bin/python3

Po aktywacji venv:

which python

może zwrócić:

/home/user/project/.venv/bin/python

85. Wersje Pythona

Sprawdzenie:

python3 --version

W kodzie:

import sys

print(sys.version)

Wersja jako struktura:

print(sys.version_info)

86. pycache

Python może tworzyć:

__pycache__/

To cache skompilowanego bytecode.

Możesz go usunąć.

Nie powinien trafiać do repozytorium.

.gitignore:

__pycache__/
*.py[cod]

87. Zmienne środowiskowe

Shell:

export API_KEY="abc123"

Python:

import os

api_key = os.getenv("API_KEY")

Nie zapisuj sekretów bezpośrednio w kodzie:

API_KEY = "tajny-klucz"

szczególnie jeśli kod trafia do GitHub.


88. .env

Popularny sposób lokalnego przechowywania konfiguracji:

.env

Przykład:

API_KEY=abc123
DATABASE_URL=...

Biblioteka:

pip install python-dotenv

Kod:

from dotenv import load_dotenv
import os

load_dotenv()

api_key = os.getenv("API_KEY")

.gitignore:

.env

89. Dekoratory

Spotkasz kod:

@something
def function():
    pass

@something to dekorator.

Pozwala zmodyfikować lub opakować zachowanie funkcji albo klasy.

Przykład:

@staticmethod
def hello():
    pass

We frameworkach spotkasz często:

@app.get("/")

albo:

@app.route("/")

Nie musisz od razu rozumieć mechanizmu dekoratorów, aby czytać większość kodu.


90. Generator i yield

Zwykła funkcja:

def numbers():
    return [1, 2, 3]

Generator:

def numbers():
    yield 1
    yield 2
    yield 3

Iteracja:

for n in numbers():
    print(n)

Generator tworzy wartości na bieżąco zamiast trzymać cały wynik w pamięci.


91. Iterator

Python często używa protokołu iteratorów.

Przykład:

for item in items:
    ...

Lista, generator, plik i wiele innych obiektów może być iterowane.

Funkcja:

iter()

tworzy iterator.

next()

pobiera kolejny element.


92. async / await

Python obsługuje programowanie asynchroniczne.

Przykład:

import asyncio


async def main():
    await asyncio.sleep(1)
    print("gotowe")


asyncio.run(main())

Spotkasz je szczególnie w:

  • API,
  • crawlerach,
  • botach,
  • aplikacjach sieciowych,
  • kodzie korzystającym z wielu połączeń.

93. await

await mówi mniej więcej:

poczekaj na wynik tej operacji, ale pozwól pętli zdarzeń wykonywać inne zadania.

Nie oznacza automatycznie:

nowy wątek

Asyncio jest innym modelem współbieżności.


94. threading

Python posiada wątki:

import threading

W CPython istnieje mechanizm:

GIL - Global Interpreter Lock

który wpływa na wykonywanie kodu CPU-bound w wielu wątkach.

Do operacji:

  • sieciowych,
  • dyskowych,
  • I/O

wątki nadal mogą być bardzo użyteczne.


95. multiprocessing

Dla zadań mocno obciążających CPU można używać:

multiprocessing

Procesy mają osobne interpretery i mogą wykorzystać wiele rdzeni CPU.


96. Popularne biblioteki

HTTP

requests
httpx
aiohttp

Backend

Flask
FastAPI
Django

Dane

NumPy
pandas
Polars

Wykresy

Matplotlib
Plotly

AI / ML

PyTorch
TensorFlow
scikit-learn
transformers

CLI

argparse
click
typer

Testy

pytest

Browser automation

Playwright
Selenium

97. Gdzie Python jest słabszym wyborem

Python zwykle nie jest pierwszym wyborem dla:

  • kodu wymagającego maksymalnej wydajności,
  • sterowników,
  • kernela,
  • bardzo małych systemów embedded,
  • frontendowego kodu wykonywanego bezpośrednio w przeglądarce,
  • aplikacji wymagających jednej bardzo małej binarki bez runtime.

W takich miejscach częściej pojawia się:

C
C++
Rust
Go
JavaScript

98. Python a JavaScript

Python:

name = "Anna"

if name:
    print(name)

JavaScript:

const name = "Anna";

if (name) {
    console.log(name);
}

Największa różnica wizualna:

Python używa:

wcięć

zamiast:

{}

99. Python a Go

Python:

def add(a, b):
    return a + b

Go:

func add(a int, b int) int {
    return a + b
}

Python jest bardziej dynamiczny.

Go jest:

  • statycznie typowany,
  • kompilowany do binarki,
  • bardziej restrykcyjny,
  • zwykle prostszy w deploymencie.

100. Typowe błędy początkujących

Złe wcięcie

IndentationError

Literówka w nazwie

NameError

Zły typ

TypeError

Niepoprawna wartość

ValueError

Brak klucza

KeyError

Brak elementu listy

IndexError

Brak pliku

FileNotFoundError

Brak modułu

ModuleNotFoundError

Najczęściej oznacza:

  • brak biblioteki,
  • nieaktywne venv,
  • uruchomienie złego interpretera.

101. Jak sprawdzić, skąd ładowany jest moduł

import requests

print(requests.__file__)

Przydatne, gdy masz kilka środowisk lub wersji pakietu.


102. help()

W interpreterze:

help(str)

lub:

help(list.append)

Wyjście:

help()

i wpisz:

quit

103. dir()

Lista atrybutów obiektu:

dir(str)

Przydatne do eksploracji API.


104. Dokumentacja funkcji

print(print.__doc__)

albo:

help(print)

105. dir + type + help

Trzy bardzo przydatne narzędzia do eksploracji:

type(obj)
dir(obj)
help(obj)

Pozwalają szybko zrozumieć nieznany obiekt.


106. Instalacja narzędzi CLI - pipx

Niektórych narzędzi nie warto instalować do projektu.

Przykłady:

black
ruff
poetry
httpie

Do takich programów często wygodne jest:

pipx

Debian:

sudo apt install pipx
pipx ensurepath

Instalacja:

pipx install ruff

Każde narzędzie dostaje własne środowisko.


107. Poetry, uv i inne narzędzia

W projektach możesz spotkać:

Poetry
Pipenv
uv
Hatch
PDM

Ich zadaniem jest zarządzanie:

  • zależnościami,
  • środowiskami,
  • buildem projektu.

Jeśli projekt używa jednego z nich, najlepiej używać narzędzia przewidzianego przez autora projektu zamiast przebudowywać projekt na własną rękę.


108. uv

uv to nowoczesne i bardzo szybkie narzędzie do zarządzania Pythonem, środowiskami i zależnościami.

Możesz spotkać plik:

uv.lock

Typowy workflow może wyglądać:

uv sync

a uruchomienie:

uv run python app.py

Jeżeli repo posiada uv.lock, przeczytaj README projektu przed ręcznym instalowaniem pakietów pipem.


109. Docker i Python

Przykładowy Dockerfile:

FROM python:3.13-slim

WORKDIR /app

COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "app.py"]

Budowanie:

docker build -t my-python-app .

Uruchomienie:

docker run --rm my-python-app

110. Przykładowy .gitignore

# Python
__pycache__/
*.py[cod]

# virtualenv
.venv/
venv/

# secrets
.env

# tests / tools
.pytest_cache/
.mypy_cache/
.ruff_cache/

# IDE
.vscode/
.idea/

111. Minimalny program CLI

#!/usr/bin/env python3

def main():
    name = input("Jak masz na imię? ")

    if not name:
        print("Nie podałeś imienia.")
        return

    print(f"Cześć, {name}!")


if __name__ == "__main__":
    main()

Uruchomienie:

python3 app.py

112. Prosty skrypt przetwarzający plik

from pathlib import Path


def main():
    path = Path("input.txt")

    if not path.exists():
        print("Brak pliku.")
        return

    text = path.read_text(encoding="utf-8")

    lines = text.splitlines()

    print(f"Liczba linii: {len(lines)}")
    print(f"Liczba znaków: {len(text)}")


if __name__ == "__main__":
    main()

113. Proste pobranie API

import requests


def main():
    response = requests.get(
        "https://api.github.com",
        timeout=10,
    )

    response.raise_for_status()

    data = response.json()

    print(data)


if __name__ == "__main__":
    main()

Instalacja:

python3 -m venv .venv
source .venv/bin/activate

pip install requests

Uruchomienie:

python app.py

114. response.raise_for_status()

Przy requests:

response.raise_for_status()

zgłosi wyjątek dla błędów HTTP takich jak:

404
500
403

To często lepsze niż zakładanie, że każde zapytanie się udało.


115. Czytanie kodu Pythona - kolejność

Gdy otwierasz nieznany projekt:

  1. przeczytaj README.md,
  2. znajdź pyproject.toml lub requirements.txt,
  3. znajdź punkt startowy,
  4. szukaj main(),
  5. szukaj:
if __name__ == "__main__":
  1. zobacz importy,
  2. znajdź konfigurację,
  3. sprawdź zmienne środowiskowe,
  4. zobacz katalog testów,
  5. dopiero potem czytaj implementację szczegółową.

116. Jak rozpoznać punkt wejścia

Może nim być:

main.py
app.py
server.py
cli.py
manage.py

lub wpis w:

pyproject.toml

Na przykład:

[project.scripts]
myapp = "myapp.cli:main"

oznacza mniej więcej:

uruchom funkcję main z modułu myapp.cli

117. Jak znaleźć zależności

Szukaj:

requirements.txt
requirements-dev.txt
pyproject.toml
Pipfile
poetry.lock
uv.lock

Nigdy nie zakładaj, że samo:

pip install -r requirements.txt

jest właściwe dla każdego projektu.

Najpierw przeczytaj README.


118. Jak sprawdzić importy

Przykład:

import os
import requests

from pathlib import Path
from flask import Flask
from project.database import Database

Możesz podzielić je na:

standard library

os
pathlib

zewnętrzne biblioteki

requests
flask

kod projektu

project.database

To pomaga szybko zrozumieć architekturę.


119. Jak czytać traceback

Załóżmy:

Traceback...
File "app.py", line 20
File "users.py", line 10
File "database.py", line 42

KeyError: 'name'

Najpierw:

KeyError: 'name'

Potem:

database.py line 42

To najbliższe miejsce faktycznego błędu.

Dopiero potem patrz wyżej na ścieżkę wywołań.


120. Przydatne polecenia

Wersja:

python3 --version

Interpreter:

which python3

pip:

python3 -m pip --version

Pakiety:

python3 -m pip list

Środowisko:

python3 -m venv .venv

Aktywacja:

source .venv/bin/activate

Instalacja zależności:

pip install -r requirements.txt

Uruchomienie:

python app.py

Testy:

pytest

Wyjście z venv:

deactivate

121. Cheat sheet składni

zmienna

x = 10

tekst

name = "Anna"

lista

items = [1, 2, 3]

słownik

user = {"name": "Anna"}

if

if x > 5:
    print(x)

for

for item in items:
    print(item)

while

while x > 0:
    x -= 1

funkcja

def add(a, b):
    return a + b

klasa

class User:
    pass

wyjątek

try:
    ...
except ValueError:
    ...

import

import os

plik

with open("file.txt") as f:
    data = f.read()

122. Minimalny workflow nowego projektu

mkdir projekt
cd projekt

python3 -m venv .venv

source .venv/bin/activate

Utwórz:

app.py

Kod:

def main():
    print("Hello Python")


if __name__ == "__main__":
    main()

Uruchom:

python app.py

Jeżeli potrzebujesz biblioteki:

pip install requests

Zapis zależności:

pip freeze > requirements.txt

123. Minimalny workflow pobranego projektu

git clone URL
cd REPO

Przeczytaj:

less README.md

Sprawdź pliki:

ls -la

Utwórz środowisko:

python3 -m venv .venv
source .venv/bin/activate

Jeśli projekt posiada:

requirements.txt

to najczęściej:

pip install -r requirements.txt

Jeśli ma:

pyproject.toml

to może być:

pip install -e .

ale zawsze najpierw sprawdź instrukcję autora.


124. Najważniejsze rzeczy do zapamiętania

Jeżeli chcesz przede wszystkim rozumieć i uruchamiać kod Pythona, zapamiętaj te rzeczy:

  1. Python używa wcięć zamiast klamer.
  2. Pliki mają zwykle rozszerzenie:
.py
  1. Uruchomienie:
python3 app.py
  1. Projekty powinny używać:
venv
  1. Biblioteki instalujesz przez:
pip
  1. Zależności znajdziesz najczęściej w:
requirements.txt
pyproject.toml
  1. Najważniejsze typy:
int
float
str
bool
list
tuple
dict
set
None
  1. Najważniejsze konstrukcje:
if
for
while
def
class
try
import
with
  1. Przy błędzie czytaj koniec tracebacka.

  2. Cudzego projektu nie uruchamiaj w ciemno. Najpierw:

README → zależności → venv → instalacja → konfiguracja → start
  1. Nie zapisuj sekretów w kodzie ani w repozytorium.

  2. python -m ... jest bardzo przydatnym mechanizmem.

  3. type(), dir() i help() pozwalają szybko eksplorować nieznany kod.

  4. pathlib jest zwykle wygodniejsze od starego stylu ręcznego składania ścieżek.

  5. Python jest świetnym językiem do automatyzacji i klejenia różnych systemów w całość.


125. Komendy, które warto znać na pamięć

python3 --version

python3

python3 app.py

python3 -m venv .venv

source .venv/bin/activate

python -m pip install PACKAGE

python -m pip install -r requirements.txt

python -m pip list

pytest

deactivate

Jeżeli swobodnie rozumiesz powyższe polecenia oraz konstrukcje opisane w tym kompendium, jesteś w stanie uruchomić, przejrzeć i wstępnie debugować większość zwykłych projektów napisanych w Pythonie.

Oficjalne źródła

  • Python documentation: https://docs.python.org/3/
  • Python downloads and supported releases: https://www.python.org/downloads/
  • venv: https://docs.python.org/3/library/venv.html
  • Packaging guide: https://packaging.python.org/