Python | Вопросы собесов
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads
Показати більше📈 Аналітичний огляд Telegram-каналу Python | Вопросы собесов
Канал Python | Вопросы собесов (@python_easy_ru) у мовному сегменті Російська є активним учасником. На даний момент спільнота об'єднує 12 637 підписників, посідаючи 9 918 місце в категорії Технології та додатки та 51 142 місце у регіоні Росія.
📊 Показники аудиторії та динаміка
З моменту свого створення невідомо, проект продемонстрував стрімке зростання, зібравши аудиторію у 12 637 підписників.
За останніми даними від 14 жовтня, 2026, канал демонструє стабільну активність. Хоча за останні 30 днів спостерігається зміна кількості учасників на -107, а за останні 24 години на 0, загальне охоплення залишається високим.
- Статус верифікації: Не верифікований
- Рівень залученості (ER): Середній показник залученості аудиторії становить 6.11%. Протягом перших 24 годин після публікації контент зазвичай збирає 4.23% реакцій від загальної кількості підписників.
- Охоплення публікацій: В середньому кожен допис отримує 772 переглядів. Протягом першої доби публікація в середньому набирає 534 переглядів.
- Реакції та взаємодія: Аудиторія активно підтримує контент: середня кількість реакцій на один пост – 3.
- Тематичні інтереси: Контент зосереджений навколо ключових тем, таких як ставь, модуль, строка, docker, alice.
📝 Опис та контентна політика
Автор описує ресурс як майданчик для висловлення суб'єктивної думки:
“Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy
Контакт для рекламы: @sendme_ads”
Завдяки високій частоті оновлень (останні дані отримано 15 жовтня, 2026), канал підтримує актуальність та високий рівень охоплення публікацій. Аналітика показує, що аудиторія активно взаємодіє з контентом, що робить його важливою точкою впливу в категорії Технології та додатки.
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")
Ставь 👍 и забирай 📚 Базу знаний__call__ является специальным методом, который позволяет экземплярам классов вести себя как функции. Если объект класса имеет данный метод, то этот объект можно вызывать, как если бы он был функцией. Это может быть полезно для создания объектов, которые действуют как замыкания, для реализации паттернов проектирования и других сценариев, требующих функциональности.
🚩Основное предназначение
Позволяет объекту вести себя как функция. Он вызывается, когда экземпляр класса вызывается как функция.
class Counter:
def __init__(self):
self.count = 0
def __call__(self):
self.count += 1
return self.count
# Использование
counter = Counter()
print(counter()) # Вывод: 1
print(counter()) # Вывод: 2
print(counter()) # Вывод: 3
🚩Применение метода
🟠Функциональные объекты
Позволяет создавать объекты, которые можно вызывать как функции, что полезно для создания замыканий и функций высшего порядка.
🟠Кеширование
Используется для реализации механизмов кеширования в классах, когда результат вычисления может быть закеширован и повторно использован.
🟠Паттерны проектирования: Полезен для реализации различных паттернов проектирования, таких как синглтон, декоратор и фабрика.
class Multiplier:
def __init__(self, factor):
self.factor = factor
def __call__(self, value):
return value * self.factor
# Использование
double = Multiplier(2)
triple = Multiplier(3)
print(double(5)) # Вывод: 10
print(triple(5)) # Вывод: 15
Пример кеширования
class CachedFibonacci:
def __init__(self):
self.cache = {}
def __call__(self, n):
if n in self.cache:
return self.cache[n]
if n <= 1:
return n
self.cache[n] = self(n - 1) + self(n - 2)
return self.cache[n]
# Использование
fibonacci = CachedFibonacci()
print(fibonacci(10)) # Вывод: 55
print(fibonacci(15)) # Вывод: 610
Ставь 👍 и забирай 📚 Базу знанийimport socket
# Создание TCP-сокета
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Привязка сокета к адресу и порту
server_socket.bind(('localhost', 12345))
# Ожидание входящих соединений
server_socket.listen()
print('Сервер ожидает соединения...')
while True:
# Принятие нового соединения
client_socket, client_address = server_socket.accept()
print(f'Подключение от {client_address}')
# Получение данных от клиента
data = client_socket.recv(1024).decode()
print(f'Получено: {data}')
# Отправка ответа клиенту
client_socket.sendall('Hello, Client!'.encode())
# Закрытие соединения
client_socket.close()
Клиент
import socket
# Создание TCP-сокета
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Подключение к серверу
client_socket.connect(('localhost', 12345))
# Отправка данных серверу
client_socket.sendall('Hello, Server!'.encode())
# Получение ответа от сервера
data = client_socket.recv(1024).decode()
print(f'Получено: {data}')
# Закрытие соединения
client_socket.close()
UDP-сокеты
Сервер
import socket
# Создание UDP-сокета
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# Привязка сокета к адресу и порту
server_socket.bind(('localhost', 12345))
print('UDP сервер ожидает сообщений...')
while True:
# Получение данных от клиента
data, client_address = server_socket.recvfrom(1024)
print(f'Получено от {client_address}: {data.decode()}')
# Отправка ответа клиенту
server_socket.sendto('Hello, Client!'.encode(), client_address)
Клиент
import socket
# Создание UDP-сокета
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# Отправка данных серверу
client_socket.sendto('Hello, Server!'.encode(), ('localhost', 12345))
# Получение ответа от сервера
data, server_address = client_socket.recvfrom(1024)
print(f'Получено: {data.decode()}')
# Закрытие сокета
client_socket.close()
🚩Плюсы и минусы
➕Гибкость
Сокеты предоставляют низкоуровневый доступ к сетевым операциям, позволяя разрабатывать различные сетевые протоколы.
➕Надежность (TCP)
Обеспечивают надежную передачу данных с управлением потоком и проверкой целостности.
➕Простота (UDP)
Позволяют быстро передавать данные с минимальной задержкой.
➖Сложность реализации
Работа с сокетами требует понимания сетевых протоколов и управления соединениями.
➖Отсутствие гарантий доставки (UDP)
Данные могут теряться или приходить в неправильном порядке.
Ставь 👍 и забирай 📚 Базу знанийdjango.contrib.auth.models.User. Эта модель включает в себя все основные поля и методы для работы с пользователями.
from django.contrib.auth.models import User
# Создание нового пользователя
user = User.objects.create_user(username='john', password='password123')
# Аутентификация пользователя
from django.contrib.auth import authenticate, login
user = authenticate(username='john', password='password123')
if user is not None:
login(request, user)
🚩Расширение стандартной модели пользователя с помощью `UserProfile`
1⃣Создание модели профиля пользователя
from django.db import models
from django.contrib.auth.models import User
class UserProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
bio = models.TextField(blank=True)
birth_date = models.DateField(null=True, blank=True)
# Сигналы для автоматического создания и сохранения профиля пользователя
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.userprofile.save()
2⃣Использование профиля пользователя
# Получение и изменение профиля пользователя
user = User.objects.get(username='john')
profile = user.userprofile
profile.bio = "Hello, I'm John!"
profile.save()
3⃣Замена стандартной модели пользователя кастомной моделью (`CustomUser`)
Если необходимо полностью изменить модель пользователя, можно создать кастомную модель пользователя и указать Django использовать её вместо стандартной.
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models
class CustomUserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
if not email:
raise ValueError('The Email field must be set')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, password=None, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
return self.create_user(email, password, **extra_fields)
class CustomUser(AbstractBaseUser):
email = models.EmailField(unique=True)
first_name = models.CharField(max_length=30, blank=True)
last_name = models.CharField(max_length=30, blank=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
objects = CustomUserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['first_name', 'last_name']
def __str__(self):
return self.email
Ставь 👍 и забирай 📚 Базу знанийIntegerChoices в Django используется для создания выбора из ограниченного набора целочисленных значений для поля модели. Это полезно, когда вам нужно ограничить допустимые значения для поля модели определенными целыми числами, и при этом иметь удобные человекочитаемые названия для этих значений.
🚩Основные плюсы
➕Читаемость кода
Значения выбора имеют человекочитаемые названия, что делает код более понятным.
➕Поддержка валидации
Django автоматически проверяет, что значение поля соответствует одному из допустимых значений.
➕Удобство использования в админке
В Django admin интерфейсе выпадающий список с человекочитаемыми названиями делает работу с данными удобнее.
🚩Пример использования
1⃣Создание класса IntegerChoices
from django.db import models
class Status(models.IntegerChoices):
PENDING = 1, 'Pending'
APPROVED = 2, 'Approved'
REJECTED = 3, 'Rejected'
2⃣Использование IntegerChoices в модели
from django.db import models
class Application(models.Model):
status = models.IntegerField(choices=Status.choices, default=Status.PENDING)
name = models.CharField(max_length=100)
submitted_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.name} - {self.get_status_display()}"
3⃣Пример работы с моделью
# Создание новой записи
app = Application.objects.create(name='John Doe')
# Проверка статуса
print(app.status) # 1
print(app.get_status_display()) # 'Pending'
# Изменение статуса
app.status = Status.APPROVED
app.save()
# Проверка обновленного статуса
print(app.status) # 2
print(app.get_status_display()) # 'Approved'
🚩Дополнительные методы и атрибуты
Вы можете добавлять дополнительные методы и атрибуты в класс выбора для расширенной функциональности.
from django.db import models
class Status(models.IntegerChoices):
PENDING = 1, 'Pending'
APPROVED = 2, 'Approved'
REJECTED = 3, 'Rejected'
@classmethod
def get_choices(cls):
return [(choice.value, choice.label) for choice in cls]
# Пример использования
print(Status.get_choices()) # [(1, 'Pending'), (2, 'Approved'), (3, 'Rejected')]
Использование в фильтрах и запросах
# Фильтрация записей по статусу
pending_apps = Application.objects.filter(status=Status.PENDING)
for app in pending_apps:
print(app.name)
# Фильтрация записей по множеству статусов
approved_or_rejected_apps = Application.objects.filter(status__in=[Status.APPROVED, Status.REJECTED])
for app in approved_or_rejected_apps:
print(app.name)
Ставь 👍 и забирай 📚 Базу знаний{}. Ключи должны быть строками, а значения могут быть различными типами данных.
🟠Массивы
Упорядоченные списки значений, заключенные в квадратные скобки [].
{
"name": "John Doe",
"age": 30,
"isStudent": false,
"courses": ["Math", "Science", "History"],
"address": {
"street": "123 Main St",
"city": "Anytown",
"zip": "12345"
}
}
🚩Типы данных
🟠Строки
Последовательности символов, заключенные в двойные кавычки.
"name": "John Doe"
🟠Числа
Целые числа и числа с плавающей запятой.
"age": 30
🟠Булевы значения
true или false.
"isStudent": false
🟠Массивы
Упорядоченные списки значений.
"courses": ["Math", "Science", "History"]
🟠Объекты
Наборы пар "ключ-значение".
"address": {
"street": "123 Main St",
"city": "Anytown",
"zip": "12345"
}
🟠Null
Значение null.
"middleName": null
Преобразование Python объектов в JSON (сериализация)
import json
data = {
"name": "John Doe",
"age": 30,
"isStudent": False,
"courses": ["Math", "Science", "History"],
"address": {
"street": "123 Main St",
"city": "Anytown",
"zip": "12345"
}
}
# Преобразование Python объекта в JSON строку
json_string = json.dumps(data, indent=4)
print(json_string)
Преобразование JSON в Python объекты (десериализация)
import json
json_string = '''
{
"name": "John Doe",
"age": 30,
"isStudent": false,
"courses": ["Math", "Science", "History"],
"address": {
"street": "123 Main St",
"city": "Anytown",
"zip": "12345"
}
}
'''
# Преобразование JSON строки в Python объект
data = json.loads(json_string)
print(data)
print(data['name']) # John Doe
🚩Пример чтения и записи JSON в файл
Запись JSON в файл
import json
data = {
"name": "John Doe",
"age": 30,
"isStudent": False,
"courses": ["Math", "Science", "History"],
"address": {
"street": "123 Main St",
"city": "Anytown",
"zip": "12345"
}
}
with open('data.json', 'w') as file:
json.dump(data, file, indent=4)
Чтение JSON из файла
import json
with open('data.json', 'r') as file:
data = json.load(file)
print(data)
print(data['name']) # John Doe
Ставь 👍 и забирай 📚 Базу знаний