Python — язык программирования

Python — один из самых популярных языков программирования в мире. Он используется в веб-разработке, анализе данных, искусственном интеллекте и автоматизации.

Уровень: начальный 20 разделов ⏱ 3–4 часа

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.

При установке на Windows обязательно поставь галочку Add Python to PATH.

Проверь установку в терминале:

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")
6

4. Переменные и типы данных

Переменная — это имя, ссылающееся на значение в памяти. Имя должно начинаться с буквы или подчёркивания.

name = "Анна"        # str — строка
age = 25             # int — целое число
height = 1.68        # float — дробное число
is_student = True    # bool — логический тип

print(type(age))     # <class 'int'>

Основные типы данных

ТипПримерОписание
int42целые числа
float3.14числа с плавающей точкой
str"привет"строка (текст)
boolTrue / 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-строки (f"...") позволяют подставлять значения прямо в строку. В Python 3.8+ работают и f-строки с =: 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)
Для месяцев и лет пользуйся dateutil.relativedelta: timedelta не умеет «−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))
Если список нужен целиком для индексации — оставь list; для перебора одного прохода — генератор.

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. Группы в скобках захватывают части шаблона.

Не пиши парсер по-настоящему вложенной разметки на регэкспах — для JSON/HTML есть свои модули (json, html.parser).

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))
Декораторы — тулинг для логирования, кэша, ретраев и проверки прав. Не вводи логику бизнеса внутрь хрупких обёрток.

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          # не глотать исключение
Не обнаруживай ресурсы без with: утёкший файл или соединение молча съедает память и вводит в заблуждение при дебаге.

19. Параллелизм: потоки, asyncio, процессы

Выбор модели параллелизма зависит от задачи:

ИнструментДля чегоОграничения
threadingIO-операции: сеть, файлыGIL — CPU-код толком не параллелится
asyncioмного легковесных IO-задачоднопоточный event loop
multiprocessingCPU-интенсивные задачипамять на каждый процесс
concurrent.futuresуниверсальный пул задачпо умолчанию потоки
from concurrent.futures import ThreadPoolExecutor

with ThreadPoolExecutor(max_workers=8) as pool:
    results = list(pool.map(download, urls))
GIL снимается на IO-ожидании, поэтому threading отлично подходит для сети. Для расчётов бери процессы или NumPy-подобные библиотеки.

20. Типизация и чек-лист продакшена

Аннотации типов + mypy ловят целые классы багов до запуска:

def calc_discount(price: float, rate: float = 0.1) -> float:
    return price * (1 - rate)
Чек-лист перед commit: тесты зелёные, типы проходят, линтеры чисты, нет отладочных print, секретов в коде нет. Это 10 минут, которые экономят час.

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))
Всегда думай в кодировках: Windows и UTF-8 по-разному хранят кириллицу — зафиксируй encoding в коде.
Кодировка — главный источник таинственных ошибок при работе с данными на русском языке.

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)
Никогда не логируй пароли, токены и тела запросов целиком — это утечка секретов в логи.
В CI поднимай уровень до ERROR, а DEBUG включай локально при отладке — гибкость без правки кода.

23. Автоматизация файловой системы

Скрипты переименовывают, сортируют и архивируют файлы. pathlib — современный стандарт работы с путями:

from pathlib import Path

base = Path("downloads")
for pdf in base.glob("*.pdf"):
    target = base / "docs" / pdf.name
    pdf.rename(target)
Перед массовым rename/rm создай резервную копию — восстановление файлов из-под скрипта муторнее, чем предусмотрительность.

24. dataclasses, enum и collections

Стандартная библиотека умеет больше, чем кажется. Три «вкусняшки» из типичных задач:

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

p = Point(1, 2)   # repr, == и сравнения — из коробки
Если класс — это только поля, датакласс вернее: меньше кода, меньше ошибок, лучше читается.
Сравни с dict: dataclass даёт валидацию и автодополнение в IDE, что важно в командной работе.

Что дальше

Теперь ты знаешь основы Python. Рекомендуемый следующий шаг — изучение pytest для тестирования, затем Flask или FastAPI для веб-разработки.

← Вернуться к курсам