🐍 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 |