ru
Feedback
Python | Вопросы собесов

Python | Вопросы собесов

Открыть в Telegram

📈 Аналитический обзор Telegram-канала Python | Вопросы собесов

Канал Python | Вопросы собесов (@python_easy_ru) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 13 107 подписчиков, занимая 9 737 место в категории Технологии и приложения и 50 735 место в регионе Россия.

📊 Показатели аудитории и динамика

С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 13 107 подписчиков.

Согласно последним данным от 08 июня, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило -51, а за последние 24 часа — 1, при этом общий охват остаётся высоким.

  • Статус верификации: Не верифицирован
  • Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 8.36%. В первые 24 часа после публикации контент обычно набирает 5.74% реакций от общего числа подписчиков.
  • Охват публикаций: В среднем каждый пост получает 1 096 просмотров. В течение первых суток публикация набирает 752 просмотров.
  • Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 4.
  • Тематические интересы: Контент сосредоточен на ключевых темах, таких как ставь, модуль, строка, docker, alice.

📝 Описание и контентная политика

Автор описывает ресурс как площадку для выражения субъективного мнения:
Cайт: easyoffer.ru Реклама: @easyoffer_adv ВП: @easyoffer_vp Тесты t.me/+20tRfhrwPpM4NDQy Задачи t.me/+nsl4meWmhfQwNDVi Вакансии t.me/+cXGKkrOY2-w3ZTky

Благодаря высокой частоте обновлений (последние данные получены 09 июня, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.

13 107
Подписчики
+124 часа
-97 дней
-5130 день
Архив постов
🤔 Какие есть коды ошибок HTTP? В HTTP коды состояния указывают, как сервер обработал запрос. Они делятся на 5 категорий: 1xx (Информационные – запрос принят, продолжаем. 2xx (Успешные) – всё хорошо. 3xx (Перенаправления) – запрашиваемый ресурс перемещён. 4xx (Ошибки клиента) – клиент отправил неправильный запрос. 5xx (Ошибки сервера) – сервер не смог обработать запрос. 🚩Как исправить ошибки HTTP? 4xx: 400: Проверить формат запроса. 401: Убедиться, что пользователь авторизован. 403: Проверить права доступа. 404: Убедиться, что URL правильный. 5xx: 500: Проверить код сервера (ошибки в логах). 502/504: Проверить настройки Nginx/Proxy. 503: Сервер перегружен → добавить балансировку нагрузки. Ставь 👍 и забирай 📚 Базу знаний

⚡️ Python теперь в Telegram! Ребята сделали крутейший канал, где на простых картинках и понятном языке обучают Python, делятс
+4
⚡️ Python теперь в Telegram! Ребята сделали крутейший канал, где на простых картинках и понятном языке обучают Python, делятся полезными фишками и инструментами Подписывайтесь: @PythonPortal

🤔 Что такое мутабельные и иммутабельные типы данных? 1. Мутабельные (mutable): данные, которые можно изменять после создания, например, списки (list), словари (dict), множества (set). 2. Иммутабельные (immutable): данные, которые нельзя изменить после создания, например, строки (str), числа (int, float), кортежи (tuple). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Назовите основные мидлвари, зачем они нужны Middleware (промежуточное ПО) — это специальные классы, которые обрабатывают запросы и ответы, проходящие через Django. Они позволяют изменять данные, проверять доступ, логировать действия и многое другое. 🚩Основные мидлвари Django 🟠SecurityMiddleware Добавляет важные HTTP-заголовки для защиты сайта: - Strict-Transport-Security (HTTPS) - X-Content-Type-Options: nosniff - X-Frame-Options: DENY 🟠CommonMiddleware Отвечает за: Перенаправление с APPEND_SLASH=True (если /about → перенаправит на /about/). Удаление www. (www.example.comexample.com). Обработка кодировки и контента. 🟠SessionMiddleware Позволяет Django хранить данные пользователя между запросами (например, авторизацию).
request.session["user_id"] = 42  # Сохраняем ID пользователя в сессии
🟠AuthenticationMiddleware Позволяет работать с request.user, автоматически определяя пользователя.
if request.user.is_authenticated:
    print(f"Пользователь: {request.user.username}")
🟠CSRF Middleware (CsrfViewMiddleware) Защищает от атак межсайтовой подделки запросов (CSRF). При обработке форм Django требует специальный CSRF-токен:
<form method="POST">
    {% csrf_token %}
    <input type="text" name="name">
</form>
🟠XFrameOptionsMiddleware Запрещает встраивать сайт в <iframe>, предотвращая атаку Clickjacking.
X-Frame-Options: DENY
🟠MessageMiddleware Позволяет передавать временные сообщения (django.contrib.messages).
from django.contrib import messages

messages.success(request, "Вы успешно вошли!")
messages.error(request, "Ошибка авторизации!")
🚩Как добавить или отключить мидлвари? Мидлвари хранятся в settings.py:
MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
]
🚩Как написать свой мидлвар? Допустим, хотим логировать все запросы. Создаём middleware.py
import datetime

class LogMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        print(f"[{datetime.datetime.now()}] Запрос: {request.path}")
        response = self.get_response(request)
        return response
Добавляем в settings.py
MIDDLEWARE.append("myapp.middleware.LogMiddleware")
Теперь в консоли будем видеть все запросы!
[2024-02-28 12:00:00] Запрос: /
[2024-02-28 12:01:00] Запрос: /login/
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие декораторы, которые есть в стандартной библиотеке есть? 1. @staticmethod: создаёт статический метод, не зависящий от экземпляра класса. 2. @classmethod: создаёт метод, который получает ссылку на класс, а не на объект. 3. @property: позволяет обращаться к методу как к атрибуту. 4. @functools.lru_cache: кэширует результаты функции для ускорения повторных вызовов. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое Host? Host (хост) — это устройство или сервер, подключённый к сети, который может предоставлять или запрашивать данные.
GET /index.html HTTP/1.1
Host: example.com
🚩Где используется `Host`? 🟠В HTTP-запросах (заголовок `Host`) Когда браузер запрашивает сайт, он отправляет заголовок Host, чтобы сервер знал, какой сайт нужно отдать.
GET / HTTP/1.1
Host: google.com
User-Agent: Mozilla/5.0
🟠В настройке DNS и доменных имён Host — это доменное имя, привязанное к IP-адресу. - example.com192.168.1.100 - mail.example.com192.168.1.101
127.0.0.1 mysite.local
🟠3. В локальной сети (локальные хосты) Внутри сети устройства тоже считаются хостами (192.168.1.10, 192.168.1.20). localhost (127.0.0.1) — это всегда локальный компьютер. Ставь 👍 и забирай 📚 Базу знаний

🤔 При каких ошибках HTTP есть смысл ретраить? Ретрай (повтор запроса) возможен при: - 429 (Too Many Requests) — если сервер просит подождать. - 503 (Service Unavailable) — сервер временно недоступен. - 502/504 — сбои на уровне прокси/шлюзов, возможно временные. Ретрай не имеет смысла при ошибках клиента (например, 400 или 404). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как управлять кешированием в HTTP? Кэширование в HTTP позволяет уменьшить нагрузку на сервер и ускорить загрузку страниц за счёт сохранения копий ресурсов. Управление кэшем происходит через HTTP-заголовки, которые указывают, как долго хранить данные и когда обновлять их. 🟠Управление кэшированием через `Cache-Control` Cache-Control — основной заголовок для кэширования, который указывает, как долго хранить ресурс и когда обновлять его.
Cache-Control: no-cache            # Браузер всегда запрашивает ресурс заново
Cache-Control: no-store            # Запрещает кэширование вообще
Cache-Control: public, max-age=3600  # Кэшировать 1 час (3600 секунд)
Cache-Control: private, max-age=600  # Кэш только для одного пользователя (например, личный кабинет)
Cache-Control: must-revalidate     # Клиент должен проверять, истёк ли срок кэша перед загрузкой
🟠Управление кэшем с `ETag` (оптимизированное обновление) ETag — это уникальный идентификатор версии файла. Сервер отправляет ресурс с ETag:
ETag: "abc123"
При следующем запросе браузер отправляет If-None-Match:
If-None-Match: "abc123"
Если ресурс не изменился, сервер отвечает 304 Not Modified (клиент использует кэш). Если ресурс изменился — сервер отправляет новую версию.
HTTP/1.1 304 Not Modified
🟠Кэширование через `Last-Modified` Работает аналогично ETag, но вместо идентификатора используется дата последнего изменения. Сервер отправляет заголовок
Last-Modified: Wed, 21 Feb 2024 10:00:00 GMT
Браузер запрашивает ресурс с If-Modified-Since
If-Modified-Since: Wed, 21 Feb 2024 10:00:00 GMT
🟠Полное отключение кэша Если нужно всегда загружать свежие данные, используем:
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache  # Устарел, но нужен для старых браузеров
Expires: 0
🟠Управление кэшем через `Vary` Если ресурс зависит от заголовков (User-Agent, Accept-Encoding), используем Vary.
Vary: User-Agent
🟠Принудительное обновление кэша (Cache Busting) Если сервер отправил старый кэш, можно обновить ресурс с новым URL. Способы Добавить версию в URL
/style.css?v=2
Использовать хеш в имени файла:
/style.abc123.css
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что относится к изменяемым типам данных и к неизменяемым? В Python к изменяемым типам данных относятся списки (list), множества (set), словари (dict), а к неизменяемым — числа, строки (str), кортежи (tuple), замороженные множества (frozenset). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Repost from easyoffer
Я боялся, что провалю собеседование. Так появился easyoffer Когда я только начинал искать первую работу программистом, меня п
+2
Я боялся, что провалю собеседование. Так появился easyoffer Когда я только начинал искать первую работу программистом, меня пугала мысль, что я просто не смогу ответить на вопросы на собеседовании. Типа… ты потратил месяцы на то, чтобы учиться, писал pet-проекты, собирал резюме, рассылаешь отклики — и всё может закончиться на одном-единственном вопросе, на который ты не знаешь ответ. Я реально боялся. Я смотрел видео mock-собеседований на YouTube, останавливал каждое, выписывал вопросы в Notion. Потом вручную писал к ним ответы. И потом ещё по нескольку раз перечитывал. Такой вот "тренажёр" на коленке. 📎 (там на картинке — один из моих реальных списков в Notion, ставь 🔥 если тоже так делал) В какой-то момент я посчитал — у меня уже было выписано больше 500 вопросов. Я почувствовал ужас. Потому что невозможно всё это зазубрить. А что, если спросят как раз тот, к которому я не успел подготовиться?.. Тогда и пришла идея А что если понять, какие из вопросов встречаются чаще всего? Чтобы не учить всё подряд, а сфокусироваться на главном. Так родился easyoffer. Сначала — просто как пет-проект, чтобы показать в резюме и подготовиться к собесам. А потом оказалось, что он реально помогает людям. За первые месяцы его посетили сотни тысяч человек. И я понял: это больше, чем просто пет-проект. Сейчас я делаю EasyOffer 2.0 И уже не один, а вместе с вами. В новой версии будут: – вопросы из реальных собесов, с фильтрацией по грейду, компании, типу интервью – тренажёр с карточками (по принципу интервальных повторений — как в Anki) – база задач с интервью – тренажёр «реальное собеседование», чтобы отрепетировать как в жизни Каждая фича упрощает и сокращает время на подготовку. Все эти штуки я бы мечтал иметь, когда сам готовился к собеседованиям. Я делаю всё на свои деньги. Никаких инвесторов. Только вы и я. Если вы хотите помочь — сейчас самое важное время. Краудфандинг уже стартовал. Благодаря нему я смогу привлечь больше людей для разработки, сбору и обработки собеседований. Все, кто поддержат проект до релиза, получат: 🚀 1 год PRO-доступа по цене месячной подписки. Его можно активировать в любое время, например когда начнете готовится к собесам. ➕ Доступ к закрытому бета-тесту Поддержать 👉 https://planeta.ru/campaigns/easyoffer Спасибо, что верите в этот проект 🙌

🤔 Какие инструменты используются для виртуального окружения? Для создания и управления виртуальными окружениями существует несколько инструментов. Вот некоторые из наиболее распространенных: 🟠virtualenv Это один из самых популярных инструментов для создания виртуальных окружений. Он позволяет создавать изолированные среды, в которых можно устанавливать и использовать зависимости для конкретных проектов. 🟠venv Это встроенный инструмент для создания виртуальных окружений, доступный начиная с Python 3.3. Он предоставляет функциональность, аналогичную virtualenv, но является частью стандартной библиотеки. 🟠Pipenv Это инструмент для управления зависимостями и виртуальными окружениями. Он комбинирует возможности управления зависимостями с помощью pip и создания виртуальных окружений с помощью virtualenv или venv. Pipenv также автоматически создает и активирует виртуальное окружение для каждого проекта. 🟠Poetry Это современный инструмент для управления зависимостями и виртуальными окружениями. Он предоставляет возможности для управления зависимостями, создания виртуальных окружений, управления сценариями (scripts) и публикации пакетов. Poetry использует файл pyproject.toml для определения зависимостей и настроек проекта. Ставь 👍 и забирай 📚 Базу знаний

🤔 Для чего нужно ключевое слово global? Ключевое слово global используется для объявления переменной глобальной внутри функции. Без него любое присваивание переменной внутри функции создаёт новую локальную переменную. Если нужно изменить переменную, определённую вне функции — следует явно указать global. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 За счет чего достигается константная величина ячейки памяти для всех элементов, если типы данных в списке могут быть разными? В Python список (list) — это массив указателей. Элементы списка не хранятся внутри него, а находятся в других местах памяти, а сам список содержит ссылки (указатели) на них. 🚩Как Python хранит список в памяти? Допустим, у нас есть список:
my_list = [10, "hello", 3.14, [1, 2, 3]]
+-----------------+
| Указатель → 10  |  (int)
| Указатель → "hello"  |  (str)
| Указатель → 3.14  |  (float)
| Указатель → [1, 2, 3] |  (list)
+-----------------+
🚩Проверим на практике Мы можем увидеть размер пустого списка и списка с элементами с помощью sys.getsizeof():
import sys

empty_list = []
print(sys.getsizeof(empty_list))  # 56 байт (сам список)

filled_list = [10, "hello", 3.14, [1, 2, 3]]
print(sys.getsizeof(filled_list))  # 88 байт (список + 4 указателя)
🚩Размер ячейки списка всегда одинаковый Каждая ячейка списка занимает фиксированное количество памяти, равное размеру указателя (8 байт на 64-битной системе).
import ctypes

my_list = [10, "hello", 3.14, [1, 2, 3]]

for i in range(len(my_list)):
    print(ctypes.cast(id(my_list[i]), ctypes.py_object).value)
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие области видимости есть? Согласно правилу LEGB: - Локальная (внутри текущей функции). - Замыкающая (внутри внешней функции, если функция вложена). - Глобальная (на уровне модуля). - Встроенная (встроенные функции и константы вроде print, len, None). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какая сложность у пузырьковой сортировки? Пузырьковая сортировка (Bubble Sort) — это один из самых простых, но неэффективных алгоритмов сортировки. 🚩Как работает пузырьковая сортировка? 1. Проходим по массиву несколько раз. 2. На каждой итерации сравниваем соседние элементы и меняем их местами, если они идут не в том порядке. 3. После первого прохода наибольший элемент оказывается в конце массива. 4. Повторяем процесс, пока массив не отсортируется. 🚩Рассчёт сложности (`O(n²)`) Количество сравнений в худшем случае: - На первой итерации: n-1 сравнений - На второй: n-2 сравнений - На третьей: n-3 сравнений - … - Всего: (n-1) + (n-2) + ... + 1 = O(n²) Количество обменов (swap) в худшем случае: - Если массив полностью перевёрнут, на каждой итерации будет максимальное количество перестановок → O(n²). 🚩Оптимизированная пузырьковая сортировка (`O(n)`) Если на проходе по массиву не было перестановок, значит массив уже отсортирован.
def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        swapped = False  # Флаг, отслеживающий перестановки
        for j in range(n - i - 1):
            if arr[j] > arr[j + 1]:  # Если элементы в неправильном порядке, меняем местами
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
                swapped = True
        if not swapped:
            break  # Если перестановок не было, завершаем сортировку

arr = [1, 2, 3, 4, 5]  # Уже отсортированный массив
bubble_sort(arr)
print(arr)  # [1, 2, 3, 4, 5]
Ставь 👍 и забирай 📚 Базу знаний

От чего зависит эффективность автотестов? От их правильного написания и поддерживаемости! В QA GURU учат приручать Java, чтобы ваши автотесты работали, как часы. Вот несколько лайфхаков, о которых мы расскажем на вводном занятии уже сегодня (20:00 Мск): 1. Используйте понятные и описательные названия тестов Названия тестов должны четко отражать их цель. Это упрощает понимание кода всеми членами команды. Например: // Хорошо
public void verifyLoginWithValidCredentials() { ... }
// Плохо
public void test1() { ... }
Описательные названия помогают быстро понять, что проверяет тест, без необходимости изучения его внутренней логики. 2. Применяйте Page Object Model (POM) Page Object Model позволяет отделить логику теста от структуры веб-страницы, что делает код более модульным и удобным для поддержки при изменениях интерфейса. Пример использования: // Класс
Page Object
public class LoginPage {
    private By usernameField = By. id("username");
    private By passwordField = By. id("password");
    private By loginButton = By. id("loginBtn");

    public void enterUsername(String username) {
        driver.findElement(usernameField).sendKeys(username);
    }

    public void enterPassword(String password) {
        driver.findElement(passwordField).sendKeys(password);
    }

    public void clickLoginButton() {
        driver.findElement(loginButton).click();
    }
}
// Тестовый сценарий
LoginPage loginPage = new LoginPage(driver);
loginPage.enterUsername("john.doe");
loginPage.enterPassword("password123");
loginPage.clickLoginButton();
POM способствует повторному использованию кода и улучшает читаемость тестов. 3. Используйте параметризацию и data-driven подход Параметризованные тесты позволяют запускать один и тот же сценарий с различными входными данными, что увеличивает охват тестирования без дублирования кода.
@ ParameterizedTest
@ CsvSource({"john.doe, password123", "jane.smith, test@123"})
public void verifyLogin(String username, String password) {
    LoginPage loginPage = new LoginPage(driver);
    loginPage.enterUsername(username);
    loginPage.enterPassword(password);
    loginPage.clickLoginButton();
}
Этот подход делает тесты более гибкими и масштабируемыми. 4. Следуйте принципу AAA (Arrange, Act, Assert) Структурируйте тесты в три этапа: Arrange: подготовка данных и окружения. Act: выполнение действия. Assert: проверка результата. Пример:
@ Test
public void testAddition() {
    // Arrange
    Calculator calculator = new Calculator();

    // Act
    int result = calculator.add(2, 3);

    // Assert
    assertEquals(5, result);
}
Этот подход делает тесты более организованными и легко читаемыми. 5. Логирование и отчетность Добавляйте логирование в тесты для диагностики проблем:
log. info("Entering username: " + username);
log. info("Clicking on the login button");
Интеграция инструментов отчетности (например, Allure) помогает визуализировать результаты тестов и быстро выявлять ошибки. 6. Регулярные ревью кода Проводите регулярные ревью автотестов для повышения качества кода. Это помогает выявить потенциальные проблемы, улучшить читаемость и обеспечить соблюдение стандартов кодирования. 7. Автоматизация и CI/CD Используйте инструменты автоматизации (Maven, Gradle) для запуска тестов в рамках CI/CD пайплайнов. Это ускоряет процесс разработки и обеспечивает стабильность приложения на всех этапах. Хотите узнать больше? Присоединяйтесь уже сегодня (20:00 Мск) к бесплатному открытому уроку! 🔗 Зарегистрируйтесь на первый открытый урок по ссылке.

🤔 Что из POST, PUT и PATCH идемпотентно? - PUT — идемпотентный: повторный вызов приводит к одному и тому же состоянию ресурса. - PATCH — условно идемпотентный, если изменения одинаковы. - POST — не идемпотентный, каждый запрос может создать новый объект или изменить данные. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Зачем нужны схемы в БД? Схема (schema) в базе данных — это логическая группировка объектов (таблиц, индексов, представлений и т. д.) внутри одной БД. 🚩Что такое схема в БД? Схема — это контейнер для объектов БД (таблиц, индексов, процедур).
База данных (company_db)
 ├── Схема: public (по умолчанию)
 │   ├── Таблица: employees
 │   ├── Таблица: departments
 ├── Схема: hr
 │   ├── Таблица: employees
 │   ├── Таблица: salaries
 ├── Схема: sales
 │   ├── Таблица: customers
 │   ├── Таблица: orders
🚩Как создавать и использовать схемы? Создание схемы (CREATE SCHEMA)
CREATE SCHEMA hr;  -- Создаём схему "hr"
Создание таблицы внутри схемы
CREATE TABLE hr.employees (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    position VARCHAR(50)
);
Выбор схемы по умолчанию
SET search_path TO hr;
🚩Где полезны схемы? 🟠Разделение данных по модулям Если в БД хранятся разные области бизнеса (кадры, продажи, финансы), их можно разделить по схемам: - hr.employees, hr.salaries - sales.orders, sales.customers 🟠Разные версии одной БД Например, в PostgreSQL можно создать схему dev для тестов: - dev.users — тестовая версия таблицы - prod.users — продакшен-версия 🟠Безопасность и доступ пользователей Можно дать доступ к разным схемам разным пользователям:
GRANT USAGE ON SCHEMA hr TO hr_manager;
GRANT SELECT ON ALL TABLES IN SCHEMA hr TO hr_manager;
Ставь 👍 и забирай 📚 Базу знаний

Repost from Идущий к IT
Привет ребята, мне на easyoffer.ru нужен: 🐍 Middle/Senior Python Developer Стек: DRF, PostgreSQL, Redis, Celery, Docker, Sentry Задачи: 🟠Разработка и поддержка REST API для новых фичей 🟠Интеграция с веб-сервисами и внешними API 🟠Подключение и поддержка платежных систем 🟠Написание юнит- и интеграционных тестов 🟠Оптимизация производительности и масштабирование 🟠Взаимодействие с ML-моделями — будет плюсом Ожидания: 🟠2+ лет опыта DRF 🟠Опыт интеграций платежных систем 🟠Опыт работы с PostgreSQL, Celery, Redis, Docker 🟠Умение проектировать архитектуру REST-API 🟠Ответственный подход к качеству кода и тестированию Опыт в стартапах и небольших командах будет плюсом Условия: – Частичная занятость (2-3 часа в день) – Удаленная работа – Свободный график – Почасовая оплата ✈ Если вас заинтересовала вакансия, напишите мне @kivaiko 1. Резюме 2. Ссылку на github 3. Комфортную ставку за час

🤔 Какие магические методы и для чего используются? Магические методы (например, __init__, __str__, __len__, __add__) используются для определения поведения объектов в специфичных ситуациях, таких как инициализация, строковое представление, арифметические операции или работа с коллекциями. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний