Python | Вопросы собесов
13.9K subscribers
35 photos
1 video
1 file
918 links
Cайт: easyoffer.ru
Реклама: @easyoffer_adv
ВП: @easyoffer_vp

Тесты t.me/+20tRfhrwPpM4NDQy
Задачи t.me/+nsl4meWmhfQwNDVi
Вакансии t.me/+cXGKkrOY2-w3ZTky
Download Telegram
🤔 Что такое деструктор класса?

Это специальный метод, который вызывается автоматически, когда объект класса уничтожается. В Python этот метод называется __del__(). Деструктор используется для выполнения операций очистки, таких как освобождение ресурсов или выполнение завершающих действий перед тем, как объект будет удален из памяти.

🚩Определение и использование деструктора

Определяется внутри класса с помощью метода __del__().
class FileManager:
def __init__(self, filename):
self.file = open(filename, 'w')
print(f"Файл {filename} открыт для записи.")

def write_data(self, data):
self.file.write(data)

def __del__(self):
self.file.close()
print("Файл закрыт.")


🟠Класс FileManager имеет конструктор __init__(), который открывает файл для записи.
🟠Метод write_data() записывает данные в файл.
🟠Деструктор __del__() закрывает файл, когда объект FileManager уничтожается.

🚩Создание и уничтожение объекта

Когда объект класса создается, вызывается конструктор. Когда объект больше не нужен, вызывается деструктор:
manager = FileManager('example.txt')
manager.write_data('Hello, world!')
# Когда объект manager больше не нужен, вызывается деструктор и файл закрывается


🚩Важные замечания

🟠Сборка мусора
Python использует механизм сборки мусора для автоматического управления памятью. Когда объект больше не используется (например, нет активных ссылок на него), сборщик мусора удаляет объект и вызывает его деструктор.

🟠Неопределенное время вызова
Точное время вызова деструктора зависит от работы сборщика мусора. Это означает, что нельзя гарантировать момент вызова деструктора. Поэтому для критических операций лучше использовать явное управление ресурсами, например, с помощью контекстных менеджеров (with).

🟠Контекстные менеджеры
Для явного управления ресурсами и их освобождения в предсказуемый момент лучше использовать контекстные менеджеры.
with open('example.txt', 'w') as file:
file.write('Hello, world!')
# Файл автоматически закрывается после выхода из блока with


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 Насколько сложен поиск по ключу в хеш-таблице?

В среднем — O(1), то есть поиск занимает постоянное время независимо от размера таблицы. В худшем случае (при коллизиях) — O(n), но хорошие хеш-функции и разрешение коллизий делают такие случаи редкими.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🤔 Что такое GET?

GET — это HTTP-метод, который используется для запроса данных с сервера.
Когда ты открываешь веб-сайт или вводишь URL в браузере — это GET-запрос. Браузер запрашивает страницу у сервера, и сервер возвращает данные.

🚩Как работает GET-запрос?

1⃣Клиент (браузер, программа) отправляет GET-запрос на сервер.
2⃣Сервер обрабатывает запрос и возвращает ответ (HTML-страницу, JSON-данные, картинку и т. д.).
3⃣Данные отображаются пользователю.

🚩Пример GET-запроса

Когда ты заходишь на https://example.com/users, браузер отправляет:
GET /users HTTP/1.1
Host: example.com


Ответ сервера
[
{"id": 1, "name": "Alice"},
{"id": 2, "name": "Bob"}
]


🚩Особенности GET-запроса

🟠Читаемый URL
параметры передаются в строке запроса (например, ?id=123).
🟠Безопасен
GET не изменяет данные на сервере.
🟠Можно кэшировать
браузеры и серверы могут сохранять результаты GET-запросов.
🟠Ограниченная длина URL
слишком длинные запросы могут не работать.
🟠Не подходит для конфиденциальных данных
передача пароля в URL (?password=123) небезопасна.

🚩GET-запрос с параметрами

Если нужно передать параметры, они добавляются в URL:
GET /search?q=python&page=2


В Python можно отправить GET-запрос с помощью библиотеки requests
import requests

response = requests.get("https://api.example.com/users", params={"id": 123})
print(response.json()) # Получаем ответ в JSON


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11💊1
🤔 Как клиенту понять, удался запрос или нет?

Клиент узнаёт результат запроса по HTTP-статус-коду, который возвращает сервер в ответе.
Например:
- 200 — успех;
- 201 — ресурс создан;
- 400 — ошибка клиента (например, неверные данные);
- 401/403 — проблемы с авторизацией или доступом;
- 404 — не найдено;
- 500 — внутренняя ошибка сервера.
Также клиент может анализировать тело ответа, где обычно содержится описание результата или ошибки.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17💊6🔥2
🤔 Почему плохо хранить данные SQL в Docker контейнере?

Хранение данных базы данных (SQL) внутри Docker-контейнера не рекомендуется, потому что контейнеры являются временными и одноразовыми. При удалении или пересоздании контейнера все данные внутри него теряются.

🚩Данные удаляются при удалении контейнера
Контейнеры в Docker спроектированы так, чтобы их можно было легко пересоздавать. Если удалить контейнер (docker rm), все данные, хранящиеся внутри него, исчезнут навсегда.
docker run --name mydb -e MYSQL_ROOT_PASSWORD=secret -d mysql
docker stop mydb
docker rm mydb # Удаляем контейнер – все данные пропали!


🚩Проблемы с обновлением и масштабированием

Если база данных хранится внутри контейнера, обновить версию MySQL/PostgreSQL будет сложно. При пересоздании контейнера все данные потеряются, и их придется восстанавливать из резервной копии.

🚩Низкая производительность I/O

Хранение данных внутри контейнера может снизить скорость работы базы, потому что Docker использует копию на запись (Copy-on-Write, CoW).
Решение — использовать прямые тома (volumes) или монтировать каталог хоста.
docker run --name mydb -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=secret -d mysql


🚩Проблемы с резервным копированием

Если база находится внутри контейнера, то сделать бэкап или восстановить данные сложно.
Лучшее решение: использовать volumes + делать бэкапы через mysqldump или pg_dump.
docker exec mydb mysqldump -u root -psecret mydatabase > backup.sql


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🤔1
🤔 Какие есть списковые генераторы?

Списковые генераторы (list comprehensions) — это выражения, создающие списки в одной строке:
1. Простой генератор:
2. С фильтрацией:
3. С вложенными циклами:
Генераторы — мощный инструмент для компактной обработки коллекций.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2
🤔 Для чего могут применять конструкцию try finally без except?

Конструкция try...finally используется в случаях, когда нужно гарантировать выполнение кода в finally, независимо от того, возникло исключение или нет.

🟠Закрытие файла
Если файл открыт, его нужно закрыть в любом случае, даже если в процессе работы произойдёт ошибка.
try:
file = open("data.txt", "r")
data = file.read()
finally:
print("Закрываем файл...")
file.close() # Файл закроется даже при ошибке


🟠Освобождение ресурсов (например, соединение с базой данных)
Если программа работает с базой данных, соединение нужно закрыть, даже если произошла ошибка.
import sqlite3

conn = sqlite3.connect("database.db")

try:
cursor = conn.cursor()
cursor.execute("SELECT * FROM users") # Ошибка, если таблицы нет
finally:
print("Закрываем соединение с БД...")
conn.close() # Закроет соединение в любом случае


🟠Разблокировка ресурсов (например, файл или поток)
Допустим, есть блокировка файла, которую нужно снять в любом случае.
import threading

lock = threading.Lock()

try:
lock.acquire()
print("Ресурс заблокирован")
# Код, который использует ресурс
finally:
print("Разблокируем ресурс")
lock.release() # Освободит блокировку даже при ошибке


Пример 4: Остановка таймера, даже если произошла ошибка
import time

try:
start_time = time.time()
x = 1 / 0 # Ошибка деления на ноль
finally:
elapsed_time = time.time() - start_time
print(f"Программа выполнялась {elapsed_time:.2f} секунд")


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Как устроен словарь?

Словарь (dict) реализован как хеш-таблица. Ключи хешируются с помощью hash() и связываются с соответствующим значением.
Доступ к элементам происходит быстро (в среднем за O(1)).
Ключи должны быть хешируемыми (обычно неизменяемыми типами).
С Python 3.7+ порядок вставки элементов сохраняется.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥3
🤔 Какие есть коды ошибок HTTP?

В HTTP коды состояния указывают, как сервер обработал запрос. Они делятся на 5 категорий:
1xx (Информационные – запрос принят, продолжаем.
2xx (Успешные) – всё хорошо.
3xx (Перенаправления) – запрашиваемый ресурс перемещён.
4xx (Ошибки клиента) – клиент отправил неправильный запрос.
5xx (Ошибки сервера) – сервер не смог обработать запрос.


🚩Как исправить ошибки HTTP?

4xx:
400: Проверить формат запроса.
401: Убедиться, что пользователь авторизован.
403: Проверить права доступа.
404: Убедиться, что URL правильный.
5xx:
500: Проверить код сервера (ошибки в логах).
502/504: Проверить настройки Nginx/Proxy.
503: Сервер перегружен → добавить балансировку нагрузки.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊1
🤔 Чем отличаются операторы WHERE и HAVING в SQL?

- WHERE фильтрует строки до агрегации — применяется на этапе выборки.
- HAVING фильтрует группы после агрегации — работает с результатами GROUP BY.
Например, WHERE salary > 50000 фильтрует строки, а HAVING COUNT(*) > 3 фильтрует группы.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥1
🤔 Что такое циклы?

Циклы — это конструкции, которые позволяют многократно выполнять код, пока выполняется определённое условие.
В Python есть два типа циклов:

for — перебирает элементы последовательности (list, tuple, dict, range() и т. д.).
while — выполняется, пока условие True.

🚩Цикл `for` (перебор последовательностей)

Простой пример for
for i in range(5):
print(i)


Вывод
0
1
2
3
4


Перебор списка
names = ["Alice", "Bob", "Charlie"]
for name in names:
print(name)


Вывод
Alice
Bob
Charlie


Перебор словаря (dict)
user = {"name": "Alice", "age": 25}
for key, value in user.items():
print(f"{key}: {value}")


Вывод
name: Alice
age: 25


🚩Цикл `while` (работает, пока `True`)

Пример while
x = 0
while x < 5:
print(x)
x += 1


Вывод
0
1
2
3
4


*while с input() (бесконечный цикл)
while True:
command = input("Введите команду: ")
if command == "exit":
break # Выход из цикла
print(f"Вы ввели: {command}")


🚩3. Управление циклами (`break`, `continue`)

break — выход из цикла
for i in range(10):
if i == 5:
break # Прерывает цикл, если i == 5
print(i)


Вывод
0
1
2
3
4


continue — пропуск итерации
for i in range(5):
if i == 2:
continue # Пропускаем 2
print(i)


Вывод
0
1
3
4


🚩`else` в циклах (`for` / `while`)

else выполняется, если цикл завершился без break
for i in range(5):
print(i)
else:
print("Цикл завершён!")


Вывод
0
1
2
3
4
Цикл завершён!


Но если сработает break, else не выполняется
for i in range(5):
if i == 3:
break
print(i)
else:
print("Цикл завершён!") # Не выполнится!


Вывод
0
1
2


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥3
🤔 Какая сложность у пузырьковой сортировки?

В худшем и среднем случае — O(n²), так как для каждого элемента выполняется сравнение и возможно перемещение. Даже в лучшем случае (уже отсортированный массив) — O(n), если реализована оптимизация с флагом.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
🤔 Как устроен протокол HTTP?

HTTP (HyperText Transfer Protocol) — это протокол передачи данных, используемый для взаимодействия между клиентом (например, браузером) и сервером. Он является основой работы веба. Протокол устроен как текстовый, клиент-серверный и бесстатичный.

🚩Основные принципы HTTP

🟠Клиент-серверная архитектура
Клиент (например, браузер) отправляет запросы серверу, сервер отвечает на них.

🟠Бесстатичность
Каждый запрос независим от других. Сервер не сохраняет состояние клиента между запросами. Для сохранения состояния используются сессии, куки или токены.

🟠Текстовый протокол
HTTP-запросы и ответы передаются в виде текста, что делает их легко читаемыми.

🚩Структура HTTP-запроса

🟠Стартовая строка
Указывает метод, URL и версию протокола.

   GET /index.html HTTP/1.1

  

🟠Заголовки (headers)
Дополнительная информация о запросе.

   Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html

  

🟠Тело запроса (body)
Используется в некоторых методах (например, POST), чтобы передать данные на сервер.

   name=John&age=30

  

🚩
Структура HTTP-ответа

🟠Стартовая строка
Указывает версию протокола, код состояния и текстовое описание.

   HTTP/1.1 200 OK

  

🟠Заголовки (headers)
Дополнительные данные, например, тип содержимого.

   Content-Type: text/html
Content-Length: 348

  

🟠Тело ответа (body)
Содержит данные, которые сервер отправляет клиенту (например, HTML-страница).

   <html>
<body>Hello, world!</body>
</html>



🚩Основные HTTP-методы
🟠GET
Запрашивает данные с сервера. Данные передаются в URL.
🟠POST
Отправляет данные на сервер (например, формы).
🟠PUT
Обновляет данные на сервере или создаёт, если они отсутствуют.
🟠DELETE
Удаляет данные на сервере.
🟠HEAD
Аналог GET, но возвращает только заголовки без тела ответа.
🟠OPTIONS
Возвращает информацию о поддерживаемых методах для ресурса.
🟠PATCH
Частичное обновление ресурса.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🤔 Как работает Serializer в Django REST Framework?

Это класс, который конвертирует данные между JSON и объектами Django. Он выполняет:
1. Преобразование модели Django в JSON (
serializer.data)
2. Проверку и десериализацию входных данных (serializer.is_valid())
3. Сохранение объекта в базу данных (
serializer.save())

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8
🤔 Какая сложность у пузырьковой сортировки?

Пузырьковая сортировка (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]


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
🤔 Какие объекты можно положить в множество?

Во множество можно положить только хешируемые (неизменяемые) объекты, например: числа, строки, кортежи. Изменяемые объекты, как списки или словари, туда положить нельзя, так как их хеш может измениться во время жизни объекта.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥2💊2
🤔 Для чего можно использовать celery?

Celery - это очередь задач (task queue), которая позволяет выполнять задачи асинхронно и распределять их между различными рабочими процессами или узлами. Она обычно используется для выполнения долгих и трудоемких операций в фоновом режиме, таких как обработка задач веб-приложений, отправка электронных писем, генерация отчетов, обработка изображений, а также многие другие.

🚩Вот некоторые типичные сценарии использования Celery:

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

🟠Отправка электронных писем
Может использоваться для отправки электронных писем асинхронно. Это позволяет вашему приложению отправлять уведомления и письма пользователям без блокировки основного потока выполнения.

🟠Обработка изображений
Может использоваться для обработки изображений асинхронно. Например, вы можете использовать его для изменения размера изображений, преобразования форматов или применения фильтров без задержки ответа вашего приложения.

🟠Периодические задачи
Поддерживает периодические задачи, которые могут выполняться автоматически по расписанию. Это позволяет вам запускать задачи на основе времени, что особенно полезно для выполнения регулярных обновлений и обслуживания.

🟠Распределенные вычисления
Позволяет распределенно выполнять задачи на различных узлах или рабочих процессах, что позволяет обрабатывать большие объемы данных и операций параллельно.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Какие функции есть в модуле itertools?

Модуль предоставляет мощные итераторы:
- count, cycle, repeat — бесконечные генераторы.
- chain, zip_longest, product, permutations, combinations — для работы с последовательностями.
- groupby — группировка по ключу.
- islice, tee, filterfalse — фильтрация и дублирование.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
🤔 Как происходит наследование моделей в Django?

В Django можно наследовать модели, используя стандартное наследование классов. Это помогает повторно использовать код, организовывать данные и добавлять общие поля в несколько моделей. Django поддерживает три основных типа наследования:

🟠Абстрактные модели
Абстрактные модели используются, когда нужно создать базовый класс с полями и методами, которые должны быть унаследованы, но сам класс не должен создавать таблицу в базе данных.
Создается базовый класс с abstract = True в Meta.
Дочерние классы наследуют его поля и методы, но не его саму в виде отдельной таблицы.
from django.db import models

class BaseModel(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

class Meta:
abstract = True # Указывает, что это абстрактная модель

class Post(BaseModel):
title = models.CharField(max_length=255)
content = models.TextField()

class Comment(BaseModel):
text = models.TextField()


🟠Многоуровневое (конкретное) наследование
Этот тип наследования создаёт отдельные таблицы для каждой модели. Используется, когда дочерний класс должен представлять отдельную сущность, но при этом иметь доступ к полям родительского класса.
Django создаёт отдельные таблицы в БД для родительской и дочерней модели.
Дочерняя модель автоматически получает OneToOneField на родительскую.
class Person(models.Model):
name = models.CharField(max_length=255)

class Employee(Person): # Отдельная таблица employee
salary = models.DecimalField(max_digits=10, decimal_places=2)


🟠Прокси-модели (Proxy Models)
Используются, когда нужно изменить поведение модели без изменения структуры базы данных.
Прокси-модель наследует поля родительской модели.
В Meta указывается proxy = True.
Можно переопределять методы, добавлять новые, но не менять поля.
class Person(models.Model):
name = models.CharField(max_length=255)

class Manager(Person):
class Meta:
proxy = True # Указываем, что это прокси-модель

def get_uppercase_name(self):
return self.name.upper()


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Зачем нужен Docker Registry?

Docker Registry — это хранилище, где хранятся собранные образы. Оно позволяет:
- делиться образами между разработчиками и серверами;
- управлять версиями;
- автоматизировать развертывания.
Примеры: Docker Hub, GitLab Container Registry, Harbor.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5