Python для начинающих: первые шаги в программировании

Python для начинающих: быстрый старт в программировании

Введение

Этот материал — практичный старт по Python: что это за язык, зачем он нужен новичку и инженеру, как установить интерпретатор, где запускать команды и как читать ошибки без паники. После введения вы пройдёте установку, напишете первый скрипт и поймёте, куда двигаться дальше 🚀

Кому подойдёт

Новичкам без опыта; студентам и аналитикам; тестировщикам, администраторам и DevOps; разработчикам с другим стеком для скриптов, интеграций и прототипов.

Что такое Python

Высокоуровневый интерпретируемый язык с динамической типизацией и богатой стандартной библиотекой. Де-факто стандарт — реализация CPython. Есть альтернативы: PyPy с JIT, MicroPython, Jython/IronPython для JVM/.NET. В курсе фокус на CPython.

Почему Python

  • Низкий порог входа. Читаемый синтаксис, минимум шаблонов.
  • Широкая экосистема. Веб, данные, ML/AI, автоматизация.
  • Кроссплатформенность. Windows, macOS, Linux, контейнеры.
  • Сообщество. Много примеров и библиотек на PyPI.

Что вы получите

  • Проверенную установку и рабочее окружение.
  • Первые команды в REPL и запуск скриптов.
  • Алгоритм чтения ошибок и короткий цикл отладки.
  • Маршрут следующего шага без лишней теории.

Как работать с материалом

Двигайтесь по цепочке: установка → REPL → первый скрипт → основы синтаксиса → практика. Команды выполняйте сразу после чтения раздела, результат проверяйте тут же. Если появилась ошибка — смотрите последнюю строку и действуйте по подсказке.

Минимальные требования

  • ПК с правами установки ПО и интернетом.
  • Базовые навыки терминала: открыть консоль, перейти в папку, запустить команду.

Быстрая проверка окружения

# показать версию интерпретатора
python --version

# если команда не найдена
python3 --version

Ответ вида «Python 3.x.y» означает, что интерпретатор установлен и PATH настроен 🙂

Первый контакт: REPL

# запуск интерактивной оболочки
python

# попробуйте выражения
2 + 2
"Hello, " + "world!"
len([1, 2, 3])

# выход из REPL
exit()

Первый скрипт и запуск

# файл hello_world.py
print("Привет, мир!")

# запуск из папки проекта
python hello_world.py

Версии и изоляция

Рекомендуется актуальная ветка 3.x. Для разных проектов используйте отдельные виртуальные окружения venv.

# создать окружение
python -m venv .venv

# активировать
source .venv/bin/activate # macOS/Linux
.venv\Scripts\activate # Windows

# проверить активную версию
python -c "import sys; print(sys.version)"

Экосистема: 3 элемента

  • Интерпретатор. Выполняет ваш код.
  • pip. Устанавливает сторонние библиотеки.
  • venv. Изолирует зависимости по проектам.
# базовый цикл с пакетами
pip install requests
pip list
pip freeze > requirements.txt

Как читать ошибки

# типовой случай
NameError: name 'messege' is not defined

Смотрите на тип исключения и строку, где оно возникло. Здесь опечатка в имени переменной. Исправьте и перезапустите ⚙️

Практики с первого дня

  • Говорящие имена и форматирование по PEP 8.
  • Отдельная папка на проект, зависимости в requirements.txt.
  • Частые короткие запуски и малые итерации правок.

Что дальше

Далее — установка и настройка, основы синтаксиса, управление потоком, работа с файлами и мини-проект для закрепления. После него проще перейти к вебу, данным или автоматизации 💡

Установка и подготовка окружения

Скачивание дистрибутива

Перейдите на официальный сайт Python и скачайте актуальную версию 3.x для своей ОС: Windows, macOS или Linux. Для стабильности берите рекомендованный релиз и архитектуру системы (x64).

Установка и PATH

  • Windows. Запустите установщик, отметьте пункт Add Python to PATH, выберите Install Now.
  • macOS. Установите .pkg, при необходимости поставьте инструменты разработчика Xcode Command Line Tools; альтернативно используйте Homebrew.
  • Linux. Используйте менеджер пакетов дистрибутива или официальный tar/ppa; часто Python 3 уже предустановлен.

Проверка установки

# версия интерпретатора
python --version
python3 --version # если первая команда не сработала
py -V # Windows-лаунчер, если доступен

# расположение исполняемого файла
which python # macOS/Linux
where python # Windows

Ожидаете строку вида «Python 3.x.y». Если интерпретатор не найден, переустановите с корректным PATH или используйте полное имя python3.

pip и обновление

# версия pip
pip --version
python -m pip --version

# обновление pip
python -m pip install --upgrade pip

Если команда pip не найдена, используйте форму python -m pip.

Быстрый тест REPL

# запуск интерактивной оболочки
python

# проверка базовых выражений
2 + 2
print("Привет, Python!")
exit()

Минимальный venv для изоляции

# создание окружения в папке проекта
python -m venv .venv

# активация
source .venv/bin/activate # macOS/Linux
.venv\Scripts\activate # Windows

# проверка, что используете venv
python -c "import sys; print(sys.prefix)"

После активации команды python и pip работают внутри проекта и не конфликтуют с глобальными пакетами.

Выбор IDE

  • VS Code. Лёгкий редактор с расширением Python, встроенный терминал и дебаг.
  • PyCharm. Полноценная IDE с умной навигацией и инструментами тестирования.
  • Jupyter. Ячейки для экспериментов с данными и визуализацией.

На старте хватит VS Code или PyCharm Community. Проверьте запуск скриптов и интеграцию с venv ✅

Типичные сбои и быстрые решения

  • Команда «python» не найдена. Используйте python3 или переустановите с опцией PATH; на Windows проверьте «App Execution Aliases» и отключите дубликаты.
  • pip ставит пакеты «не туда». Активируйте venv и используйте python -m pip.
  • Путаница версий 3.10/3.11/3.12. Создайте отдельные venv под каждый проект и фиксируйте зависимости в requirements.txt.

Основы синтаксиса

Ключевые правила: отступы четырьмя пробелами формируют блоки; регистр важен; строки берутся в одинарные или двойные кавычки; комментарии начинаются с #; инструкция завершается переводом строки, но логическую строку можно переносить в скобках. Код ниже оформлен в блоках для наглядности ✍️

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

Имена в snake_case. Тип объявлять не нужно — он определяется при присваивании. Базовые типы: int, float, bool, str, list, tuple, dict, set, NoneType. Проверка: type() и isinstance(). Преобразования: int(), float(), str(), bool(). Изменяемость: list/dict/set — изменяемые; str/tuple/int/float/bool — неизменяемые.

# примеры значений
x = 10
pi = 3.14
is_ok = True
name = "Алиса"
items = [1, 2, 3]
point = (10, 20)
user = {"id": 1, "name": "Bob"}
tags = {"py", "ml"}
nothing = None

# динамическая типизация
x = 10
x = "десять" # теперь str

# копирование списка (поверхностное)
a = [1, 2]
b = a[:] # новый объект

Операторы и выражения

Арифметика: + − * / // % **. Сравнение: == != < <= > >=. Логика: and, or, not. Принадлежность: in, not in. Идентичность: is, is not. Сокращённые присваивания: +=, -=, *= и т.д. Строки форматируются через f-строки, format() или конкатенацию.

a = 7; b = 3
s = a + b # 10
d = a - b # 4
m = a * b # 21
q = a / b # 2.333... (float)
f = a // b # 2 (целая часть)
r = a % b # 1
p = a ** b # 343

# цепочка сравнений
0 <= a < 10

# короткое замыкание логики
name = input() or "Гость"

# форматирование строк
user = "Ada"
msg1 = "Hi, " + user
msg2 = f"Hi, {user}"
msg3 = "{}: {}".format("score", 10)

Условные операторы

Блоки определяются отступами. Пустые строки/коллекции и 0 считаются ложью. Для кратких присваиваний используйте тернарный оператор. В Python 3.10+ есть match/case.

age = 18
if age >= 18:
  status = "взрослый"
elif age >= 14:
  status = "подросток"
else:
  status = "ребёнок"

# тернарная форма
msg = "OK" if age >= 18 else "FAIL"

# сопоставление с образцом
code = 404
match code:
  case 200: text = "OK"
  case 404: text = "Not Found"
  case _: text = "Other"

Циклы for и while

for итерирует по коллекциям; while повторяет, пока условие истинно. break прерывает цикл, continue пропускает итерацию. Блок else у циклов выполняется, если цикл завершился без break.

# for по строке и диапазону
for ch in "abc":
  print(ch)
for i in range(3):
  print(i) # 0, 1, 2

# enumerate и обход словаря
for i, v in enumerate(["a", "b", "c"], start=1):
  print(i, v)
for k, v in {"a": 1, "b": 2}.items():
  print(k, v)

# while с else
n = 3
while n > 0:
  print(n)
  n -= 1
else:
  print("старт")

Генераторы-«comprehensions» дают компактные записи.

squares = [x * x for x in range(5)]
evens = {x for x in range(10) if x % 2 == 0}
index = {c: i for i, c in enumerate("abc")}

Ловушки: смешивание табов и пробелов, лишние отступы вне блока, изменение списка во время итерации, забытое двоеточие после if/for/while. Держите автоформатирование включённым и тестируйте маленькими шагами ✅

Первая программа

Hello, world

Создайте файл hello_world.py в рабочей папке и добавьте одну строку кода. Это проверит, что интерпретатор и вывод работают корректно 🙂

# файл hello_world.py
print("Привет, мир!")

Запуск из терминала

# перейдите в папку с файлом
python hello_world.py

# альтернативы, если команда не срабатывает
python3 hello_world.py
py hello_world.py # Windows-лаунчер

В консоли должна появиться строка «Привет, мир!». Если видите сообщение об ошибке — внимательно прочитайте последнюю строку traceback и действуйте по подсказке.

Запуск из IDE

  • VS Code. Откройте папку проекта, создайте файл, установите расширение Python, нажмите ▶ в правом верхнем углу или выполните команду Run Python File.
  • PyCharm. Создайте проект, файл hello_world.py, щёлкните правой кнопкой и выберите Run.
  • Jupyter. Создайте ноутбук, добавьте ячейку с print("Привет, мир!") и выполните её.

Мини-экскурсия по вводу/выводу

# чтение строки из ввода
name = input("Введите имя: ")
print("Привет,", name)

Функция input() всегда возвращает строку; при необходимости приводите типы вручную: int(input()), float(input()).

Структура мини-проекта

project/
  hello_world.py
  README.md # краткое описание
  .venv/ # виртуальное окружение (необязательно, но рекомендуется)

Храните один проект в одной папке, не смешивайте учебные файлы с системными. Если используете venv, активируйте его перед запуском скриптов.

Типичные ошибки и быстрые решения

  • Indentationerror. Используйте 4 пробела на уровень, не смешивайте табы и пробелы.
  • NameError. Проверьте имена переменных и регистр букв.
  • UnicodeEncodeError. Сохраните файл в UTF-8; в терминале используйте шрифт с поддержкой кириллицы.

Пакеты и виртуальные окружения

Зачем это нужно

Виртуальное окружение изолирует зависимости каждого проекта, а менеджер пакетов pip ставит и обновляет библиотеки. Так вы избегаете конфликтов версий и делитесь воспроизводимыми настройками ✅

Создание и активация venv

# создать окружение в папке проекта
python -m venv .venv

# активировать окружение
source .venv/bin/activate # macOS/Linux
.venv\Scripts\activate # Windows

# деактивировать
deactivate

После активации приглашение терминала обычно показывает имя окружения, а команды python и pip работают внутри него.

Базовые команды pip

# установить пакет
pip install requests

# установить конкретную версию
pip install "pandas==2.2.2"

# обновить пакет
pip install --upgrade numpy

# удалить пакет
pip uninstall requests

# список установленных
pip list

Если pip не находится или ставит «мимо» окружения, используйте форму python -m pip внутри активированного venv.

Фиксация зависимостей

# зафиксировать версии в файл
pip freeze > requirements.txt

# установка из файла
pip install -r requirements.txt

Файл requirements.txt храните в корне проекта и обновляйте при изменениях зависимостей.

Работа с несколькими версиями Python

# создать venv конкретной версии (если установлена)
python3.11 -m venv .venv311
python3.12 -m venv .venv312

Держите отдельное окружение под каждый проект или под разные мажорные версии интерпретатора.

Проверки и диагностика

# где лежит активный интерпретатор
which python # macOS/Linux
where python # Windows

# путь окружения
python -c "import sys; print(sys.prefix)"
  • Пакет не устанавливается. Проверьте интернет/прокси и версию Python, некоторые колёса недоступны для старых версий.
  • Команда «pip» не найдена. Выполните python -m ensurepip --upgrade или переустановите Python с включённым pip.
  • Конфликт версий. Удалите проблемный пакет (pip uninstall) и поставьте совместимые версии, ориентируясь на документацию библиотек.

Рекомендуемая структура проекта

project/
  src/ or package_name/
  tests/
  requirements.txt
  README.md
  .venv/ # не коммитить

Добавьте .venv и кэш-папки в .gitignore. Для воспроизводимости фиксируйте версии и используйте одно окружение на один проект 🔒

Работа с файлами и путями

Чтение/запись делайте в кодировке UTF-8, пути формируйте через pathlib, ошибки оборачивайте в try/except. Это надёжнее, кроссплатформенно и читаемо ✅

Быстрое чтение и запись текста

# запись
with open("notes.txt", "w", encoding="utf-8") as f:
  f.write("Привет, файл!")

# добавление в конец
with open("notes.txt", "a", encoding="utf-8") as f:
  f.write("\nЕщё одна строка")

# чтение всего файла
with open("notes.txt", "r", encoding="utf-8") as f:
  text = f.read()
  print(text)

# построчно, без лишней памяти
with open("notes.txt", "r", encoding="utf-8") as f:
  for line in f:
    print(line.strip())

pathlib: удобные и безопасные пути

pathlib.Path упрощает склейку путей, проверку существования и создание директорий на Windows, macOS и Linux.

from pathlib import Path
base = Path.cwd() # текущая папка проекта
data = base / "data" / "raw" # безопасная склейка
data.mkdir(parents=True, exist_ok=True)
file = data / "input.txt"
file.write_text("пример", encoding="utf-8")
print(file.read_text(encoding="utf-8"))
print(file.exists(), file.is_file(), file.parent.is_dir())

Чтение CSV без pandas

import csv, pathlib
path = pathlib.Path("scores.csv")
with path.open("r", encoding="utf-8", newline="") as f:
  reader = csv.DictReader(f)
  for row in reader:
    print(row["name"], int(row["score"]))

Безопасная работа и обработка ошибок

from pathlib import Path
p = Path("maybe_missing.txt")
try:
  text = p.read_text(encoding="utf-8")
except FileNotFoundError:
  print("Файл не найден")
except UnicodeDecodeError:
  print("Неверная кодировка, попробуйте encoding='utf-8'")
else:
  print(text)

Бинарные файлы и буферы

# копирование бинарника по блокам
from pathlib import Path
src = Path("logo.png"); dst = Path("backup/logo.png")
dst.parent.mkdir(parents=True, exist_ok=True)
with src.open("rb") as r, dst.open("wb") as w:
  while chunk := r.read(1024 * 64):
    w.write(chunk)

Частые кейсы

  • Гарантировать, что папка есть. Path(...).mkdir(parents=True, exist_ok=True)
  • Получить список файлов по маске. for p in Path("images").glob("*.png"):
  • Нормализовать относительный путь. (Path.cwd() / "data/../data/file.txt").resolve()

Типичные ошибки и решения

  • UnicodeDecodeError. Укажите encoding="utf-8" при чтении и записи.
  • Permissionerror. Закройте файл в другой программе, проверьте права, используйте with для автозакрытия.
  • Неверные разделители путей. Никогда не склеивайте строками, используйте pathlib (base / "sub" / "file.txt").

Отладка и ошибки

Цель раздела — быстро распознавать типы ошибок, читать traceback, использовать простые приёмы отладки и оформлять обработку исключений так, чтобы программа вела себя предсказуемо ⚙️

Как читать traceback

Traceback показывает стек вызовов снизу вверх. Последняя строка содержит тип и текст исключения — начните с неё, затем посмотрите на строку файла, где произошёл сбой.

Traceback (most recent call last):
  File "app.py", line 8, in <module>
    greet(user)
  File "app.py", line 3, in greet
    print("Привет, " + name.upper())
TypeError: can only concatenate str (not "NoneType") to str

Здесь name оказался None. Исправление — проверить входные данные и добавить защиту.

Быстрая диагностика: print, logging, assert

# минимальный вывод состояния
print("DEBUG:", user, type(user))

# логирование вместо print (лучше в проектах)
import logging
logging.basicConfig(level=logging.INFO)
logging.info("Загружено %s записей", len(rows))

# утверждения для инвариантов
assert isinstance(user, str), "user должен быть строкой"

print() удобен на старте, но заменяйте его на logging для уровней, форматов и маршрутизации сообщений.

Пошаговая отладка

  • Встроенный pdb. Точечно остановить выполнение и исследовать переменные.
  • IDE-дебаггер. Точки останова, шаги, watch-выражения и просмотр стека.
# точка останова (Python 3.7+)
breakpoint()

# эквивалентно
import pdb; pdb.set_trace()

В VS Code и PyCharm поставьте breakpoint на нужной строке и запустите в режиме Debug ▶

Обработка исключений правильно

Перехватывайте только ожидаемые типы. В блоке except добавляйте контекст и не скрывайте ошибки бесследно.

from pathlib import Path
def load_text(path: str) -> str:
  try:
    return Path(path).read_text(encoding="utf-8")
  except FileNotFoundError as e:
    raise FileNotFoundError(f"Нет файла: {path}") from e
  except UnicodeDecodeError as e:
    raise ValueError(f"Кодировка не UTF-8 у {path}") from e

Создание своих исключений

class ConfigError(Exception):
  pass

def read_port(cfg: dict) -> int:
  port = cfg.get("port")
  if not isinstance(port, int) or not (1 <= port <= 65535):
    raise ConfigError(f"Некорректный порт: {port}")
  return port

Типовые ошибки и быстрые фиксы

  • Indentationerror. Используйте 4 пробела. Включите автоформатирование.
  • NameError. Опечатка или неправильная область видимости. Проверьте написание и порядок объявлений.
  • TypeError/ValueError. Неверные типы или значения. Валидируйте входные данные и приводите типы явно.
  • AttributeError. Объект не имеет атрибута. Проверьте тип и возможное None.
  • KeyError/IndexError. Нет ключа или индекс вне диапазона. Используйте dict.get(), проверки границ и try/except там, где ожидаемо.

Малкий чек-лист перед баг-хантом

  • Воспроизведите ошибку стабильно и запишите входные данные.
  • Сократите кейс до минимального примера.
  • Посмотрите последнюю строку traceback и место в коде.
  • Выведите ключевые переменные или поставьте breakpoint.
  • Напишите авто-тест, чтобы ошибка не вернулась.

Пример комплексной диагностики

def div(a, b):
  # ожидания
  assert isinstance(a, (int, float)) and isinstance(b, (int, float))
  try:
    return a / b
  except ZeroDivisionerror as e:
    raise ValueError("b не должен быть 0") from e

Так вы получаете понятное сообщение для пользователя и сохранённый контекст для разработчика 🛠️

Мини-проект

Соберём небольшой консольный инструмент «Список дел» с сохранением в файл. Цель — пройти полный цикл: постановка задачи → структура проекта → реализация → запуск и простые тесты ✅

Постановка задачи

  • Хранить задачи в текстовом файле (CSV/JSON — на выбор), каждая задача имеет id, текст и статус done.
  • Команды CLI: add (добавить), list (показать), done (пометить выполненной), clear (очистить выполненные).
  • Никаких внешних зависимостей, только стандартная библиотека.

Структура проекта

todo/
  todo.py        # точка входа CLI
  storage.py    # работа с файлом
  models.py     # типы и валидация
  data.json      # база задач (создастся автоматически)
  README.md

Формат хранения (JSON)

[
  {"id": 1, "text": "Купить молоко", "done": false},
  {"id": 2, "text": "Позвонить Анне", "done": true}
]

Модель и простая валидация

# models.py
def make_task(idx: int, text: str) -> dict:
  text = text.strip()
  if not text:
    raise ValueError("Текст задачи пуст")
  return {"id": idx, "text": text, "done": False}

Хранилище

# storage.py
import json, pathlib
DB = pathlib.Path("data.json")

def load() -> list[dict]:
  if not DB.exists():
    DB.write_text("[]", encoding="utf-8")
  return json.loads(DB.read_text(encoding="utf-8"))

def save(items: list[dict]) -> None:
  DB.write_text(json.dumps(items, ensure_ascii=False, indent=2), encoding="utf-8")

CLI и команды

# todo.py
import sys
from models import make_task
from storage import load, save

def add(text: str):
  items = load()
  new_id = (max((t["id"] for t in items), default=0) + 1)
  items.append(make_task(new_id, text))
  save(items)
  print(f"Добавлено: #{new_id}")

def list_():
  items = load()
  for t in items:
    mark = "✅" if t["done"] else "⬜"
    print(f'{mark} #{t["id"]}: {t["text"]}')

def done(idx: int):
  items = load()
  for t in items:
    if t["id"] == idx:
      t["done"] = True
      save(items); print(f"Готово: #{idx}"); return
  print("Задача не найдена")

def clear():
  items = [t for t in load() if not t["done"]]
  save(items); print("Очищено выполненное")

def main():
  args = sys.argv[1:]
  if not args:
    print("Команды: add <текст> | list | done <id> | clear"); return
  cmd, *rest = args
  match cmd:
    case "add": add(" ".join(rest))
    case "list": list_()
    case "done": done(int(rest[0]))
    case "clear": clear()
    case _: print("Неизвестная команда")

if __name__ == "__main__":
  main()

Запуск и проверка

# добавить задачи
python todo.py add Купить молоко
python todo.py add Позвонить Анне

# показать список
python todo.py list

# отметить выполненной
python todo.py done 1

# очистить выполненные
python todo.py clear

Мини-тест ручной

# ожидаемый вывод list после двух add
⬜ #1: Купить молоко
⬜ #2: Позвонить Анне

# после done 1
✅ #1: Купить молоко
⬜ #2: Позвонить Анне

Расширения по желанию

  • Перейти на argparse для дружелюбной справки и валидации аргументов.
  • Сменить формат хранения на CSV или SQLite.
  • Добавить даты создания/выполнения и фильтры по статусу.

Итог: у вас есть рабочий CLI-инструмент, структура проекта и базовые практики сохранения данных и обработки ошибок 🎯

Полезные инструменты

Три модуля стандартной библиотеки, которые сразу повышают качество кода: logging для управляемых сообщений, argparse для CLI-интерфейсов и datetime для работы со временем. Все без внешних зависимостей ✅

logging: управляемые сообщения и уровни

Заменяет случайные print() структурированным логом с уровнями, временем и форматами. Можно писать в файл или консоль, разделять уровни INFO/DEBUG/ERROR и быстро искать проблемы.

# базовая настройка
import logging
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s")
logging.info("Старт приложения")
logging.debug("Отладочные данные: %s", {"x": 42})
logging.error("Ошибка загрузки файла: %s", "data.csv")

Советы: используйте плейсхолдеры %s вместо f-строк в логах, чтобы не вычислять строки зря; для модулей задавайте logger = logging.getLogger(__name__).

argparse: удобный CLI

Строит интерфейс командной строки с автогенерацией справки -h, валидацией типов и значений. Идеален для учебных и рабочих утилит ⚙️

import argparse
parser = argparse.ArgumentParser(prog="resize", description="Масштабирование изображений")
parser.add_argument("src", help="путь к папке с изображениями")
parser.add_argument("--width", type=int, required=True, help="новая ширина")
parser.add_argument("--height", type=int, help="новая высота (по умолчанию авто)")
parser.add_argument("-q", "--quality", type=int, default=85, choices=range(1,101), help="JPEG-качество 1..100")
args = parser.parse_args()
# использование
print(args.src, args.width, args.height, args.quality)

Паттерны: подкоманды через subparsers для «tool add / tool list», обязательные флаги required=True, списки через nargs="+".

datetime: дата и время без боли

Работайте с «наивными» и «осознанными» датами, форматируйте ISO 8601, считайте интервалы. Для часовых поясов используйте zoneinfo (Python 3.9+).

from datetime import datetime, timedelta
from zoneinfo import ZoneInfo
# текущее UTC и локальное время
now_utc = datetime.now(tz=ZoneInfo("UTC"))
now_riga = now_utc.astimezone(ZoneInfo("Europe/Riga"))
# формат ISO 8601
print(now_riga.isoformat())
# разница во времени
deadline = now_riga + timedelta(days=3, hours=4)
delta = deadline - now_riga
print(delta.total_seconds())

Форматы: dt.strftime("%Y-%m-%d %H:%M:%S"), обратное преобразование: datetime.strptime("2025-01-15 12:30", "%Y-%m-%d %H:%M").

Комбо-паттерн: лог + время + CLI

import logging, argparse
from datetime import datetime, timedelta
logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s")
p = argparse.ArgumentParser(description="Таймер напоминания")
p.add_argument("--in-min", type=int, required=True, help="через сколько минут напомнить")
args = p.parse_args()
when = datetime.now() + timedelta(minutes=args.in_min)
logging.info("Напомню в %s", when.strftime("%H:%M"))

Следующие шаги

Вы прошли базу. Теперь выберите направление, поставьте учебные цели на 2–4 недели и закрепляйте их мини-проектами. Ниже четыре проверенных трека с первыми шагами и микро-примером кода 🚀

Веб-разработка (Flask/Django)

  • Цель 1: поднять локальный сервер, отдать HTML-страницу, обработать форму.
  • Цель 2: подключить БД (SQLite/PostgreSQL), сделать CRUD.
  • Проект: «Заметки» или «Трекер расходов» с авторизацией.
# Flask «Hello, web»
pip install flask
from flask import Flask
app = Flask(__name__)
@app.get("/")
def index():
  return "Привет, веб!"
app.run(debug=True)

Данные и автоматизация (NumPy/pandas)

  • Цель 1: читать CSV/Excel, чистить данные, строить сводки.
  • Цель 2: сохранять отчёты в CSV/Excel/PNG и отправлять по расписанию.
  • Проект: отчёт по продажам или парсер цен с выгрузкой.
# pandas: быстрое агрегирование
pip install pandas
import pandas as pd
df = pd.read_csv("sales.csv")
rep = df.groupby("manager")["amount"].sum().sort_values(ascending=False)
print(rep.head())

Машинное обучение (scikit-learn/PyTorch)

  • Цель 1: классическая модель (логрег, деревья), метрики и валидация.
  • Цель 2: пайплайн предобработки + модель + сохранение артефактов.
  • Проект: предсказание оттока клиентов или цены квартиры.
# scikit-learn: базовая модель
pip install scikit-learn pandas
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
clf = LogisticRegression(max_iter=1000).fit(X_train, y_train)
print(accuracy_score(y_test, clf.predict(X_test)))

Скрипты и DevOps

  • Цель 1: писать CLI-утилиты на argparse, логировать и упаковывать в пакет.
  • Цель 2: запускать по расписанию (cron/Task Scheduler), работать с API.
  • Проект: «Резервное копирование», «Синхронизация отчётов», «Нотификатор статусов».
# cron (Linux/macOS): раз в час
# открыть редактор: crontab -e
# пример строки
0 * * * * /usr/bin/python /home/user/jobs/report.py > /tmp/report.log 2>&1

Как организовать обучение

  • Фокус-спринты. 30–60 минут в день: 20 мин теория → 40 мин практика.
  • Проекты вместо конспектов. Каждая тема = мини-репозиторий с README.
  • Контроль качества. Линтер/форматер, авто-тест хотя бы на ключевую функцию.
  • Трекер прогресса. Список задач и «демо-результат» к каждому этапу.

Куда смотреть дальше

  • Документация. tutorial + стандартная библиотека (collections, itertools, pathlib).
  • Практика. katas/задачники, участие в пет-проектах с друзьями.
  • Инфраструктура. виртуальные окружения, packaging, базовый Docker.

Итог: выберите один трек, запланируйте две недели задач, закрепите мини-проектом и переходите к следующему направлению. Малые шаги и частые релизы 🧭

FAQ

Ответы на частые вопросы. В кодовых примерах используем блоки цитирования, а для компактности вопросы свёрнуты под спойлеры 🙂

Полезные ссылки и материалы

Подборка ресурсов, с которых стоит начать и к которым удобно возвращаться по мере роста навыков 📚

  • Официальный сайт Python — python.org: релизы, скачивания, новости.
  • Документация — docs.python.org: учебник, стандартная библиотека, примеры.
  • PEP 8 — стиль кода: правила форматирования и именования.
  • PyPI — pypi.org: поиск и установка сторонних библиотек.
  • Real Python — разборы практических тем и гайдов.
  • Learn X in Y minutes: Python — концентрат синтаксиса на одной странице.
  • TutorialsPoint / W3Schools — справочные статьи и быстрые примеры.
  • Stack Overflow — ответы на точечные вопросы по ошибкам и API.
  • LeetCode / HackerRank / Codewars — тренировка задач и алгоритмов.
  • Книги — «Изучаем Python» (Марк Лутц), «Автоматизация рутинных задач с Python» (Ал Свейгарт), «Fluent Python» (Лусиано Рамальо) для продвинутого уровня.

Совет по использованию: фиксируйте полезные ссылки в README проекта и складывайте рабочие сниппеты в личный «кукбук» — так база знаний растёт вместе с практикой 🧠