Что такое стандартная библиотека Python?

Стандартная библиотека Python - это набор модулей и пакетов, которые поставляются вместе с интерпретатором Python. Она предоставляет широкий спектр функциональности "из коробки", включая работу с файлами, сетью, датами, регулярными выражениями, математическими операциями и многое другое. Стандартная библиотека часто называется "батарейками в комплекте", что отражает философию Python о предоставлении обширной функциональности без необходимости устанавливать дополнительные пакеты.

Преимущества стандартной библиотеки

Работа с файловой системой

Модули для работы с файловой системой позволяют выполнять операции с файлами и каталогами:

pathlib и os.path
from pathlib import Path
import os

# Работа с путями с помощью pathlib (современный подход)
путь = Path("пример_каталога") / "подкаталог" / "файл.txt"
print(f"Путь: {путь}")
print(f"Родительский каталог: {путь.parent}")
print(f"Имя файла: {путь.name}")
print(f"Расширение: {путь.suffix}")

# Создание каталогов
if not путь.parent.exists():
    путь.parent.mkdir(parents=True, exist_ok=True)
    print(f"Каталог {путь.parent} создан")

# Работа с os.path (классический подход)
классический_путь = os.path.join("пример_каталога", "подкаталог", "файл.txt")
print(f"Классический путь: {классический_путь}")
print(f"Абсолютный путь: {os.path.abspath(классический_путь)}")
print(f"Существует ли файл: {os.path.exists(классический_путь)}")

# Получение информации о файле
if os.path.exists(__file__):  # __file__ - путь к текущему файлу
    статистика = os.stat(__file__)
    print(f"Размер файла: {статистика.st_size} байт")
    print(f"Время последнего изменения: {статистика.st_mtime}")

# Работа с текущим рабочим каталогом
print(f"Текущий каталог: {os.getcwd()}")
print(f"Список файлов в текущем каталоге: {os.listdir('.')}")

Работа с датами и временем

Модули datetime и time предоставляют инструменты для работы с датами и временем:

datetime и time
from datetime import datetime, date, time, timedelta
import time as time_module  # Переименовываем для избежания конфликта имен

# Работа с текущей датой и временем
сейчас = datetime.now()
print(f"Текущая дата и время: {сейчас}")
print(f"Текущая дата: {сейчас.date()}")
print(f"Текущее время: {сейчас.time()}")

# Создание конкретных дат и времени
день_рождения = datetime(1990, 5, 15, 14, 30)
print(f"День рождения: {день_рождения}")

# Форматирование дат
print(f"Отформатированная дата: {сейчас.strftime('%d.%m.%Y %H:%M:%S')}")
print(f"День недели: {сейчас.strftime('%A')}")

# Разбор строк в даты
строка_даты = "2023-12-25 15:30:00"
дата_из_строки = datetime.strptime(строка_даты, '%Y-%m-%d %H:%M:%S')
print(f"Дата из строки: {дата_из_строки}")

# Арифметика с датами
через_неделю = сейчас + timedelta(weeks=1)
через_месяц = сейчас + timedelta(days=30)
print(f"Через неделю: {через_неделю}")
print(f"Через 30 дней: {через_месяц}")

# Разница между датами
разница = через_месяц - сейчас
print(f"Разница: {разница.days} дней")

# Работа с time
print("Засыпаем на 2 секунды...")
time_module.sleep(2)  # Пауза на 2 секунды
print("Проснулись!")

# Получение времени в Unix формате
unix_время = time_module.time()
print(f"Unix время: {unix_время}")
print(f"Преобразованное время: {datetime.fromtimestamp(unix_время)}")

Работа с регулярными выражениями

Модуль re предоставляет мощные инструменты для работы с регулярными выражениями:

Модуль re
import re

# Поиск совпадений
текст = "Контакты: email@example.com, телефон: +7(123)456-78-90, сайт: https://example.com"

# Поиск email адресов
email_паттерн = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
email_адреса = re.findall(email_паттерн, текст)
print(f"Найденные email адреса: {email_адреса}")

# Поиск телефонных номеров
телефон_паттерн = r'\+7\(\d{3}\)\d{3}-\d{2}-\d{2}'
телефоны = re.findall(телефон_паттерн, текст)
print(f"Найденные телефоны: {телефоны}")

# Поиск URL
url_паттерн = r'https?://[^\s]+'"
url_адреса = re.findall(url_паттерн, текст)
print(f"Найденные URL: {url_адреса}")

# Замена текста
новый_текст = re.sub(email_паттерн, "[EMAIL СКРЫТ]", текст)
print(f"Текст после замены email: {новый_текст}")

# Использование объектов паттернов для многократного использования
email_объект = re.compile(email_паттерн)
if email_объект.search(текст):
    print("В тексте найден email адрес")

# Разделение строки по паттерну
предложения = re.split(r'[.!?]+ ', "Привет! Как дела? Все хорошо. Отлично!")
print(f"Разделенные предложения: {предложения}")

# Проверка соответствия строки паттерну
валидация_email = lambda email: bool(re.match(email_паттерн, email))
print(f"Валидный email 'test@example.com': {валидация_email('test@example.com')}")
print(f"Валидный email 'invalid.email': {валидация_email('invalid.email')}")

Работа с коллекциями

Модуль collections предоставляет дополнительные типы данных и структуры:

collections
from collections import Counter, defaultdict, namedtuple, deque
import random

# Counter - подсчет элементов
текст = "программирование на python это замечательно"
счетчик_букв = Counter(текст)
print(f"Частота букв: {счетчик_букв}")
print(f"Наиболее частые буквы: {счетчик_букв.most_common(3)}")

# defaultdict - словарь с значением по умолчанию
оценки = defaultdict(list)
оценки["Иван"].append(5)
оценки["Мария"].append(4)
оценки["Иван"].append(3)
print(f"Оценки: {dict(оценки)}")

# namedtuple - именованный кортеж
Точка = namedtuple('Точка', ['x', 'y'])
точка1 = Точка(1, 2)
точка2 = Точка(3, 4)
print(f"Точка 1: x={точка1.x}, y={точка1.y}")
print(f"Точка 2: {точка2}")

# deque - двусторонняя очередь
очередь = deque([1, 2, 3])
очередь.append(4)        # Добавить справа
очередь.appendleft(0)    # Добавить слева
print(f"Очередь после добавления: {очередь}")

элемент_справа = очередь.pop()      # Удалить справа
элемент_слева = очередь.popleft()   # Удалить слева
print(f"Удаленные элементы: {элемент_справа}, {элемент_слева}")
print(f"Очередь после удаления: {очередь}")

# Ограниченная очередь
ограниченная_очередь = deque(maxlen=3)
for i in range(5):
    ограниченная_очередь.append(i)
    print(f"Ограниченная очередь: {ограниченная_очередь}")

Работа с JSON

Модуль json позволяет работать с данными в формате JSON:

JSON
import json

# Преобразование Python объектов в JSON
данные = {
    "имя": "Анна",
    "возраст": 25,
    "хобби": ["программирование", "чтение", "путешествия"],
    "адрес": {
        "город": "Москва",
        "улица": "Арбат"
    }
}

# Преобразование в строку JSON
json_строка = json.dumps(данные, ensure_ascii=False, indent=2)
print("Данные в формате JSON:")
print(json_строка)

# Запись в файл
with open("данные.json", "w", encoding="utf-8") as файл:
    json.dump(данные, файл, ensure_ascii=False, indent=2)

# Чтение из файла
with open("данные.json", "r", encoding="utf-8") as файл:
    прочитанные_данные = json.load(файл)
    print(f"Прочитанные данные: {прочитанные_данные}")

# Преобразование JSON строки в Python объект
json_строка = '{"имя": "Иван", "возраст": 30, "хобби": ["спорт", "музыка"]}'
объект = json.loads(json_строка)
print(f"Python объект: {объект}")
print(f"Имя: {объект['имя']}")

# Работа с пользовательскими классами
class Персона:
    def __init__(self, имя, возраст):
        self.имя = имя
        self.возраст = возраст

# Для сериализации пользовательских классов нужно создать функцию кодирования
def кодировать_персону(объект):
    if isinstance(объект, Персона):
        return {"имя": объект.имя, "возраст": объект.возраст}
    raise TypeError(f"Объект типа {type(объект)} не сериализуем")

персона = Персона("Мария", 28)
json_персона = json.dumps(персона, default=кодировать_персону, ensure_ascii=False)
print(f"Персона в JSON: {json_персона}")

Математические операции

Модули math и random предоставляют математические функции и генерацию случайных чисел:

math и random
import math
import random

# Математические функции
print(f"Квадратный корень из 16: {math.sqrt(16)}")
print(f"2 в степени 8: {math.pow(2, 8)}")
print(f"Пи: {math.pi}")
print(f"Синус 90 градусов: {math.sin(math.radians(90))}")
print(f"Логарифм 100 по основанию 10: {math.log10(100)}")
print(f"Округление вверх 4.2: {math.ceil(4.2)}")
print(f"Округление вниз 4.8: {math.floor(4.8)}")

# Генерация случайных чисел
print(f"Случайное число от 1 до 10: {random.randint(1, 10)}")
print(f"Случайное вещественное число от 0 до 1: {random.random()}")
print(f"Случайный выбор из списка: {random.choice(['яблоко', 'банан', 'апельсин'])}")

# Перемешивание списка
список_карт = ["Туз", "Король", "Дама", "Валет", "10"]
print(f"Исходный список: {список_карт}")
random.shuffle(список_карт)
print(f"Перемешанный список: {список_карт}")

# Генерация случайной выборки
алфавит = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
случайные_буквы = random.sample(алфавит, 5)
print(f"Случайные буквы: {случайные_буквы}")

# Установка начального значения для воспроизводимости
random.seed(42)
print(f"Случайное число с seed=42: {random.randint(1, 100)}")
random.seed(42)
print(f"То же число с seed=42: {random.randint(1, 100)}")

Упражнения

Упражнение 1: Работа с файлами и путями

Создайте функцию, которая принимает путь к каталогу и возвращает словарь с информацией о файлах в этом каталоге: количество файлов, общий размер, список файлов с расширениями.

from pathlib import Path

def информация_о_каталоге(путь_к_каталогу):
    каталог = Path(путь_к_каталогу)
    
    if not каталог.exists():
        raise FileNotFoundError(f"Каталог {путь_к_каталогу} не существует")
    
    if not каталог.is_dir():
        raise ValueError(f"{путь_к_каталогу} не является каталогом")
    
    файлы = list(каталог.iterdir())
    файлы_только = [файл for файл in файлы if файл.is_file()]
    
    общий_размер = sum(файл.stat().st_size for файл in файлы_только)
    
    расширения = {}
    for файл in файлы_только:
        расширение = файл.suffix.lower()
        if расширение in расширения:
            расширения[расширение] += 1
        else:
            расширения[расширение] = 1
    
    return {
        "количество_файлов": len(файлы_только),
        "общий_размер": общий_размер,
        "файлы": [файл.name for файл in файлы_только],
        "расширения": расширения
    }

# Тестирование
try:
    информация = информация_о_каталоге(".")  # Текущий каталог
    print(f"Количество файлов: {информация['количество_файлов']}")
    print(f"Общий размер: {информация['общий_размер']} байт")
    print(f"Расширения: {информация['расширения']}")
except (FileNotFoundError, ValueError) as e:
    print(f"Ошибка: {e}")
Упражнение 2: Валидация email адресов

Создайте функцию, которая проверяет список email адресов с помощью регулярных выражений и возвращает только валидные адреса.

import re

def валидация_email_адресов(список_адресов):
    паттерн = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
    компилированный_паттерн = re.compile(паттерн)
    
    валидные_адреса = []
    for адрес in список_адресов:
        if компилированный_паттерн.match(адрес):
            валидные_адреса.append(адрес)
    
    return валидные_адреса

# Тестирование
email_адреса = [
    "valid@example.com",
    "invalid.email",
    "test@domain.co.uk",
    "@invalid.com",
    "user.name@company.org",
    "invalid@",
    "valid123@test-domain.com"
]

валидные = валидация_email_адресов(email_адреса)
print(f"Валидные email адреса: {валидные}")
Упражнение 3: Статистика текста

Создайте функцию, которая анализирует текст и возвращает статистику: количество слов, предложений, самых частых слов и среднюю длину слова.

import re
from collections import Counter

def анализ_текста(текст):
    # Очистка текста от лишних символов
    очищенный_текст = re.sub(r'[^\w\s]', ' ', текст)
    
    # Разделение на слова
    слова = [слово.lower() for слово in очищенный_текст.split() if слово]
    
    # Подсчет слов
    количество_слов = len(слова)
    
    # Подсчет предложений
    предложения = re.split(r'[.!?]+ ', текст)
    количество_предложений = len([п for п in предложения if п.strip()])
    
    # Самые частые слова
    счетчик_слов = Counter(слова)
    самые_частые = счетчик_слов.most_common(5)
    
    # Средняя длина слова
    общая_длина = sum(len(слово) for слово in слова)
    средняя_длина = общая_длина / количество_слов if количество_слов > 0 else 0
    
    return {
        "количество_слов": количество_слов,
        "количество_предложений": количество_предложений,
        "самые_частые_слова": самые_частые,
        "средняя_длина_слова": round(средняя_длина, 2)
    }

# Тестирование
пример_текста = """Python - это мощный язык программирования. 
Он прост в изучении и имеет читаемый синтаксис. 
Python используется для веб-разработки, анализа данных и машинного обучения. 
Многие компании выбирают Python для своих проектов. 
Python имеет богатую экосистему библиотек и фреймворков."""

статистика = анализ_текста(пример_текста)
print(f"Количество слов: {статистика['количество_слов']}")
print(f"Количество предложений: {статистика['количество_предложений']}")
print(f"Самые частые слова: {статистика['самые_частые_слова']}")
print(f"Средняя длина слова: {статистика['средняя_длина_слова']} символа")
Предыдущий урок Следующий урок