Python | Вопросы собесов
Cайт: easyoffer.ru Реклама: @easyoffer_adv ВП: @easyoffer_vp Тесты t.me/+20tRfhrwPpM4NDQy Задачи t.me/+nsl4meWmhfQwNDVi Вакансии t.me/+cXGKkrOY2-w3ZTky
Показати більше📈 Аналітичний огляд Telegram-каналу Python | Вопросы собесов
Канал Python | Вопросы собесов (@python_easy_ru) у мовному сегменті Російська є активним учасником. На даний момент спільнота об'єднує 13 106 підписників, посідаючи 9 745 місце в категорії Технології та додатки та 50 714 місце у регіоні Росія.
📊 Показники аудиторії та динаміка
З моменту свого створення невідомо, проект продемонстрував стрімке зростання, зібравши аудиторію у 13 106 підписників.
За останніми даними від 09 червня, 2026, канал демонструє стабільну активність. Хоча за останні 30 днів спостерігається зміна кількості учасників на -53, а за останні 24 години на -3, загальне охоплення залишається високим.
- Статус верифікації: Не верифікований
- Рівень залученості (ER): Середній показник залученості аудиторії становить 8.62%. Протягом перших 24 годин після публікації контент зазвичай збирає 5.62% реакцій від загальної кількості підписників.
- Охоплення публікацій: В середньому кожен допис отримує 1 129 переглядів. Протягом першої доби публікація в середньому набирає 737 переглядів.
- Реакції та взаємодія: Аудиторія активно підтримує контент: середня кількість реакцій на один пост – 4.
- Тематичні інтереси: Контент зосереджений навколо ключових тем, таких як ставь, модуль, строка, docker, alice.
📝 Опис та контентна політика
Автор описує ресурс як майданчик для висловлення суб'єктивної думки:
“Cайт: easyoffer.ru
Реклама: @easyoffer_adv
ВП: @easyoffer_vp
Тесты t.me/+20tRfhrwPpM4NDQy
Задачи t.me/+nsl4meWmhfQwNDVi
Вакансии t.me/+cXGKkrOY2-w3ZTky”
Завдяки високій частоті оновлень (останні дані отримано 10 червня, 2026), канал підтримує актуальність та високий рівень охоплення публікацій. Аналітика показує, що аудиторія активно взаємодіє з контентом, що робить його важливою точкою впливу в категорії Технології та додатки.
import requests
def get_user_data(user_id):
response = requests.get(f"https://api.example.com/users/{user_id}")
return response.json()
Чтобы протестировать эту функцию без реальных запросов, можно использовать mock:
from unittest.mock import patch
@patch('requests.get')
def test_get_user_data(mock_get):
mock_get.return_value.json.return_value = {"id": 1, "name": "John Doe"}
result = get_user_data(1)
assert result == {"id": 1, "name": "John Doe"}
mock_get.assert_called_once_with("https://api.example.com/users/1")
🚩Основные методы и атрибуты
🟠return_value
Устанавливает возвращаемое значение метода.
🟠side_effect
Устанавливает последовательность возвращаемых значений или исключений.
🟠assert_called_with()
Проверяет, что метод был вызван с определенными аргументами.
🟠assert_called_once_with()
Проверяет, что метод был вызван ровно один раз с определенными аргументами.
🚩Пример с контекстным менеджером
import requests
from unittest.mock import patch
def get_status_code(url):
response = requests.get(url)
return response.status_code
def test_get_status_code():
with patch('requests.get') as mock_get:
mock_get.return_value.status_code = 200
assert get_status_code("https://example.com") == 200
mock_get.assert_called_once_with("https://example.com")
Ставь 👍 и забирай 📚 Базу знанийtest_.
🟠Запуск тестов
Тесты выполняются с помощью команды pytest в командной строке.
🟠Ассерты
Используются стандартные утверждения (assert) для проверки условий.
🚩Основные возможности
🟠Автоматическое обнаружение тестов
pytest автоматически находит тестовые функции, классы и файлы.
🟠Фикстуры: Позволяют определять подготовительный и завершающий код для тестов.
🟠Параметризация
Позволяет запускать один и тот же тест с различными входными данными.
🟠Плагины
Расширяют функциональность фреймворка, например, для генерации отчетов, интеграции с CI/CD системами.
🚩Пример теста с использованием
# test_sample.py
def test_addition():
assert 1 + 1 == 2
def test_subtraction():
assert 2 - 1 == 1
Запуск тестов:
pytest
🟠Фикстуры
Фикстуры позволяют подготовить необходимые данные или состояния для тестов.
import pytest
@pytest.fixture
def sample_data():
return {"key1": "value1", "key2": "value2"}
def test_sample_data(sample_data):
assert sample_data["key1"] == "value1"
🟠Параметризация тестов
Позволяет запускать один тест с разными наборами данных.
import pytest
@pytest.mark.parametrize("a, b, result", [
(1, 2, 3),
(2, 3, 5),
(3, 5, 8)
])
def test_addition(a, b, result):
assert a + b == result
Ставь 👍 и забирай 📚 Базу знанийimport time
# Оригинальная функция
def original_sleep(seconds):
time.sleep(seconds)
print(f"Slept for {seconds} seconds")
# Monkey patching функции sleep
def patched_sleep(seconds):
print(f"Patched! Should have slept for {seconds} seconds")
# Применение monkey patching
time.sleep = patched_sleep
# Примеры использования
time.sleep(3) # Вывод: Patched! Should have slept for 3 seconds
🚩Недостатки
➖Неявные изменения
Изменения могут быть неочевидны другим разработчикам, что может привести к путанице и затруднениям в отладке.
➖Совместимость
Monkey patching может вызвать проблемы совместимости при обновлении библиотек или модулей.
➖Непредсказуемость
Изменения в поведении программы могут быть трудно предсказуемыми и отлаживаемыми.
Ставь 👍 и забирай 📚 Базу знанийwith является рекомендованным способом гарантированного закрытия файла, так как он автоматически управляет открытием и закрытием ресурса. Однако, если по какой-то причине вы не можете использовать with, можно гарантировать закрытие файла другими способами, такими как использование явного вызова метода close() в блоке finally.
🟠С использованием `try-finally`
Открытие и закрытие файла с использованием блока try-finally гарантирует, что файл будет закрыт, даже если в блоке try произойдет исключение. В этом примере файл открывается в блоке try, и его содержимое читается. Независимо от того, происходит ли исключение в блоке try или нет, блок finally будет выполнен, и файл будет закрыт.
file = None
try:
file = open('example.txt', 'r')
content = file.read()
print(content)
finally:
if file:
file.close()
🟠С использованием контекстного менеджера
Вы можете создать свой собственный контекстный менеджер, используя классы, который будет управлять открытием и закрытием файла. Это более сложный подход, но он полезен для понимания внутренних механизмов.
class FileManager:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
self.file = None
def __enter__(self):
self.file = open(self.filename, self.mode)
return self.file
def __exit__(self, exc_type, exc_value, traceback):
if self.file:
self.file.close()
# Примеры использования
file_manager = FileManager('example.txt', 'r')
try:
file = file_manager.__enter__()
content = file.read()
print(content)
finally:
file_manager.__exit__(None, None, None)
🟠С использованием декоратора
Еще один способ — использование декоратора для автоматического управления открытием и закрытием файла.
from functools import wraps
def open_file(filename, mode):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
file = open(filename, mode)
try:
result = func(file, *args, **kwargs)
finally:
file.close()
return result
return wrapper
return decorator
@open_file('example.txt', 'r')
def read_file(f):
return f.read()
# Примеры использования
print(read_file())
🟠С использованием менеджера контекста из `contextlib`
Модуль contextlib предоставляет полезные утилиты для создания контекстных менеджеров. Одной из таких утилит является contextlib.contextmanager, которая позволяет создавать контекстные менеджеры с помощью генераторов.
from contextlib import contextmanager
@contextmanager
def open_file(filename, mode):
file = open(filename, mode)
try:
yield file
finally:
file.close()
# Примеры использования
file_manager = open_file('example.txt', 'r')
file = file_manager.__enter__()
try:
content = file.read()
print(content)
finally:
file_manager.__exit__(None, None, None)
Ставь 👍 и забирай 📚 Базу знанийproperty, которая упрощает создание геттеров и сеттеров, делая код более читабельным и идиоматичным.
🚩Геттеры и сеттеры
Геттер — это метод, который возвращает значение атрибута, а сеттер — метод, который устанавливает значение атрибута.
Пример без использования property
class MyClass:
def __init__(self, value):
self._value = value # Приватный атрибут
def get_value(self):
return self._value
def set_value(self, value):
if value >= 0:
self._value = value
else:
raise ValueError("Value must be non-negative")
# Примеры использования
obj = MyClass(10)
print(obj.get_value()) # Вывод: 10
obj.set_value(20)
print(obj.get_value()) # Вывод: 20
try:
obj.set_value(-10) # Пример вызова исключения
except ValueError as e:
print(e) # Вывод: Value must be non-negative
🚩`property` атрибуты
Можно использовать функцию property, чтобы избежать явных вызовов геттеров и сеттеров и сделать код более естественным и читаемым. property позволяет определить методы доступа как атрибуты.
Пример с использованием property
class MyClass:
def __init__(self, value):
self._value = value
@property
def value(self):
return self._value
@value.setter
def value(self, value):
if value >= 0:
self._value = value
else:
raise ValueError("Value must be non-negative")
# Примеры использования
obj = MyClass(10)
print(obj.value) # Вывод: 10 (используется геттер)
obj.value = 20
print(obj.value) # Вывод: 20 (используется сеттер)
try:
obj.value = -10 # Пример вызова исключения через сеттер
except ValueError as e:
print(e) # Вывод: Value must be non-negative
🚩Плюсы
➕Инкапсуляция
Позволяет скрыть реализацию и управлять доступом к данным через методы, что делает код более безопасным и гибким.
➕Читабельность
Код выглядит как работа с обычными атрибутами, а не методами, что упрощает его понимание.
➕Контроль
Легко добавить валидацию или логику при установке или получении значений.
🚩Полный пример с геттером, сеттером и делетером
Также можно использовать декоратор @property для создания делетера (удаления атрибута).
class MyClass:
def __init__(self, value):
self._value = value
@property
def value(self):
return self._value
@value.setter
def value(self, value):
if value >= 0:
self._value = value
else:
raise ValueError("Value must be non-negative")
@value.deleter
def value(self):
del self._value
# Примеры использования
obj = MyClass(10)
print(obj.value) # Вывод: 10
obj.value = 20
print(obj.value) # Вывод: 20
del obj.value
try:
print(obj.value) # Ошибка, так как атрибут удален
except AttributeError as e:
print(e) # Вывод: 'MyClass' object has no attribute '_value'
Ставь 👍 и забирай 📚 Базу знанийclass MyClass:
class_attribute = 42 # Атрибут класса
# Доступ к атрибуту класса
print(MyClass.class_attribute) # Вывод: 42
# Создание экземпляров
obj1 = MyClass()
obj2 = MyClass()
# Доступ к атрибуту класса через экземпляры
print(obj1.class_attribute) # Вывод: 42
print(obj2.class_attribute) # Вывод: 42
# Изменение атрибута класса
MyClass.class_attribute = 100
print(obj1.class_attribute) # Вывод: 100
print(obj2.class_attribute) # Вывод: 100
🚩Атрибуты объекта (экземпляра)
Уникальны для каждого экземпляра класса. Они определяются внутри методов класса, обычно в методе __init__, и относятся к конкретному экземпляру.
class MyClass:
def __init__(self, value):
self.instance_attribute = value # Атрибут объекта
# Создание экземпляров
obj1 = MyClass(10)
obj2 = MyClass(20)
# Доступ к атрибутам объекта
print(obj1.instance_attribute) # Вывод: 10
print(obj2.instance_attribute) # Вывод: 20
# Изменение атрибутов объекта
obj1.instance_attribute = 15
print(obj1.instance_attribute) # Вывод: 15
print(obj2.instance_attribute) # Вывод: 20
🚩Ключевые различия
🟠Область видимости и доступ
Атрибуты класса видны и доступны для всех экземпляров класса. Атрибуты объекта видны и доступны только для конкретного экземпляра.
🟠Инициализация и использование
Атрибуты класса инициализируются при определении класса и общие для всех экземпляров. Атрибуты объекта инициализируются в методе __init__ и уникальны для каждого экземпляра.
🟠Изменение значений
Изменение атрибута класса через класс изменяет его для всех экземпляров. Изменение атрибута объекта влияет только на конкретный экземпляр.
🚩Пример различий
class MyClass:
class_attribute = 'class value'
def __init__(self, value):
self.instance_attribute = value
# Создание экземпляров
obj1 = MyClass('instance value 1')
obj2 = MyClass('instance value 2')
# Доступ к атрибутам класса и объекта
print(MyClass.class_attribute) # Вывод: class value
print(obj1.class_attribute) # Вывод: class value
print(obj2.class_attribute) # Вывод: class value
print(obj1.instance_attribute) # Вывод: instance value 1
print(obj2.instance_attribute) # Вывод: instance value 2
# Изменение атрибута класса через класс
MyClass.class_attribute = 'new class value'
print(obj1.class_attribute) # Вывод: new class value
print(obj2.class_attribute) # Вывод: new class value
# Изменение атрибута объекта
obj1.instance_attribute = 'new instance value 1'
print(obj1.instance_attribute) # Вывод: new instance value 1
print(obj2.instance_attribute) # Вывод: instance value 2
Ставь 👍 и забирай 📚 Базу знаний
Вже доступно! Дослідження Telegram за 2025 — головні інсайти року 
