Python | Вопросы собесов
13.8K subscribers
34 photos
1 file
948 links
Download Telegram
🤔 Почему поиск по ключам в словаре работает быстро?

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


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

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

🚩Подробный разбор обработки HTTP-запроса в Django

🟠Запрос приходит в WSGI/ASGI сервер
Когда клиент (браузер, API) отправляет запрос, его принимает WSGI/ASGI-сервер (Gunicorn, Daphne).
Если проект синхронный → работает через WSGI (wsgi.py).
Если проект асинхронный → через ASGI (asgi.py).
GET /hello/ HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0


🟠Django создаёт `HttpRequest` объект
Django превращает HTTP-запрос в объект HttpRequest, который передаётся в view.
def my_view(request):
print(request.iss.onethod) # 'GET'
print(request.path) # '/hello/'
print(request.GET) # {'name': 'Alice'}


🟠Middleware (промежуточная обработка)
Прежде чем запрос дойдёт до view, Django проходит через мидлвари, которые могут:
Проверять авторизацию (AuthenticationMiddleware).
Защищать от CSRF (CsrfViewMiddleware).
Перенаправлять запросы (CommonMiddleware).
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
]


🟠Поиск `view` в `urls.py`
Django ищет, какая функция (view) должна обработать этот URL.
from django.urls import path
from myapp.views import hello_view

urlpatterns = [
path("hello/", hello_view), # Запрос "/hello/" попадёт в hello_view
]


🟠Выполнение `view` (контроллера)
Когда Django находит подходящее представление (view), оно вызывается.
from django.http import HttpResponse

def hello_view(request):
return HttpResponse("Привет, мир!")


🟠Формирование и обработка ответа
Django берёт HttpResponse и передаёт его обратно через middleware (например, сжатие, защита, заголовки безопасности).
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 12

Привет, мир!


🟠WSGI/ASGI сервер отправляет ответ клиенту
На последнем этапе WSGI/ASGI-сервер отправляет ответ обратно браузеру или API-клиенту.


🚩Краткая схема обработки запроса

Клиент (браузер) → WSGI/ASGI → Django Middleware → URL Dispatcher → View → Response → Клиент


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🤔1
🤔 Чем отличается асинхронный контекстный менеджер от синхронного?

Асинхронный контекстный менеджер (async with) работает с асинхронными ресурсами: подключениями, файлами и т.д. Он должен реализовывать методы aenter и aexit. В отличие от синхронного (with), он не блокирует event loop и позволяет выполнять I/O без задержек.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥3
🤔 За счет чего асинхронность работает быстрее?

Асинхронность в Python позволяет не блокировать выполнение программы во время ожидания операций ввода-вывода (I/O). Это делает её намного быстрее в задачах, где программа тратит много времени на ожидание (например, загрузка файлов, работа с сетью, запросы к базам данных).

🟠Как работает синхронный код (медленный вариант)
В обычном (синхронном) коде каждая операция ждёт завершения предыдущей.
import requests
import time

start = time.time()

def fetch(url):
response = requests.get(url) # Ждём ответа от сервера
return response.text

urls = ["https://example.com"] * 3

for url in urls:
fetch(url) # Ждём каждый запрос

print("Время выполнения:", time.time() - start)


🟠Как работает асинхронный код (быстрее!)
Асинхронность в Python использует event loop (цикл событий), который позволяет не ждать выполнения операции, а переключаться на другие задачи.
import asyncio
import aiohttp
import time

start = time.time()

async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()

async def main():
urls = ["https://example.com"] * 3
tasks = [fetch(url) for url in urls]
await asyncio.gather(*tasks) # Запускаем все запросы одновременно

asyncio.run(main())

print("Время выполнения:", time.time() - start)


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

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


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

Чтобы реализовать метод __new__ для создания класса по шаблону Singleton, нужно следовать принципам, которые обеспечивают создание только одного экземпляра класса. Метод new отвечает за создание нового экземпляра класса, и его можно использовать для контроля этого процесса. Ниже приведен пример реализации Singleton с использованием метода new.
class Singleton:
_instance = None

def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super(Singleton, cls).__new__(cls, args, kwargs)
return cls._instance

def __init__(self, value):
if not hasattr(self, 'initialized'):
self.value = value
self.initialized = True

# Проверка работы Singleton
singleton1 = Singleton(10)
singleton2 = Singleton(20)

print(singleton1 is singleton2) # Выведет: True
print(singleton1.value) # Выведет: 10
print(singleton2.value) # Выведет: 10


🚩Объяснение кода

Атрибут _instance
cls._instance используется для хранения единственного экземпляра класса.
Метод
e):      


🚩Метод init

Метод init выполняет инициализацию экземпляра.
Чтобы избежать повторной инициализации, проверяется наличие атрибута initialized. Если он не существует, происходит инициализация атрибутов и устанавливается initialized = True.

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

Docker кеширует слои, созданные каждой инструкцией Dockerfile. При повторной сборке, если инструкция и её контекст не изменились, Docker использует сохранённый слой из кеша. Это ускоряет сборку и снижает нагрузку на ресурсы.


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