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 104 подписчиков, занимая 9 745 место в категории Технологии и приложения и 50 714 место в регионе Россия.
📊 Показатели аудитории и динамика
С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 13 104 подписчиков.
Согласно последним данным от 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) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.
+). Он вызывается, когда используется оператор + между двумя объектами.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
def __repr__(self):
return f"Vector({self.x}, {self.y})"
# Использование
v1 = Vector(1, 2)
v2 = Vector(3, 4)
v3 = v1 + v2
print(v3) # Вывод: Vector(4, 6)
🟠Метод mul
Используется для реализации оператора умножения (*). Он вызывается, когда используется оператор * между двумя объектами.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __mul__(self, scalar):
return Vector(self.x * scalar, self.y * scalar)
def __repr__(self):
return f"Vector({self.x}, {self.y})"
# Использование
v = Vector(1, 2)
v2 = v * 3
print(v2) # Вывод: Vector(3, 6)
🟠Метод sub
Используется для реализации оператора вычитания (-). Он вызывается, когда используется оператор - между двумя объектами.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __sub__(self, other):
return Vector(self.x - other.x, self.y - other.y)
def __repr__(self):
return f"Vector({self.x}, {self.y})"
# Использование
v1 = Vector(5, 7)
v2 = Vector(2, 3)
v3 = v1 - v2
print(v3) # Вывод: Vector(3, 4)
🟠Метод truediv
Используется для реализации оператора деления (/). Он вызывается, когда используется оператор / между двумя объектами.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __truediv__(self, scalar):
return Vector(self.x / scalar, self.y / scalar)
def __repr__(self):
return f"Vector({self.x}, {self.y})"
# Использование
v = Vector(6, 8)
v2 = v / 2
print(v2) # Вывод: Vector(3.0, 4.0)
Ставь 👍 и забирай 📚 Базу знаний__len__ и abs являются специальными методами (или "магическими методами"), которые позволяют объектам классов взаимодействовать с встроенными функциями и операциями языка. Эти методы обеспечивают удобную и интуитивно понятную интеграцию пользовательских классов с стандартными операциями Python.
🚩Метод len
Используется для определения длины объекта. Он должен возвращать количество элементов в объекте. Позволяет объектам взаимодействовать с встроенной функцией len().
class MyCollection:
def __init__(self, items):
self.items = items
def __len__(self):
return len(self.items)
# Использование
my_collection = MyCollection([1, 2, 3, 4, 5])
print(len(my_collection)) # Вывод: 5
🚩Метод abs
Используется для вычисления абсолютного значения объекта. Он должен возвращать абсолютное значение объекта. Позволяет объектам взаимодействовать с встроенной функцией abs().
class MyNumber:
def __init__(self, value):
self.value = value
def __abs__(self):
return abs(self.value)
# Использование
my_number = MyNumber(-10)
print(abs(my_number)) # Вывод: 10
🚩Преимущества
➕Интеграция с встроенными функциями
Методы len и abs позволяют пользовательским объектам взаимодействовать с встроенными функциями Python, что делает их использование более интуитивно понятным и удобным.
➕Полиморфизм
Эти методы позволяют использовать объекты классов с функциями и операциями, предназначенными для стандартных типов данных.
➕Читаемость кода
Использование стандартных функций len() и abs() для пользовательских объектов делает код более понятным и читабельным.
import math
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __len__(self):
return 2 # Вектор на плоскости всегда имеет два компонента
def __abs__(self):
return math.sqrt(self.x**2 + self.y**2) # Длина (модуль) вектора
def __repr__(self):
return f"Vector({self.x}, {self.y})"
# Использование
v = Vector(3, 4)
print(len(v)) # Вывод: 2
print(abs(v)) # Вывод: 5.0
Ставь 👍 и забирай 📚 Базу знаний__del__. Этот метод вызывается, когда объект становится недоступным для использования и должен быть удалён сборщиком мусора.
class Person:
def __init__(self, name):
self.name = name
print(f"{self.name} is created")
def __del__(self):
print(f"{self.name} is deleted")
# Создание экземпляра класса Person
person1 = Person("Alice")
# Удаление ссылки на объект
del person1
# Пример с автоматическим вызовом деструктора при завершении программы
person2 = Person("Bob")
🚩Основные функции
🟠Освобождение ресурсов
Используется для освобождения ресурсов, таких как память, файловые дескрипторы, сетевые соединения и другие.
🟠Выполнение завершающих действий
Может выполнять любые завершающие действия, которые необходимо выполнить перед удалением объекта.
🟠Поддержание корректности программы
Помогает избежать утечек памяти и других ресурсов, обеспечивая корректное завершение работы программы.
🚩Особенности
🟠Неопределённое время вызова
Сборщик мусора управляет временем жизни объектов, поэтому точное время вызова деструктора не всегда определено.
🟠Не вызывается для циклических ссылок
Деструкторы не вызываются для объектов, участвующих в циклических ссылках. Для таких случаев рекомендуется использовать модуль weakref.
import weakref
class Node:
def __init__(self, name):
self.name = name
self.next = None
print(f"{self.name} is created")
def __del__(self):
print(f"{self.name} is deleted")
# Создание узлов
node1 = Node("Node1")
node2 = Node("Node2")
# Создание циклической ссылки
node1.next = node2
node2.next = node1
# Удаление узлов (циклическая ссылка предотвратит вызов деструкторов)
del node1
del node2
# Использование слабых ссылок для предотвращения утечек памяти
node1 = Node("Node1")
node2 = Node("Node2")
node1.next = weakref.ref(node2)
node2.next = weakref.ref(node1)
# Удаление узлов (слабые ссылки позволят вызвать деструкторы)
del node1
del node2
Ставь 👍 и забирай 📚 Базу знаний__init__. Этот метод вызывается автоматически при создании нового объекта класса и используется для инициализации атрибутов объекта.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def display(self):
print(f"Name: {self.name}, Age: {self.age}")
# Создание экземпляра класса Person
person1 = Person("Alice", 30)
person1.display() # Вывод: Name: Alice, Age: 30
person2 = Person("Bob", 25)
person2.display() # Вывод: Name: Bob, Age: 25
🚩Основные функции
🟠Инициализация атрибутов
Инициализирует атрибуты объекта начальными значениями.
🟠Выполнение необходимой логики
Может выполнять любые действия, необходимые при создании объекта (например, проверка входных данных).
🟠Управление ресурсами
Может выполнять действия по управлению ресурсами, такие как открытие файлов или подключение к базе данных.
🚩Перегрузка
Перегрузка конструктора не поддерживается напрямую, но можно использовать аргументы по умолчанию или конструкцию args и kwargs для имитации перегрузки.
#include <iostream>
using namespace std;
class Person {
public:
string name;
int age;
// Конструктор по умолчанию
Person() {
name = "Unknown";
age = 0;
}
// Конструктор с параметрами
Person(string n, int a) {
name = n;
age = a;
}
void display() {
cout << "Name: " << name << ", Age: " << age << endl;
}
};
int main() {
Person person1;
person1.display(); // Вывод: Name: Unknown, Age: 0
Person person2("Alice", 30);
person2.display(); // Вывод: Name: Alice, Age: 30
return 0;
}
Ставь 👍 и забирай 📚 Базу знанийclass A:
pass
class B(A):
pass
class C(A):
pass
class D(B, C):
pass
🚩Как определяется
Python использует C3-линеаризацию для определения порядка разрешения методов. Этот алгоритм соблюдает порядок наследования классов, учитывая при этом принципы монотонности и консистентности.
class A:
def method(self):
print("A")
class B(A):
def method(self):
print("B")
class C(A):
def method(self):
print("C")
class D(B, C):
pass
d = D()
d.method() # Вывод: B
Ставь 👍 и забирай 📚 Базу знанийclass A:
def method(self):
print("Method from class A")
class B:
def method(self):
print("Method from class B")
class C(A, B):
pass
c = C()
c.method() # Вывод: Method from class A (MRO выбрал метод из класса A)
🚩Решение проблем наследования
🟠Композиция вместо наследования
Предлагает включение объектов других классов в качестве членов, предоставляя больше гибкости и меньшую связанность по сравнению с наследованием.
class Engine:
def start(self):
print("Engine started")
class Car:
def __init__(self):
self.engine = Engine()
def start(self):
self.engine.start()
print("Car started")
car = Car()
car.start()
🟠Использование интерфейсов и абстрактных классов
Могут помочь определить строгие контракты для классов-наследников без предоставления реализации.
🟠Миксины
Это классы, которые предназначены для предоставления дополнительной функциональности через множественное наследование, но они не предназначены для инстанцирования напрямую.
Ставь 👍 и забирай 📚 Базу знаний__enter__ и exit являются частью протокола менеджера контекста. Они позволяют объектам определять поведение в контексте оператора with. Эти методы обеспечивают безопасное и автоматическое управление ресурсами, такими как файлы, сетевые соединения и другие объекты, которые требуют явного открытия и закрытия.
🚩Протокол менеджера контекста
🟠__enter__(self)
Выполняется в начале блока with и возвращает объект, который будет присвоен переменной, указанной после as.
🟠__exit__(self, exc_type, exc_value, traceback)
Выполняется в конце блока with, независимо от того, произошло исключение или нет. Он используется для очистки и освобождения ресурсов.
class ManagedResource:
def __enter__(self):
print("Entering the context")
return self
def __exit__(self, exc_type, exc_value, traceback):
print("Exiting the context")
if exc_type:
print(f"Exception type: {exc_type}")
print(f"Exception value: {exc_value}")
print(f"Traceback: {traceback}")
return True # True указывает на то, что исключение было обработано
# Использование
with ManagedResource() as resource:
print("Inside the context")
print("Outside the context")
Пример управления файлом с использованием менеджера контекста
class FileManager:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
def __enter__(self):
self.file = open(self.filename, self.mode)
return self.file
def __exit__(self, exc_type, exc_value, traceback):
self.file.close()
if exc_type:
print(f"Exception type: {exc_type}")
print(f"Exception value: {exc_value}")
print(f"Traceback: {traceback}")
return True
# Использование
with FileManager("example.txt", "w") as f:
f.write("Hello, World!")
print("File operation completed")
Ставь 👍 и забирай 📚 Базу знанийobj[key]).
class CustomList:
def __init__(self, items):
self.items = items
def __getitem__(self, index):
return self.items[index]
# Использование
my_list = CustomList([1, 2, 3, 4, 5])
print(my_list[2]) # Вывод: 3
🚩Метод titem и delit
Используется для установки значения элемента по индексу или ключу. Он вызывается, когда используется оператор присваивания с индексированием (obj[key] = value).
class CustomList:
def __init__(self, items):
self.items = items
def __setitem__(self, index, value):
self.items[index] = value
# Использование
my_list = CustomList([1, 2, 3, 4, 5])
my_list[2] = 10
print(my_list.items) # Вывод: [1, 2, 10, 4, 5]
🚩Метод delitem
Используется для удаления элемента по индексу или ключу. Он вызывается, когда используется оператор удаления с индексированием (del obj[key]).
class CustomList:
def __init__(self, items):
self.items = items
def __delitem__(self, index):
del self.items[index]
# Использование
my_list = CustomList([1, 2, 3, 4, 5])
del my_list[2]
print(my_list.items) # Вывод: [1, 2, 4, 5]
Полный пример пользовательского класса
class CustomDict:
def __init__(self):
self.items = {}
def __getitem__(self, key):
return self.items[key]
def __setitem__(self, key, value):
self.items[key] = value
def __delitem__(self, key):
del self.items[key]
def __repr__(self):
return f"{self.items}"
# Использование
my_dict = CustomDict()
my_dict['a'] = 1
my_dict['b'] = 2
print(my_dict['a']) # Вывод: 1
print(my_dict) # Вывод: {'a': 1, 'b': 2}
del my_dict['a']
print(my_dict) # Вывод: {'b': 2}
Ставь 👍 и забирай 📚 Базу знанийtyp), который для JWT равен "JWT".
Алгоритм подписи (alg), например, HMAC SHA256 или RSA.
{
"alg": "HS256",
"typ": "JWT"
}
🟠Payload (Полезная нагрузка)
Полезная нагрузка содержит набор заявок (claims). Заявки бывают трех типов: Registered claims (Зарегистрированные заявки): Зарезервированные ключи, такие как iss (issuer), exp (expiration time), sub (subject), и aud (audience).
Public claims (Публичные заявки): Пользовательские ключи, определенные в спецификации IANA JSON Web Token Registry или согласованные между сторонами.
Private claims (Частные заявки): Пользовательские ключи, уникальные для конкретного приложения.
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
🟠Signature (Подпись)
Подпись создается путем кодирования заголовка и полезной нагрузки с использованием Base64URL и их объединения. Затем применяется алгоритм, указанный в заголовке, к объединенной строке с использованием секретного ключа.
HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)
🚩Пример использования
1⃣Установка библиотеки
pip install pyjwt
2⃣Создание JWT
import jwt
import datetime
# Секретный ключ
secret_key = "your-256-bit-secret"
# Заголовок
header = {
"alg": "HS256",
"typ": "JWT"
}
# Полезная нагрузка
payload = {
"sub": "1234567890",
"name": "John Doe",
"admin": True,
"exp": datetime.datetime.utcnow() + datetime.timedelta(seconds=30) # Время истечения действия токена
}
# Создание JWT
token = jwt.encode(payload, secret_key, algorithm="HS256", headers=header)
print(token)
3⃣Декодирование JWT
import jwt
# Секретный ключ
secret_key = "your-256-bit-secret"
# Декодирование JWT
try:
decoded_payload = jwt.decode(token, secret_key, algorithms=["HS256"])
print(decoded_payload)
except jwt.ExpiredSignatureError:
print("Signature has expired")
except jwt.InvalidTokenError:
print("Invalid token")
Ставь 👍 и забирай 📚 Базу знаний
Уже доступно! Исследование Telegram 2025 — ключевые инсайты года 
