🐍 Python

Полный справочник: типы, строки, коллекции, функции, ООП и dataclass, исключения, файлы, итераторы, async, типизация, pytest и библиотеки.

Шпаргалки · Программирование · #python #py #scripting #data

Запуск и окружение

python app.py                      python -m http.server 8000
python -m venv .venv               source .venv/bin/activate        # Windows: .venv\Scripts\activate
pip install requests               pip freeze > requirements.txt    pip install -r requirements.txt
uv init / uv add requests / uv run app.py                            # быстрый современный менеджер

Редакторы: PyCharm, VS Code. Форматирование и проверки: ruff, black, mypy, pyright.

Типы данных

Тип Пример Изменяемый
int, float, complex, bool 42, 3.14, 1+2j, True нет
str 'a', "b", """многострочная""" нет
bytes b'abc' нет
list [1, 2, 3] да
tuple (1, 2) нет
dict {'a': 1} да
set, frozenset {1, 2} да / нет
None отсутствие значения
type(5); isinstance(5, int); int('42'); float('3.5'); str(10); bool([])   # пустое ложно
0.1 + 0.2 == 0.3                       # False: используйте math.isclose или decimal.Decimal
10 // 3; 10 % 3; 2 ** 10; divmod(10, 3)

Ложные значения: False, None, 0, 0.0, '', [], {}, (), set().

Строки

name = 'Аня'; age = 30
f'{name} — {age:03d} — {3.14159:.2f} — {1234567:,}'     # f-строки
'a,b,c'.split(','); ','.join(['a', 'b']); '  x '.strip()
s.upper(); s.lower(); s.replace('a', 'b'); s.startswith('x'); s.find('x'); s.count('x')
s[0]; s[-1]; s[1:4]; s[::-1]           # индексы и срезы [start:stop:step]
'x' in s; len(s); s.isdigit(); s.zfill(5); s.center(10, '*')

Коллекции

lst = [3, 1, 2]
lst.append(4); lst.extend([5]); lst.insert(0, 9); lst.remove(9); lst.pop(); lst.sort(); lst.reverse()
sorted(lst, key=lambda x: -x); lst[1:3]; lst.index(2); lst.count(1)

d = {'a': 1, 'b': 2}
d['c'] = 3; d.get('x', 0); d.pop('a'); d.setdefault('k', []).append(1)
d.keys(); d.values(); d.items(); {**d, 'z': 0}; d | {'y': 1}       # слияние (3.9+)

s = {1, 2, 3}; s.add(4); s & {2, 3}; s | {9}; s - {1}; s ^ {2, 5}  # пересечение, объединение, разность
t = (1, 2); a, b = t; first, *rest = [1, 2, 3]                       # распаковка

Включения

[x * x for x in range(10) if x % 2 == 0]
{k: v for k, v in pairs}
{x % 3 for x in nums}
(x * 2 for x in nums)             # генераторное выражение (ленивое)

Условия и циклы

if x > 0: ...
elif x == 0: ...
else: ...
label = 'да' if ok else 'нет'
match command:                                  # Python 3.10+
    case 'start': ...
    case 'stop' | 'halt': ...
    case {'type': 'move', 'x': x}: ...
    case _: ...

for i in range(5): ...                          # range(start, stop, step)
for i, x in enumerate(items, start=1): ...
for a, b in zip(xs, ys): ...
for k, v in d.items(): ...
while cond: ...
else: ...                                       # блок else у цикла: выполняется без break
break; continue; pass

Функции

def add(a: int, b: int = 0, *args, key=None, **kwargs) -> int:
    """Краткое описание."""
    return a + b

add(1, b=2); add(*[1, 2]); add(**{'a': 1, 'b': 2})
square = lambda x: x * x
def f(a, /, b, *, c): ...           # a только позиционный, c только по имени

Не используйте изменяемый объект как значение по умолчанию (def f(x=[])): def f(x=None): x = x or [].

Декораторы и замыкания

import functools, time
def timed(fn):
    @functools.wraps(fn)
    def wrapper(*a, **k):
        t = time.perf_counter(); r = fn(*a, **k)
        print(f'{fn.__name__}: {time.perf_counter() - t:.3f}s'); return r
    return wrapper

@timed
def work(): ...
@functools.lru_cache(maxsize=None)
def fib(n): return n if n < 2 else fib(n - 1) + fib(n - 2)

Классы

from dataclasses import dataclass, field

class User:
    count = 0                                 # атрибут класса
    def __init__(self, name):
        self.name = name                      # атрибут экземпляра
    def __repr__(self): return f'User({self.name!r})'
    @property
    def label(self): return f'@{self.name}'
    @classmethod
    def create(cls, name): return cls(name)
    @staticmethod
    def valid(name): return bool(name)

class Admin(User):
    def __init__(self, name):
        super().__init__(name)

@dataclass(frozen=True, order=True)
class Point:
    x: float
    y: float = 0.0
    tags: list[str] = field(default_factory=list)

Магические методы: __str__, __len__, __eq__, __lt__, __iter__, __getitem__, __enter__/__exit__, __call__. Альтернативы: NamedTuple, TypedDict, Enum, Pydantic.

Исключения и контекстные менеджеры

try:
    value = int(text)
except ValueError as e:
    print('нечисло', e)
except (KeyError, IndexError):
    ...
else: ...                # без ошибок
finally: ...             # всегда
raise ValueError('сообщение') from original

with open('data.txt', encoding='utf-8') as f:     # закроется автоматически
    text = f.read()

class MyError(Exception): ...

Иерархия: Exception → ValueError, TypeError, KeyError, OSError, ZeroDivisionError. Не ловите «голый» except:.

Файлы и пути

from pathlib import Path
p = Path('data') / 'file.txt'
p.exists(); p.is_file(); p.read_text(encoding='utf-8'); p.write_text('x'); p.parent.mkdir(parents=True, exist_ok=True)
list(Path('.').glob('**/*.py')); p.suffix; p.stem; p.name

import json, csv, os, shutil
json.loads(s); json.dumps(obj, ensure_ascii=False, indent=2)
with open('a.csv', newline='', encoding='utf-8') as f:
    for row in csv.DictReader(f): ...
os.environ.get('HOME'); shutil.copy('a', 'b'); shutil.rmtree('dir')

Итераторы и генераторы

def countdown(n):
    while n > 0:
        yield n
        n -= 1
list(countdown(3))                    # [3, 2, 1]
import itertools
itertools.chain(a, b); itertools.islice(it, 5); itertools.groupby(data, key); itertools.product(a, b); itertools.combinations(xs, 2)

Асинхронность и потоки

import asyncio, httpx

async def fetch(client, url):
    r = await client.get(url, timeout=10)
    r.raise_for_status()
    return r.json()

async def main():
    async with httpx.AsyncClient() as c:
        results = await asyncio.gather(*(fetch(c, u) for u in urls))
asyncio.run(main())

from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
with ThreadPoolExecutor(8) as pool: list(pool.map(download, urls))       # I/O
with ProcessPoolExecutor() as pool: list(pool.map(heavy, items))          # CPU

GIL: потоки не ускоряют вычисления на CPU, но подходят для ввода-вывода. Для CPU: процессы, NumPy, Cython. Новые сборки Python 3.13+ имеют экспериментальный режим без GIL.

Типизация

from typing import Optional, Union, Callable, TypedDict, Protocol, Literal, Any
def f(x: int | None, items: list[str], m: dict[str, int]) -> tuple[int, str]: ...
type Json = dict[str, 'Json'] | list['Json'] | str | int | None      # 3.12+

Проверка не выполняется на runtime: запускайте mypy или pyright.

collections и стандартная библиотека

Модуль Содержимое
collections Counter, defaultdict, deque, namedtuple, OrderedDict
datetime, zoneinfo даты, часовые пояса
re регулярные выражения
math, statistics, random, decimal, fractions числа
logging журналы
argparse аргументы командной строки
subprocess запуск команд
sqlite3 встроенная БД
enum, abc, contextlib, functools, operator инструменты
unittest, doctest тесты
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s %(message)s')
log = logging.getLogger(__name__); log.info('старт %s', name)
from collections import Counter; Counter('hello').most_common(2)

Тесты (pytest)

import pytest
def test_add(): assert add(1, 2) == 3

@pytest.mark.parametrize('a,b,exp', [(1, 2, 3), (0, 0, 0)])
def test_param(a, b, exp): assert add(a, b) == exp

@pytest.fixture
def user(): return User('anna')

def test_raises():
    with pytest.raises(ValueError): int('x')

Запуск: pytest -q, pytest -k name -x, покрытие pytest --cov.

Идиомы и подводные камни

  • is сравнивает идентичность (для None: x is None), == значения.
  • Копирование: list(a), a.copy() поверхностное, copy.deepcopy(a) глубокое.
  • Строки неизменяемы: сборка в цикле через ''.join(parts).
  • if __name__ == '__main__': для точки входа.
  • Изменяемый аргумент по умолчанию, поздняя привязка замыканий в цикле, модификация списка во время обхода.

Библиотеки по задачам

Задача Библиотека
Веб-фреймворки FastAPI, Django, Flask
HTTP-клиент requests, httpx, aiohttp
Данные pandas, polars, NumPy
ML scikit-learn, PyTorch, TensorFlow, XGBoost
Визуализация Matplotlib, Seaborn, Plotly
БД SQLAlchemy, psycopg, Django ORM
Валидация Pydantic
Парсинг BeautifulSoup, lxml, Scrapy, Playwright
Задачи и очереди Celery, RQ, APScheduler
CLI Typer, Click, argparse
Тесты pytest, hypothesis
Автоматизация paramiko, Fabric, Ansible