Python | Вопросы собесов
13.1K subscribers
38 photos
5 videos
1 file
1.42K links
Cайт: easyoffer.ru
Реклама: @easyoffer_adv
ВП: @easyoffer_vp

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

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

🚩Публичные методы и атрибуты


Доступны из любого места, как внутри класса, так и за его пределами. Их имена не начинаются с подчеркиваний.
class MyClass:
def __init__(self):
self.public_attribute = "I am public"

def public_method(self):
return "This is a public method"

obj = MyClass()
print(obj.public_attribute) # Вывод: I am public
print(obj.public_method()) # Вывод: This is a public method


🚩Защищенные методы и атрибуты

Не предназначены для использования за пределами класса и его подклассов. Они обозначаются одним подчеркиванием в начале имени. Это всего лишь соглашение, сигнализирующее другим разработчикам, что такие методы и атрибуты не следует использовать вне класса или его подклассов.
class MyClass:
def __init__(self):
self._protected_attribute = "I am protected"

def _protected_method(self):
return "This is a protected method"

class SubClass(MyClass):
def access_protected(self):
return self._protected_method()

obj = MyClass()
sub_obj = SubClass()

print(sub_obj.access_protected()) # Вывод: This is a protected method


🚩Приватные методы и атрибуты

Скрыты от внешнего доступа и доступны только внутри самого класса. Они обозначаются двумя подчеркиваниями в начале имени. Python реализует это с помощью механизма именования, который изменяет имя метода или атрибута, добавляя к нему имя класса, чтобы затруднить доступ извне.
class MyClass:
def __init__(self):
self.__private_attribute = "I am private"

def __private_method(self):
return "This is a private method"

def access_private(self):
return self.__private_method()

obj = MyClass()

try:
print(obj.__private_attribute)
except AttributeError as e:
print(e) # Вывод: 'MyClass' object has no attribute '__private_attribute'

try:
print(obj.__private_method())
except AttributeError as e:
print(e) # Вывод: 'MyClass' object has no attribute '__private_method'

# Доступ к приватным методам через публичный метод класса
print(obj.access_private()) # Вывод: This is a private method


Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Как создать свой тип исключения?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2🔥2
🤔 Объясни как происходит обработка 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.method) # '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 → Клиент


Ставь 👍 и забирай 📚 Базу знаний
👍5
🤔 Разница между итератором, итерируемым объектом и генератором?

Итерируемый объект реализует только iter() и может создавать итераторы. Итератор реализует next() и возвращает значения по одному. Генератор — это частный случай итератора, созданный с помощью yield.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍3
🤔 Что такое моржовый оператор?

Моржовый оператор (:=) – это новый оператор, появившийся в Python 3.8, который позволяет присваивать значение переменной прямо внутри выражения.

🚩Как он работает?

Обычно мы записываем код так:
value = len(my_list)  # Сначала присваиваем
if value > 10: # Потом используем
print("Список большой")


С := можно совместить оба действия
if (value := len(my_list)) > 10:
print("Список большой")


🚩Где использовать?

В циклах (избегаем лишних вычислений). Вместо:
data = input("Введите строку: ")
while data != "exit":
print("Вы ввели:", data)
data = input("Введите строку: ")


С := можно записать короче:
while (data := input("Введите строку: ")) != "exit":
print("Вы ввели:", data)


В if и while (проверяем и присваиваем одновременно)
Без :=
text = input("Введите слово: ")
if len(text) > 5:
print(f"Слово длинное ({len(text)} символов)")


С :=:
if (length := len(text)) > 5:
print(f"Слово длинное ({length} символов)")


В списковых включениях (list comprehensions)
Без :=:
numbers = [random.randint(1, 100) for _ in range(10)]
filtered = [num for num in numbers if num % 2 == 0]


С :=:
filtered = [num for _ in range(10) if (num := random.randint(1, 100)) % 2 == 0]


🚩Когда не стоит использовать `:=`?

Если код становится сложнее для чтения
if (a := func()) and (b := another_func(a)) > 10:
...


Ставь 👍 и забирай 📚 Базу знаний
👍8🔥1
🤔 В чем разница между SQLite и SQL Express?

1. SQLite: лёгкая, встроенная база данных, не требует сервера. Подходит для небольших приложений и локального хранения.
2. SQL Express: версия Microsoft SQL Server с ограничениями по объёму данных и нагрузке. Подходит для разработки и небольших приложений.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥4
🤔 Как понять, какие виды тестов нужны именно сейчас?

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

Что тестируем? (код, API, UI, производительность и т. д.)
Какие риски? (где может сломаться, критичность ошибки)
Какой этап разработки? (новый код, рефакторинг, релиз)

🚩Как определить нужные тесты прямо сейчас?

🟠Только написали новый код
Нужны: Юнит-тесты
Тестируем функции и классы отдельно.
def add(a, b):
return a + b

def test_add():
assert add(2, 3) == 5 # Юнит-тест


🟠Соединяем модули или работаем с API
Нужны: Интеграционные тесты
Проверяем работу всей системы вместе.
def test_api():
response = requests.get("https://api.example.com/data")
assert response.status_code == 200


🟠Перед релизом или деплоем
Нужны: Функциональные и регрессионные тесты
Проверяем ключевые сценарии и старый функционал.
def test_login():
assert login("user", "password") == "Success"


🟠Изменили UI (например, фронтенд на React)
Нужны: UI-тесты (Selenium, Playwright)
Проверяем нажатие кнопок, формы и отображение страниц.
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://example.com")
assert "Example" in driver.title


🟠Если проект должен выдерживать большую нагрузку
Нужны: Нагрузочные тесты (Load Testing)
Используем locust, JMeter, k6, чтобы проверить сколько пользователей выдержит сервер.
from locust import HttpUser, task

class MyUser(HttpUser):
@task
def test_homepage(self):
self.client.get("/")


Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Какие есть коллекции и их особенности по скорости работы и использованию памяти?

В Python основные коллекции: списки, кортежи, множества, словари.
- Списки: изменяемы, быстрые при доступе по индексу, но медленнее при вставке в середину. Используют больше памяти за счёт зарезервированного места для расширения.
- Кортежи: неизменяемы, занимают меньше памяти, быстрее при доступе, хорошо подходят для фиксированных наборов данных.
- Множества: обеспечивают быстрый поиск (как словари), но не сохраняют порядок. Используют хеши.
- Словари: ассоциативные коллекции с быстрым доступом по ключу. Эффективны при поиске и обновлении.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍6
🤔 Что делать если нужно перехватить исключение, выполнить действия и опять возбудить это же исключение?

Если нужно:
Перехватить исключение
Выполнить какие-то действия (лог, очистка, уведомление и т. д.)
Снова выбросить это же исключение
try:
x = 1 / 0 # Ошибка деления на ноль
except ZeroDivisionError:
print("Ошибка! Записываем в лог...")
raise # Повторно выбрасываем то же исключение


Вывод
Ошибка! Записываем в лог...
Traceback (most recent call last):
File "script.py", line 2, in <module>
x = 1 / 0
ZeroDivisionError: division by zero


Пример: Логирование перед повторным выбросом
import logging

logging.basicConfig(filename="errors.log", level=logging.ERROR)

try:
user_input = int("abc") # Ошибка ValueError
except ValueError as e:
logging.error(f"Ошибка: {e}") # Записываем в лог
raise # Повторно выбрасываем исключение


Пример: Очистка ресурсов перед выбросом исключения
try:
file = open("data.txt", "r")
data = file.read()
except FileNotFoundError:
print("Файл не найден. Освобождаем ресурсы...")
raise # Снова выбрасываем исключение
finally:
file.close() # Гарантированно закроет файл


Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 Преобразование типов?

– int() — в целое,
– float() — в дробное,
– str() — в строку,
– list(), tuple(), set() — в соответствующие структуры.
Используется для приведения данных к нужному типу.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
💊7👍3🔥1
🤔 Встроенные функции Python

В Python есть встроенные функции (built-in functions) — это функции, которые можно использовать без импорта. Они делают код проще и удобнее.
Полный список встроенных функций можно посмотреть так:
print(dir(__builtins__))


🚩Основные категории встроенных функций

Работа с числами
print(abs(-5))  # 5
print(round(3.14159, 2)) # 3.14
print(pow(2, 3)) # 8
print(min([3, 1, 4])) # 1


Работа со строками
print(len("hello"))  # 5
print(str(123)) # '123'
print(ord('A')) # 65
print(chr(65)) # 'A'


Работа с коллекциями (списки, кортежи, множества)
a = [3, 1, 2]
print(sorted(a)) # [1, 2, 3]

nums = [1, 2, 3]
names = ["Alice", "Bob", "Charlie"]
print(list(zip(nums, names))) # [(1, 'Alice'), (2, 'Bob'), (3, 'Charlie')]


Работа с логикой и проверками
print(bool(""))  # False
print(all([True, 1, "Hello"])) # True
print(any([0, "", None, 5])) # True (есть хотя бы один True)


Работа с функциями
nums = [1, 2, 3, 4]
squared = list(map(lambda x: x**2, nums))
print(squared) # [1, 4, 9, 16]

evens = list(filter(lambda x: x % 2 == 0, nums))
print(evens) # [2, 4]


Работа с файлами
with open("file.txt", "w") as f:
f.write("Hello, world!")

name = input("Введите имя: ")
print("Привет,", name)


Работа с объектами и атрибутами
print(type(42))  # <class 'int'>
print(isinstance(42, int)) # True
print(dir([])) # Методы списка


Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 Что такое перегрузка операторов?

Это возможность определить, как класс должен вести себя с операторами (+, == и др.). Позволяет применять оператор к своим объектам с кастомным результатом.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥2👍1
🤔 Для чего нужен счетчик ссылок Python?

В Python счетчик ссылок (reference count) используется для управления памятью. Он показывает, сколько раз объект используется в программе. Когда счетчик ссылок падает до нуля, Python автоматически удаляет объект, освобождая память.

🚩Как работает счетчик ссылок?

Python использует автоматическое управление памятью, основанное на подсчёте ссылок. Когда создаётся объект, Python хранит специальное число — количество ссылок на этот объект. Это число увеличивается, когда мы создаём новую ссылку на объект, и уменьшается, когда удаляем или перезаписываем переменную.
import sys

a = [1, 2, 3] # Создаём список
print(sys.getrefcount(a)) # Выведет 2 (одна ссылка 'a' + вызов getrefcount)

b = a # Новая ссылка на тот же объект
print(sys.getrefcount(a)) # Теперь 3 (a, b и сам getrefcount)

del a # Удаляем одну ссылку
print(sys.getrefcount(b)) # Теперь 2

del b # Удаляем последнюю ссылку, объект будет удалён из памяти


🚩Почему это важно?

🟠Эффективное управление памятью
Python сам удаляет ненужные объекты, не давая памяти переполняться.
🟠Понимание утечек памяти
Если объект имеет циклические ссылки (например, список ссылается сам на себя), Python не может освободить его сразу, поэтому дополнительно используется сборщик мусора (Garbage Collector, GC).
import gc

class Node:
def __init__(self):
self.ref = self # Циклическая ссылка!

n = Node()
del n # Обычный подсчёт ссылок не сработает, объект останется в памяти
gc.collect() # Явный вызов сборщика мусора удалит его


Ставь 👍 и забирай 📚 Базу знаний
👍2
🤔 Кем себя видишь через два года при работе в фуллтайм?

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
💊13🔥2
🤔 Как работает хеш мап?

Хеш-таблица (HashMap) — это структура данных, которая позволяет быстро хранить и искать пары ключ → значение. В Python её аналогом является dict.

🚩Основная идея

Ключ проходит через хеш-функцию → превращается в число (индекс).
Значение сохраняется в массиве по этому индексу.
При поиске: ключ снова хешируется, и мы мгновенно находим нужное значение.

🚩Как это работает в Python?

Создание хеш-таблицы (dict)
hash_map = {}  # Пустой словарь
hash_map["apple"] = 10 # Добавляем элемент
hash_map["banana"] = 20

print(hash_map["apple"]) # 10


🟠Хеширование ключа
Ключи сначала хешируются с помощью встроенной функции hash().
print(hash("apple"))  # Например: 2837462816
print(hash("banana")) # Другое число


🟠Разрешение коллизий
Иногда разные ключи могут давать одинаковый хеш. Это называется коллизией. Python использует метод цепочек (Chaining): Если у двух ключей один хеш, они хранятся в виде списка в одной ячейке.
hash_map = { "key1": 100, "key2": 200 }
print(hash("key1") % 10) # Допустим, 4
print(hash("key2") % 10) # Тоже 4 (коллизия!)

# Python хранит их в одной ячейке как список [(key1, 100), (key2, 200)]


🟠Динамическое расширение
При заполнении хеш-таблицы, если она становится слишком загруженной, Python автоматически увеличивает её размер, чтобы избежать замедления.
d = {}  # Создаём пустой dict
for i in range(1000):
d[i] = i

print(len(d)) # 1000, Python сам расширил таблицу


🟠Удаление элементов
Удаление также выполняется за O(1)
del hash_map["apple"]  # Мгновенно удаляем


Ставь 👍 и забирай 📚 Базу знаний
👍5💊2
🤔 Что такое URL?

URL (Uniform Resource Locator) — это частный случай URI, который определяет местоположение ресурса в интернете и способ его получения.
Он включает:
- Протокол (например, https)
- Домен
- Путь
- Параметры
Пример:
https://example.com/page?id=42

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥7👍4
🤔 Что случится с сервером при использовании GET?

Когда сервер получает HTTP-запрос типа GET, он выполняет следующие действия

🟠Анализ запроса
проверяет URL и параметры в строке запроса (например, ?id=123).
🟠Поиск ресурса
находит запрашиваемый файл, данные из базы или другой ресурс.
🟠Возврат ответа
отправляет данные клиенту (если ресурс найден — код 200, если нет — 404).

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

🟠Безопасный
не изменяет данные на сервере, используется только для чтения.
🟠Идемпотентный
повторные запросы дают одинаковый результат.
🟠Параметры в URL
данные передаются через строку запроса, что не подходит для конфиденциальной информации.

import requests

response = requests.get("https://api.example.com/data", params={"id": 123})
print(response.text) # Данные с сервера


Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Как пользоваться функцией open?

Функция open открывает файл и возвращает файловый объект. Нужно указать путь и режим (r, w, b и т.д.).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2🔥1
🤔 Как в Python происходит поиск переменной по области видимости?

В Python поиск переменной происходит по правилу LEGB, которое определяет порядок поиска в четырёх областях видимости:
Пример работы LEGB
x = "глобальная"  # Global

def outer():
x = "охватывающая" # Enclosing
def inner():
x = "локальная" # Local
print(x) # Поиск начинается отсюда (L)

inner()

outer()


Вывод
локальная


🚩Глобальные переменные (`global`)

Если нужно изменить глобальную переменную внутри функции, используем global
x = 10  # Глобальная переменная

def modify_global():
global x
x = 20 # Меняем глобальную переменную

modify_global()
print(x) # 20


🚩Переменные из внешней функции (`nonlocal`)

Если в вложенной функции нужно изменить переменную из enclosing-области, используем nonlocal
def outer():
x = 10 # Переменная из enclosing-области

def inner():
nonlocal x
x = 20 # Меняем `x` в `outer()`

inner()
print(x) # 20

outer()


🚩Что если переменная отсутствует во всех областях?

Если переменная не найдена в LEGB, Python выдаст NameError
def func():
print(y) # Ошибка: y не объявлена!

func()


Ошибка
NameError: name 'y' is not defined


🚩`Built-in` — встроенные функции

Python в последнюю очереде проверяет встроенные функции (print(), len(), sum() и т. д.).
print = "Ошибка!"  # Переопределили встроенную функцию
print("Hello") # TypeError: 'str' object is not callable


Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Для чего нужен счётчик ссылок в Python?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1