Python — язык программирования
Python — один из самых популярных языков программирования в мире. Он используется в веб-разработке, анализе данных, искусственном интеллекте и автоматизации.
1. Что такое Python и зачем он нужен
Python создан Гвидо ван Россумом в 1991 году. Главные особенности языка:
- Простой синтаксис — код читается как почти обычный английский текст.
- Интерпретируемость — программа выполняется без предварительной компиляции.
- Динамическая типизация — тип переменной определяется автоматически.
- Огромная экосистема — десятки тысяч библиотек на все случаи жизни.
Области применения
| Область | Библиотеки и фреймворки |
|---|---|
| Веб-разработка | Django, Flask, FastAPI |
| Анализ данных | pandas, NumPy, matplotlib |
| Машинное обучение | scikit-learn, TensorFlow, PyTorch |
| Автоматизация | requests, Selenium, PyAutoGUI |
| DevOps скрипты | os, subprocess, paramiko |
2. Установка Python
Скачай установщик с официального сайта python.org.
Проверь установку в терминале:
python --version
# Python 3.12.0
pip --version
# pip 23.2.1 from ...3. Первая программа
Создай файл hello.py и напиши:
print("Привет, мир!")
print(2 + 2) # 4
print("a" * 5) # aaaaaЗапуск программы:
python hello.pyИнтерактивный режим
Введи python в терминале и получишь REPL — цикл «чтение-выполнение». Он удобен для экспериментов:
>>> 6 * 7
42
>>> len("python")
64. Переменные и типы данных
Переменная — это имя, ссылающееся на значение в памяти. Имя должно начинаться с буквы или подчёркивания.
name = "Анна" # str — строка
age = 25 # int — целое число
height = 1.68 # float — дробное число
is_student = True # bool — логический тип
print(type(age)) # <class 'int'>Основные типы данных
| Тип | Пример | Описание |
|---|---|---|
| int | 42 | целые числа |
| float | 3.14 | числа с плавающей точкой |
| str | "привет" | строка (текст) |
| bool | True / False | логические значения |
| list | [1, 2, 3] | упорядоченный изменяемый список |
| tuple | (1, 2) | неизменяемый кортеж |
| dict | {"a": 1} | словарь «ключ — значение» |
| set | {1, 2, 3} | множество уникальных значений |
Строки и их методы
s = " Python Уроки "
print(s.strip()) # убрать пробелы по краям
print(s.lower()) # нижний регистр
print(s.upper()) # верхний регистр
print(s.split()) # ['Python', 'Уроки']
print("|".join(["a", "b"])) # a|b
print(s.replace("Python", "Py")) # замена подстроки5. Ввод и вывод данных
name = input("Как тебя зовут? ")
print(f"Привет, {name}!")
age = int(input("Сколько тебе лет? "))
years = age + 5
print("Через 5 лет будет:", years)=: f"{age=}".6. Условные операторы
score = int(input("Твой результат: "))
if score >= 90:
print("Отлично!")
elif score >= 70:
print("Хорошо")
else:
print("Нужно подтянуться")Логические операторы: and, or, not. Сравнение: ==, !=, >, <, >=, <=.
7. Циклы
Цикл for
for i in range(1, 6): # 1,2,3,4,5
print(i)
for fruit in ["яблоко", "груша", "слива"]:
print(fruit)
for letter in "Python":
print(letter)Цикл while
count = 0
while count < 3:
print("итерация", count)
count += 1Управление циклом: break — прервать цикл, continue — перейти к следующей итерации.
8. Функции
def greet(name, greeting="Привет"):
return f"{greeting}, {name}!"
print(greet("Иван"))
print(greet("Аня", greeting="Здравствуй"))Особенности функций в Python:
- Аргументы по умолчанию задаются через
=. - Функция может возвращать несколько значений (кортеж).
- Функции — это объекты, их можно передавать в качестве аргументов.
Lambda-функции
square = lambda x: x ** 2
print(square(5)) # 25
nums = [1, 5, 3, 2]
print(sorted(nums, key=lambda n: -n)) # [5, 3, 2, 1]9. Структуры данных
Списки (list)
tasks = ["купить хлеб", "сделать уроки"]
tasks.append("позвонить бабушке") # добавить в конец
tasks.insert(0, "проснуться") # вставить на позицию
done = tasks.pop(1) # удалить и вернуть элемент
print(tasks[0:2]) # срез первых двух
primes = [n for n in range(2, 30) if all(n % d for d in range(2, n))]Словари (dict)
user = {
"name": "Мария",
"age": 30,
"skills": ["Python", "SQL", "Docker"],
}
user["email"] = "maria@example.com" # добавить ключ
print(user["name"])
print(user.get("phone", "нет телефона"))
for key, value in user.items():
print(key, "=", value)Множества (set)
a = {1, 2, 3, 3}
b = {3, 4, 5}
print(a | b) # объединение
print(a & b) # пересечение
print(a - b) # разность10. Работа с файлами
Используй менеджер контекста with — файл всегда будет корректно закрыт.
# запись
with open("notes.txt", "w", encoding="utf-8") as f:
f.write("Первая строка\n")
f.write("Вторая строка\n")
# чтение
with open("notes.txt", "r", encoding="utf-8") as f:
for line in f:
print(line.strip())| Режим | Действие |
|---|---|
| r | чтение (по умолчанию) |
| w | запись (перезаписывает файл) |
| a | дозапись в конец файла |
| x | создание нового файла, ошибка если существует |
Исключения
try:
with open("missing.txt", "r") as f:
print(f.read())
except FileNotFoundError:
print("Файл не найден!")
except Exception as e:
print("Ошибка:", e)11. Объектно-ориентированное программирование
class BankAccount:
def __init__(self, owner, balance=0):
self.owner = owner
self.balance = balance
def deposit(self, amount):
self.balance += amount
print(f"{self.owner}: +{amount}")
def withdraw(self, amount):
if amount > self.balance:
print("Недостаточно средств")
else:
self.balance -= amount
def __str__(self):
return f"{self.owner}: {self.balance} руб."
acc = BankAccount("Иван", 1000)
acc.deposit(500)
acc.withdraw(200)
print(acc) # Иван: 1300 руб.Три «кита» ООП: инкапсуляция (скрытие данных), наследование (классы на основе других) и полиморфизм (одинаковые интерфейсы у разных типов).
Наследование
class SavingsAccount(BankAccount):
def apply_interest(self, rate):
self.balance += self.balance * rate / 100
print("Начислены проценты")
sav = SavingsAccount("Аня", 1000)
sav.apply_interest(5)
print(sav)12. Модули и pip
Модуль — это файл с Python-кодом. Импортируются модули командой import.
import math
from datetime import datetime
import random as r
print(math.sqrt(16)) # 4.0
print(datetime.now().year) # текущий год
print(r.choice(["a", "b", "c"]))Установка сторонних библиотек
pip install requests
pip install numpy pandas matplotlib
pip list # список установленных пакетов
pip freeze > requirements.txt # сохранить зависимостиrequirements.txt. Другой разработчик установит их одной командой: pip install -r requirements.txt.Собственный модуль
# в файле utils.py
def add(a, b):
return a + b
# в main.py
from utils import add
print(add(2, 3))13. Даты и время: datetime
Работа с датами в Python — модуль datetime. Ключевые типы:
from datetime import datetime, date, time, timedelta
dt = datetime.now()
print(dt.strftime("%Y-%m-%d %H:%M"))
parsed = datetime.strptime("2026-09-19", "%Y-%m-%d")
tomorrow = date.today() + timedelta(days=1)Форматные коды — отдельный язык: %Y год, %m месяц, %d день, %H:%M время. Разницу между датами считает вычитание timedelta.
| Операция | Код |
|---|---|
| сегодня | date.today() |
| +N дней | date.today() + timedelta(days=N) |
| назад на месяц | relativedelta(months=-1) |
14. Генераторы и итераторы
Генератор отдаёт значение по одному, не держа все в памяти:
def fibonacci():
a, b = 0, 1
while a < 100:
yield a
a, b = b, a + b
for n in fibonacci():
print(n)Выражения-генераторы компактны:
total = sum(x * 2 for x in range(10))yield fromделегирует вложенный генератор;itertoolsхранит готовые конвейеры: chain, groupby, islice;- ленивые вычисления экономят память на больших файлах.
15. Регулярные выражения
Модуль re — для поиска и замены по шаблону:
import re
text = "Заказ 42: 3 шт. по 199.5 руб."
nums = re.findall(r"\d+", text) # ["42", "3", "199", "5"]
fixed = re.sub(r"шт\.", "единиц", text)
m = re.search(r"(\d+) шт", text)
if m:
qty = int(m.group(1)) # 3Осваивай: \d \w \s . + * ? и классы [0-9], флаг re.IGNORECASE. Группы в скобках захватывают части шаблона.
16. Виртуальные окружения и стиль
Окружение изолирует зависимости проекта. От серверного кода отделяй глобальный Python:
python -m venv .venv
# Windows (cmd)
.venv\Scripts\activate
# фиксация зависимостей
pip freeze > requirements.txt
# установка на другой машине
pip install -r requirements.txtСтиль держи PEP 8: 4 пробела, имена функций и переменных в snake_case, строки до 79 символов. Проверяй линтерами ruff и black.
.venv/ в .gitignore и не храни окружения в репозитории — это артефакт машины.17. Декораторы и замыкания
Функции в Python — объекты первого класса: их можно передавать, возвращать и «оборачивать». Декоратор — функция, которая принимает функцию и возвращает новую:
import time, functools
def timed(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start = time.perf_counter()
result = func(*args, **kwargs)
print(f"{func.__name__}: {time.perf_counter()-start:.3f}s")
return result
return wrapper
@timed
def slow(n): return sum(range(n))- замыкание «запоминает» переменные внешней функции даже после её выхода;
functools.wrapsсохраняет имя и docstring оригинальной функции;- декораторы с параметрами = декоратор в декораторе:
@retry(3); - стек декораторов читается снизу вверх.
18. Контекстные менеджеры
Ключевое слово with гарантирует освобождение ресурсов даже при ошибке:
with open("data.txt", "r", encoding="utf-8") as f:
text = f.read() # файл закроется сам
# свой менеджер: класс с __enter__/__exit__
class Timer:
def __enter__(self):
self.start = time.perf_counter(); return self
def __exit__(self, *exc):
print("elapsed:", time.perf_counter() - self.start)
return False # не глотать исключение- для транзакций, соединений и блокировок менеджеры обязательны;
contextlib.contextmanager— менеджер одной строкой на генераторе;- возврат
Trueиз__exit__подавляет исключение — делай только осознанно.
with: утёкший файл или соединение молча съедает память и вводит в заблуждение при дебаге.19. Параллелизм: потоки, asyncio, процессы
Выбор модели параллелизма зависит от задачи:
| Инструмент | Для чего | Ограничения |
|---|---|---|
| threading | IO-операции: сеть, файлы | GIL — CPU-код толком не параллелится |
| asyncio | много легковесных IO-задач | однопоточный event loop |
| multiprocessing | CPU-интенсивные задачи | память на каждый процесс |
| concurrent.futures | универсальный пул задач | по умолчанию потоки |
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=8) as pool:
results = list(pool.map(download, urls))20. Типизация и чек-лист продакшена
Аннотации типов + mypy ловят целые классы багов до запуска:
def calc_discount(price: float, rate: float = 0.1) -> float:
return price * (1 - rate)- начни с новых файлов:
pyproject.toml(strict) и постепенный включённый репозиторий; - mypy в CI,
ruff/black— до commit; - логирование вместо print: глобальный уровень, а не хардкод;
if __name__ == "__main__"— пакет не выполняется при импорте;- структура: src/ layout + осмысленные имена модулей.
21. Работа с данными: JSON, CSV, Excel
Скрипты редко живут в вакууме: почти всегда в них входят данные — из файлов, API или таблиц.
import json, csv
with open("data.json", encoding="utf-8") as f:
data = json.load(f)
with open("data.csv", newline="", encoding="utf-8") as f:
rows = list(csv.reader(f))- JSON: json.load для чтения, json.dump(..., ensure_ascii=False) для кириллицы;
- CSV: указывай encoding="utf-8" и newline="" — иначе лишние пустые строки;
- Excel: библиотека openpyxl читает/пишет .xlsx без Excel на машине;
- для больших данных пакуй в numpy/pandas — читай дальше про Pandas.
22. Логирование вместо print
print подходит для отладки, но в приложении его вытесняет `logging`: уровни, файлы, ротация:
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
logger.info("user %s logged in", user.id)
logger.error("failed: %s", exc)- уровни DEBUG < INFO < WARNING < ERROR — фильтруй шум;
- не передавай конкатенацию f-строк: используй аргументы %s — лениво и чисто;
- в файл: logging.FileHandler + RotatingFileHandler для ротации;
- pid и thread id добавляются автоматически в формат.
23. Автоматизация файловой системы
Скрипты переименовывают, сортируют и архивируют файлы. pathlib — современный стандарт работы с путями:
from pathlib import Path
base = Path("downloads")
for pdf in base.glob("*.pdf"):
target = base / "docs" / pdf.name
pdf.rename(target)- Path('/') / 'dir' соберёт путь — работает на Windows и Linux одинаково;
- glob / rglob — поиск файлов по маске, включая вложенные;
- shutil.copy / shutil.rmtree — копирование и удаление «с деревом»;
- чтение файла: path.read_text(encoding="utf-8") — одна строка вместо open/close.
24. dataclasses, enum и collections
Стандартная библиотека умеет больше, чем кажется. Три «вкусняшки» из типичных задач:
from dataclasses import dataclass
@dataclass
class Point:
x: int
y: int
p = Point(1, 2) # repr, == и сравнения — из коробки- dataclasses: класс «просто хранилище» без boilerplate __init__;
- enum: статусы (NEW, PAID, CANCELLED) вместо «магических строк»;
- collections.Counter: подсчёт частот (слов, тегов) в одну строку;
- collections.defaultdict: словарь, который сам инициализирует значения.
Что дальше
Теперь ты знаешь основы Python. Рекомендуемый следующий шаг — изучение pytest для тестирования, затем Flask или FastAPI для веб-разработки.