Python | Вопросы собесов
13.6K subscribers
36 photos
2 videos
1 file
1.11K links
Download Telegram
🤔 Когда возникает проблема циклического импорта?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥3
🤔 Для чего нужны библиотеки sqlparse, asgiref в Django?

Django использует sqlparse и asgiref как вспомогательные библиотеки для работы с SQL и асинхронностью. Разберём их назначение подробно.

🟠`sqlparse` – разбор SQL-запросов
sqlparse (SQL Parser) — это библиотека для анализа, форматирования и обработки SQL-запросов. В Django она используется в админке, логах и отладке ORM.

🚩Где используется в Django?

Форматирование SQL-запросов в django.db.connection.queries
   from django.db import connection
from sqlparse import format

queries = connection.queries # Получаем список SQL-запросов
for q in queries:
print(format(q["sql"], reindent=True, keyword_case="upper")) # Красивый SQL


Логирование SQL-запросов
sqlparse помогает Django красиво выводить SQL-запросы в DEBUG=True.

Команда sqlmigrate
   python manage.py sqlmigrate app_name 0001


🟠`asgiref` – асинхронность в Django
asgiref (Asynchronous Server Gateway Interface Reference) — это библиотека, которая помогает Django работать в асинхронном (async) режиме. Django поддерживает ASGI с версии 3.0, и asgiref — это её обязательная зависимость.

🚩Где используется в Django?

🟠Поддержка ASGI
Django с версии 3.0 поддерживает асинхронные вьюхи, WebSockets и асинхронные базы данных (например, с asyncpg).
В settings.py есть параметр:
     ASGI_APPLICATION = "myproject.asgi.application"


🟠Асинхронные middleware
Django 4.x поддерживает асинхронные middleware через asgiref.sync и asgiref.local.

🟠Преобразование `async` → `sync` и наоборот
Django использует sync_to_async() и async_to_sync() из asgiref:
     from asgiref.sync import sync_to_async

def sync_function():
return "Hello from sync!"

async_function = sync_to_async(sync_function)
print(async_function()) # Вызывает синхронную функцию в асинхронном коде


🟠Локальное хранилище для асинхронных задач (`asgiref.local.Local`)
Позволяет хранить данные отдельно для каждого потока или запроса.

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

Такие библиотеки, например boto3, позволяют:
- Управлять облачными сервисами AWS (EC2, S3, RDS и др.).
- Автоматизировать создание серверов, баз данных, хранилищ.
- Настраивать безопасность, балансировку, мониторинг.
То есть, это способ писать инфраструктурный код вместо ручной работы через веб-интерфейс AWS.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Как в 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


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🤔 Можно ли создать словарь с упорядоченным набором ключей в Python?

Да, начиная с Python 3.7 порядок вставки в словарь сохраняется по умолчанию. Это означает, что словарь стал упорядоченной структурой данных.


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

В SQL можно объединять данные из двух таблиц без использования JOIN, используя альтернативные методы.

🚩Использование подзапросов (`SELECT` внутри `SELECT`)

Подзапрос (subquery) позволяет выбрать данные из одной таблицы, используя данные из другой.
Допустим, у нас есть две таблицы:
employees (id, name, department_id)
departments (id, name)
SELECT name, 
(SELECT name FROM departments WHERE id = employees.department_id) AS department_name
FROM employees;


🚩Использование `IN` или `EXISTS`

Можно фильтровать данные из одной таблицы, проверяя наличие значений в другой.
SELECT name 
FROM employees
WHERE department_id IN (SELECT id FROM departments);


🚩Объединение данных через `UNION`
Если таблицы имеют схожие колонки, можно объединить их с UNION.
SELECT id, name, email FROM users_old
UNION
SELECT id, name, email FROM users_new;


🚩Использование `CROSS JOIN` через `WHERE`

Хотя CROSS JOIN делает декартово произведение, его можно фильтровать WHERE, имитируя INNER JOIN.
SELECT e.name, d.name AS department
FROM employees e, departments d
WHERE e.department_id = d.id;


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

CRUD — это аббревиатура базовых операций с данными:
- Create (создание),
- Read (чтение),
- Update (обновление),
- Delete (удаление).
Используется как в базах данных, так и в REST API.


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

Это специальный метод, который вызывается автоматически, когда объект класса уничтожается. В 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
👍5
🤔 Что означает %d?

Это шаблон для подстановки целого числа в строку при форматировании в старом стиле.
Сколько может быть родителей и наследников у класса?
– Родителей может быть несколько (множественное наследование).
– Наследников — сколько угодно, класс может быть базой для многих потомков.


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

Идемпотентность — это свойство операции, при котором повторное выполнение приводит к тому же результату, что и первое.

🚩Зачем нужна идемпотентность?

🟠Надёжности
если операция выполнится повторно (из-за ошибки сети), она не приведёт к неожиданному результату.
🟠Безопасности
позволяет избежать дублирования данных или неожиданных изменений.
🟠API и HTTP-запросов
гарантирует, что повторные вызовы API не создадут дубликатов.

🚩Идемпотентность в HTTP (REST API)
В веб-разработке идемпотентность важна для API-запросов, чтобы случайные повторные вызовы не привели к непредсказуемым последствиям.
Этот запрос идемпотентен — если отправить его 10 раз, пользователь "Alice" останется тем же.
POST /users { "name": "Alice" }


🚩Идемпотентность в базах данных

В SQL запросы SELECT и DELETE часто идемпотентны, а INSERT — нет.
DELETE FROM users WHERE id = 5;


Этот запрос идемпотентен — удаление пользователя с ID = 5 несколько раз не изменит систему (если он уже удалён).
INSERT INTO users (name) VALUES ('Alice');


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Media is too big
VIEW IN TELEGRAM
📺 База 1000+ реальных собеседований

На программиста, тестировщика, аналитика, проджекта и другие IT профы.

Есть собесы от ведущих компаний: Сбер, Яндекс, ВТБ, Тинькофф, Озон, Wildberries и т.д.

🎯 Переходи по ссылке и присоединяйся к базе, чтобы прокачать свои шансы на успешное трудоустройство!
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 В чём преимущество NoSQL перед SQL?

- Гибкость схемы — можно хранить разные поля в разных документах;
- Горизонтальное масштабирование;
- Лучше подходит для больших объёмов неструктурированных данных;
- Идеален для высокой скорости записи и чтения, например, в логировании, кэшировании.


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

Использование чисел в качестве ключей в словарях Python – это достаточно распространённый случай. Однако у этого подхода есть несколько нюансов, которые нужно учитывать для избежания ошибок.

🚩Хешируемость чисел

Ключи в словаре должны быть хешируемыми, поскольку словари в Python основаны на хеш-таблицах. Хешируемость означает, что объект имеет неизменное значение хеша в течение его жизни. Числа (как int, так и float) являются хешируемыми, поэтому их можно использовать в качестве ключей.
d = {1: "один", 2: "два"}
print(d[1]) # "один"


🚩Взаимодействие `int` и `float`

Python не делает различий между int и float, если их значения равны. Это связано с тем, что у них одинаковое хеш-значение при равенстве.
d = {1: "один", 1.0: "float один", 2: "два"}
print(d) # {1: 'float один', 2: 'два'}


🚩Непредсказуемое поведение при работе с `float`

Числа с плавающей запятой (float) иногда ведут себя непредсказуемо из-за ошибок округления, которые возникают из-за особенностей представления чисел в памяти компьютера.
d = {0.1 + 0.2: "значение"}  # 0.1 + 0.2 не равно точно 0.3 из-за округления
print(d.get(0.3)) # None, ключ не найден!


🚩Производительность

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

🚩Проблемы при преобразованиях

Если ключами словаря являются числа, то при обработке данных (например, чтении из файла или API) можно случайно преобразовать их в строки, что приведёт к созданию новых ключей вместо использования существующих.
d = {1: "один", 2: "два"}
print(d.get("1")) # None, строка "1" и число 1 – это разные ключи!


🚩Пользовательские объекты с числовыми свойствами

Если вы используете пользовательские объекты как ключи и они ведут себя как числа (например, реализуют методы __hash__ и __eq__), то их поведение должно быть совместимо с ожидаемым использованием.
class MyNumber:
def __init__(self, value):
self.value = value

def __hash__(self):
return hash(self.value)

def __eq__(self, other):
return self.value == other.value

d = {MyNumber(1): "один"}
print(d[MyNumber(1)]) # "один"


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

В asyncio "табл-объекты" напрямую не существуют как термин, но в контексте часто имеются в виду:
- Future — объект, представляющий будущий результат;
- Task — обёртка над корутиной, запускающая её в event loop;
- Coroutine — функция, определённая через async def, которую можно "ожидать". Все три участвуют в управлении асинхронными операциями.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍1💊1
🤔 Почему вычислять большие значения в асинхронной функции плохо?

Асинхронность (asyncio) в Python не выполняет код параллельно, а переключается между задачами во время ожидания (I/O-bound).
Если в async-функции делать тяжёлые вычисления (CPU-bound), это блокирует asyncio, потому что в Python есть GIL (Global Interpreter Lock).

🚩Асинхронность в Python подходит для ввода-вывода (I/O-bound)

Асинхронность позволяет выполнять задачи без блокировки, но только если они ждут чего-то (файлы, сеть, БД).
import asyncio
import aiohttp

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"] * 5
results = await asyncio.gather(*(fetch(url) for url in urls))

asyncio.run(main())


🚩Проблема с `async` и тяжёлыми вычислениями (CPU-bound)

Если в async-функции делать тяжёлые вычисления, Python не сможет переключаться между задачами.
import asyncio

async def heavy_task(n):
print(f"Вычисляю {n}...")
total = sum(i**2 for i in range(n)) # Долгий процесс
return total

async def main():
await asyncio.gather(heavy_task(10**7), heavy_task(10**7))

asyncio.run(main())


🚩Как правильно выполнять вычисления в `async`?

🟠Использовать `asyncio.to_thread()` (делегирование в потоки)
В Python 3.9+ можно выполнять CPU-задачи в отдельных потоках, не блокируя asyncio.
import asyncio

def heavy_computation(n):
return sum(i**2 for i in range(n))

async def main():
result = await asyncio.to_thread(heavy_computation, 10**7)
print(result)

asyncio.run(main())


🟠Использовать `multiprocessing` (запуск на нескольких ядрах)
Так как Python использует GIL, единственный способ выполнять настоящий параллелизм — это multiprocessing.
import asyncio
import multiprocessing

def heavy_computation(n):
return sum(i**2 for i in range(n))

async def main():
loop = asyncio.get_running_loop()
with multiprocessing.Pool() as pool:
result = await loop.run_in_executor(pool, heavy_computation, 10**7)
print(result)

asyncio.run(main())


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
🤔 Какие ещё есть основные методы, кроме магических?

Кроме магических (init, str, len и др.), часто используются обычные методы объектов:
- Для строк: .lower(), .upper(), .replace(), .split(), .join().
- Для списков: .append(), .extend(), .remove(), .pop(), .sort().
- Для словарей: .get(), .items(), .keys(), .values(), .update().
- Для множеств: .add(), .discard(), .union(), .intersection().
Эти методы составляют ядро повседневной работы с типами Python и не являются "магическими", но критически важны.


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

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

Что тестируем? (код, 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("/")


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2
🤔 Можно ли через GET отправить файл?

Технически — нет.
GET не имеет тела запроса, а файл — это большой объём данных, требующий формата и тела передачи, что характерно для POST или PUT.
Передача файла всегда должна идти через POST (или PUT), с корректным Content-Type.


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

Моржовый оператор (:=) – это новый оператор, появившийся в 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:
...


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

Apache Airflow — это платформа для оркестрации рабочих процессов (workflow), особенно в задачах обработки данных. Она позволяет описывать пайплайны в виде DAG (направленного графа задач), управлять зависимостями, планировать и отслеживать выполнение.


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