🤔 Что такое блокировки (локи) в БД?
Блокировка (lock) — это механизм, который предотвращает одновременный доступ к данным разными транзакциями, чтобы избежать конфликтов, повреждения данных или "гонки" процессов.
Представь, что два человека редактируют один и тот же документ. Если они начнут менять его одновременно, файл может испортиться. Блокировки в БД работают так же — если один процесс изменяет данные, другой должен подождать, пока первый закончит.
🚩Почему нужны блокировки?
🟠Гарантия целостности данных
предотвращает одновременные изменения одних и тех же строк.
🟠Избегание гонки данных (race condition)
когда два запроса пытаются изменить одно и то же значение.
🟠Изоляция транзакций
разные операции не мешают друг другу.
🚩Виды блокировок в БД
🟠По уровню охвата данных
Строчная (Row Lock) – блокирует только одну строку таблицы.
Табличная (Table Lock) – блокирует всю таблицу целиком.
Блокировка всей базы (Database Lock) – редко используется, но блокирует всю БД.
🟠По типу блокировки
Эксклюзивная (Exclusive, X-Lock) – блокирует запись для всех (никакие другие операции её не изменят).
Разделяемая (Shared, S-Lock) – блокирует только на запись (чтение возможно).
🟠Явные и неявные блокировки
Явные (ручные) – задаются программистом (
Неявные (автоматические) – создаются СУБД при
🚩Проблемы с блокировками
🟠Deadlock (взаимная блокировка)
Если два запроса ждут друг друга, система "зависает". Решение: правильный порядок выполнения транзакций.
🟠Долгие блокировки
Если транзакция не закрывается (
🟠Снижение производительности
Чем больше блокировок, тем медленнее работа БД.
Ставь 👍 и забирай 📚 Базу знаний
Блокировка (lock) — это механизм, который предотвращает одновременный доступ к данным разными транзакциями, чтобы избежать конфликтов, повреждения данных или "гонки" процессов.
Представь, что два человека редактируют один и тот же документ. Если они начнут менять его одновременно, файл может испортиться. Блокировки в БД работают так же — если один процесс изменяет данные, другой должен подождать, пока первый закончит.
🚩Почему нужны блокировки?
🟠Гарантия целостности данных
предотвращает одновременные изменения одних и тех же строк.
🟠Избегание гонки данных (race condition)
когда два запроса пытаются изменить одно и то же значение.
🟠Изоляция транзакций
разные операции не мешают друг другу.
🚩Виды блокировок в БД
🟠По уровню охвата данных
Строчная (Row Lock) – блокирует только одну строку таблицы.
Табличная (Table Lock) – блокирует всю таблицу целиком.
Блокировка всей базы (Database Lock) – редко используется, но блокирует всю БД.
BEGIN;
SELECT * FROM users WHERE id = 1 FOR UPDATE; -- Блокирует строку, пока транзакция не завершится
🟠По типу блокировки
Эксклюзивная (Exclusive, X-Lock) – блокирует запись для всех (никакие другие операции её не изменят).
Разделяемая (Shared, S-Lock) – блокирует только на запись (чтение возможно).
BEGIN;
UPDATE users SET balance = balance - 100 WHERE id = 1;
-- Пока транзакция не завершится, другая транзакция не сможет изменить balance пользователя 1.
🟠Явные и неявные блокировки
Явные (ручные) – задаются программистом (
SELECT ... FOR UPDATE). Неявные (автоматические) – создаются СУБД при
INSERT, UPDATE, DELETE. 🚩Проблемы с блокировками
🟠Deadlock (взаимная блокировка)
Если два запроса ждут друг друга, система "зависает". Решение: правильный порядок выполнения транзакций.
🟠Долгие блокировки
Если транзакция не закрывается (
COMMIT/ROLLBACK), другие запросы ждут бесконечно. Решение: короткие транзакции, автоматическое завершение. 🟠Снижение производительности
Чем больше блокировок, тем медленнее работа БД.
Ставь 👍 и забирай 📚 Базу знаний
🤔 Как в классе сослаться на родительский класс?
Для этого используется функция super, которая обращается к методу или атрибуту родительского класса. Это особенно полезно при переопределении методов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Для этого используется функция super, которая обращается к методу или атрибуту родительского класса. Это особенно полезно при переопределении методов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥1
🤔 Что такое CRUD?
CRUD — это аббревиатура из четырех основных операций с данными:
C (Create) – создание
R (Read) – чтение
U (Update) – обновление
D (Delete) – удаление
🚩Разберем CRUD на примере работы с базой данных в Python
🟠Create (Создание)
Добавление новой записи в базу данных.
🟠Read (Чтение)
Получение данных из базы.
🟠Update (Обновление)
Изменение существующей записи.
🟠Delete (Удаление)
Удаление записи из базы.
Ставь 👍 и забирай 📚 Базу знаний
CRUD — это аббревиатура из четырех основных операций с данными:
C (Create) – создание
R (Read) – чтение
U (Update) – обновление
D (Delete) – удаление
🚩Разберем CRUD на примере работы с базой данных в Python
🟠Create (Создание)
Добавление новой записи в базу данных.
import sqlite3
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
# Создаем таблицу, если её нет
cursor.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)")
# Добавляем пользователя
cursor.execute("INSERT INTO users (name) VALUES (?)", ("Алиса",))
conn.commit() # Сохраняем изменения
conn.close()
🟠Read (Чтение)
Получение данных из базы.
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")
users = cursor.fetchall() # Получаем все записи
for user in users:
print(user)
conn.close()🟠Update (Обновление)
Изменение существующей записи.
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
cursor.execute("UPDATE users SET name = ? WHERE id = ?", ("Боб", 1))
conn.commit()
conn.close()🟠Delete (Удаление)
Удаление записи из базы.
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
cursor.execute("DELETE FROM users WHERE id = ?", (1,))
conn.commit()
conn.close()Ставь 👍 и забирай 📚 Базу знаний
🤔 Что известно про арифметический оператор //?
// — это оператор целочисленного деления. Он возвращает только целую часть результата, отбрасывая дробную. Это удобно, когда нужно делить и получить результат без остатка, особенно в индексах или циклах.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
// — это оператор целочисленного деления. Он возвращает только целую часть результата, отбрасывая дробную. Это удобно, когда нужно делить и получить результат без остатка, особенно в индексах или циклах.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 Что такое type?
В Python
Определяет тип объекта (
Создаёт новые классы динамически (
🟠1. `type(obj)`: Определение типа объекта
Функция
🟠`type(name, bases, attrs)`: Создание класса динамически
Функция
🟠`type` как метакласс
В Python
Ставь 👍 и забирай 📚 Базу знаний
В Python
type — это встроенная функция и метакласс, который: Определяет тип объекта (
type(obj)). Создаёт новые классы динамически (
type(name, bases, attrs)). 🟠1. `type(obj)`: Определение типа объекта
Функция
type(obj) возвращает класс (тип) объекта.print(type(42)) # <class 'int'>
print(type("hello")) # <class 'str'>
print(type([1, 2, 3])) # <class 'list'>
if type(42) is int:
print("Это целое число!")
🟠`type(name, bases, attrs)`: Создание класса динамически
Функция
type может создавать новые классы "на лету".MyClass = type("MyClass", (object,), {"x": 10, "hello": lambda self: "Hello!"})
obj = MyClass()
print(obj.x) # 10
print(obj.hello()) # Hello!🟠`type` как метакласс
В Python
type — это метакласс для всех классов, то есть классы тоже являются объектами type.class A:
pass
print(type(A)) # <class 'type'>
Ставь 👍 и забирай 📚 Базу знаний
🤔 Можно ли объявлять функцию внутри другой функции? Где она будет видна?
Да, можно. Такая функция будет локальной — она доступна только внутри внешней функции, где была определена. Это используется для инкапсуляции логики, для создания замыканий (closures) или вспомогательных функций, которые не нужны за пределами.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Да, можно. Такая функция будет локальной — она доступна только внутри внешней функции, где была определена. Это используется для инкапсуляции логики, для создания замыканий (closures) или вспомогательных функций, которые не нужны за пределами.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Назовите основные мидлвари, зачем они нужны
Middleware (промежуточное ПО) — это специальные классы, которые обрабатывают запросы и ответы, проходящие через Django. Они позволяют изменять данные, проверять доступ, логировать действия и многое другое.
🚩Основные мидлвари Django
🟠SecurityMiddleware
Добавляет важные HTTP-заголовки для защиты сайта:
-
-
-
🟠CommonMiddleware
Отвечает за:
Перенаправление с
Удаление
Обработка кодировки и контента.
🟠SessionMiddleware
Позволяет Django хранить данные пользователя между запросами (например, авторизацию).
🟠AuthenticationMiddleware
Позволяет работать с
🟠CSRF Middleware (CsrfViewMiddleware)
Защищает от атак межсайтовой подделки запросов (CSRF).
При обработке форм Django требует специальный CSRF-токен:
🟠XFrameOptionsMiddleware
Запрещает встраивать сайт в
🟠MessageMiddleware
Позволяет передавать временные сообщения (
🚩Как добавить или отключить мидлвари?
Мидлвари хранятся в
🚩Как написать свой мидлвар?
Допустим, хотим логировать все запросы.
Создаём
Добавляем в
Теперь в консоли будем видеть все запросы!
Ставь 👍 и забирай 📚 Базу знаний
Middleware (промежуточное ПО) — это специальные классы, которые обрабатывают запросы и ответы, проходящие через Django. Они позволяют изменять данные, проверять доступ, логировать действия и многое другое.
🚩Основные мидлвари Django
🟠SecurityMiddleware
Добавляет важные HTTP-заголовки для защиты сайта:
-
Strict-Transport-Security (HTTPS) -
X-Content-Type-Options: nosniff -
X-Frame-Options: DENY 🟠CommonMiddleware
Отвечает за:
Перенаправление с
APPEND_SLASH=True (если /about → перенаправит на /about/). Удаление
www. (www.example.com → example.com). Обработка кодировки и контента.
🟠SessionMiddleware
Позволяет Django хранить данные пользователя между запросами (например, авторизацию).
request.session["user_id"] = 42 # Сохраняем ID пользователя в сессии
🟠AuthenticationMiddleware
Позволяет работать с
request.user, автоматически определяя пользователя. if request.user.is_authenticated:
print(f"Пользователь: {request.user.username}")
🟠CSRF Middleware (CsrfViewMiddleware)
Защищает от атак межсайтовой подделки запросов (CSRF).
При обработке форм Django требует специальный CSRF-токен:
<form method="POST">
{% csrf_token %}
<input type="text" name="name">
</form>
🟠XFrameOptionsMiddleware
Запрещает встраивать сайт в
<iframe>, предотвращая атаку Clickjacking. X-Frame-Options: DENY
🟠MessageMiddleware
Позволяет передавать временные сообщения (
django.contrib.messages). from django.contrib import messages
messages.success(request, "Вы успешно вошли!")
messages.error(request, "Ошибка авторизации!")
🚩Как добавить или отключить мидлвари?
Мидлвари хранятся в
settings.py: MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware",
"django.middleware.common.CommonMiddleware",
"django.middleware.csrf.CsrfViewMiddleware",
"django.contrib.sessions.middleware.SessionMiddleware",
"django.contrib.auth.middleware.AuthenticationMiddleware",
]
🚩Как написать свой мидлвар?
Допустим, хотим логировать все запросы.
Создаём
middleware.py import datetime
class LogMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
print(f"[{datetime.datetime.now()}] Запрос: {request.path}")
response = self.get_response(request)
return response
Добавляем в
settings.py MIDDLEWARE.append("myapp.middleware.LogMiddleware")Теперь в консоли будем видеть все запросы!
[2024-02-28 12:00:00] Запрос: /
[2024-02-28 12:01:00] Запрос: /login/
Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое git?
Git — это система контроля версий, позволяющая отслеживать изменения в коде, управлять ветками и работать в команде. Она поддерживает распределённый подход, где каждый разработчик имеет локальную копию репозитория. Git используется для ведения истории изменений и упрощения совместной работы.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥2👍1
🤔 Для чего нужны библиотеки sqlparse, asgiref в Django?
Django использует
🟠`sqlparse` – разбор SQL-запросов
🚩Где используется в Django?
Форматирование SQL-запросов в
Логирование SQL-запросов
Команда
🟠`asgiref` – асинхронность в Django
🚩Где используется в Django?
🟠Поддержка ASGI
Django с версии 3.0 поддерживает асинхронные вьюхи, WebSockets и асинхронные базы данных (например, с
В
🟠Асинхронные middleware
Django 4.x поддерживает асинхронные middleware через
🟠Преобразование `async` → `sync` и наоборот
Django использует
🟠Локальное хранилище для асинхронных задач (`asgiref.local.Local`)
Позволяет хранить данные отдельно для каждого потока или запроса.
Ставь 👍 и забирай 📚 Базу знаний
Django использует
sqlparse и asgiref как вспомогательные библиотеки для работы с SQL и асинхронностью. Разберём их назначение подробно. 🟠`sqlparse` – разбор SQL-запросов
sqlparse (SQL Parser) — это библиотека для анализа, форматирования и обработки SQL-запросов. В Django она используется в админке, логах и отладке ORM. 🚩Где используется в Django?
Форматирование SQL-запросов в
django.db.connection.queriesfrom 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.Команда
sqlmigratepython 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`)
Позволяет хранить данные отдельно для каждого потока или запроса.
Ставь 👍 и забирай 📚 Базу знаний
🤔 Какая разница между методами
Метод str() возвращает строковое представление объекта, ориентированное на пользователей, в то время как repr() предназначен для разработчиков и должен выдавать строку, которая при передаче в eval() (если это возможно) воссоздаст объект. В repr() обычно стараются передавать больше технической информации о состоянии объекта, чем в str().
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
str и repr? Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2🔥2
🤔 Что такое многопоточность/многопроцессорность?
В программировании многопоточность и многопроцессорность помогают выполнять задачи параллельно, но работают по-разному.
🟠Многопоточность (Multithreading)
Многопоточность позволяет одной программе запускать несколько потоков (threads), которые работают одновременно.
Вывод
🟠2. Многопроцессорность (Multiprocessing)
Многопроцессорность запускает отдельные процессы, которые работают полностью независимо и могут использовать разные ядра процессора.
Вывод (процессы действительно работают параллельно)
Ставь 👍 и забирай 📚 Базу знаний
В программировании многопоточность и многопроцессорность помогают выполнять задачи параллельно, но работают по-разному.
🟠Многопоточность (Multithreading)
Многопоточность позволяет одной программе запускать несколько потоков (threads), которые работают одновременно.
import threading
import time
def task(name):
print(f"{name} начал работу")
time.sleep(2)
print(f"{name} завершил работу")
# Создаём два потока
t1 = threading.Thread(target=task, args=("Поток 1",))
t2 = threading.Thread(target=task, args=("Поток 2",))
t1.start()
t2.start()
t1.join()
t2.join()
print("Все потоки завершены")
Вывод
Поток 1 начал работу
Поток 2 начал работу
Поток 1 завершил работу
Поток 2 завершил работу
Все потоки завершены
🟠2. Многопроцессорность (Multiprocessing)
Многопроцессорность запускает отдельные процессы, которые работают полностью независимо и могут использовать разные ядра процессора.
import multiprocessing
import time
def task(name):
print(f"{name} начал работу")
time.sleep(2)
print(f"{name} завершил работу")
if __name__ == "__main__":
p1 = multiprocessing.Process(target=task, args=("Процесс 1",))
p2 = multiprocessing.Process(target=task, args=("Процесс 2",))
p1.start()
p2.start()
p1.join()
p2.join()
print("Все процессы завершены")
Вывод (процессы действительно работают параллельно)
Процесс 1 начал работу
Процесс 2 начал работу
Процесс 1 завершил работу
Процесс 2 завершил работу
Все процессы завершены
Ставь 👍 и забирай 📚 Базу знаний
🤔 Чем отличаются операторы WHERE и HAVING в SQL?
- WHERE фильтрует строки до агрегации — применяется на этапе выборки.
- HAVING фильтрует группы после агрегации — работает с результатами GROUP BY.
Например, WHERE salary > 50000 фильтрует строки, а HAVING COUNT(*) > 3 фильтрует группы.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
- WHERE фильтрует строки до агрегации — применяется на этапе выборки.
- HAVING фильтрует группы после агрегации — работает с результатами GROUP BY.
Например, WHERE salary > 50000 фильтрует строки, а HAVING COUNT(*) > 3 фильтрует группы.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое set?
Это неупорядоченная коллекция уникальных элементов в Python. Это одна из встроенных структур данных языка, которая используется, когда вам нужно работать с наборами данных, исключая дубликаты и выполняя операции над множествами (например, пересечение, объединение и разность).
🚩Основные характеристики `set`
🟠Неупорядоченность
Элементы множества не имеют фиксированного порядка, то есть вы не можете обращаться к элементам по индексу, как в списках или кортежах.
🟠Уникальность элементов
Во множестве не может быть дубликатов. Если вы добавите во множество несколько одинаковых элементов, они будут храниться как один экземпляр.
🟠Изменяемость
Множества в Python изменяемы: вы можете добавлять, удалять и изменять их элементы. Однако сами элементы множества должны быть неизменяемыми (например, числа, строки, кортежи).
🟠Быстродействие
Операции проверки принадлежности (
🚩Создание множества
🟠Пустое множество
Для создания пустого множества используется функция
🟠Создание множества с элементами
Вы можете передать список, строку, кортеж или другой итерируемый объект в функцию
🟠Использование литералов
Вы также можете использовать фигурные скобки
🚩Основные операции с множествами
🟠Добавление элементов
Используется метод
🟠Удаление элементов
🟠Очистка множества
🟠Проверка наличия элемента
Используется оператор
🚩Операции над множествами
Python поддерживает классические операции теории множеств:
🟠Объединение (`union` или `|`)
Возвращает множество, содержащее все элементы из двух множеств.
🟠Пересечение (`intersection` или `&`)
Возвращает элементы, которые присутствуют в обоих множествах.
🟠Разность (`difference` или `-`)
Возвращает элементы, которые присутствуют только в одном множестве (а не в другом).
🟠Симметрическая разность (`symmetric_difference` или `^`)
Возвращает элементы, которые есть в одном из множеств, но не в обоих сразу.
🚩Неизменяемое множество (`frozenset`)
Если вам нужно создать множество, которое нельзя изменить, используйте
Ставь 👍 и забирай 📚 Базу знаний
Это неупорядоченная коллекция уникальных элементов в Python. Это одна из встроенных структур данных языка, которая используется, когда вам нужно работать с наборами данных, исключая дубликаты и выполняя операции над множествами (например, пересечение, объединение и разность).
🚩Основные характеристики `set`
🟠Неупорядоченность
Элементы множества не имеют фиксированного порядка, то есть вы не можете обращаться к элементам по индексу, как в списках или кортежах.
🟠Уникальность элементов
Во множестве не может быть дубликатов. Если вы добавите во множество несколько одинаковых элементов, они будут храниться как один экземпляр.
🟠Изменяемость
Множества в Python изменяемы: вы можете добавлять, удалять и изменять их элементы. Однако сами элементы множества должны быть неизменяемыми (например, числа, строки, кортежи).
🟠Быстродействие
Операции проверки принадлежности (
in), добавления и удаления элементов работают очень быстро, благодаря использованию хэш-таблиц в реализации множества.🚩Создание множества
🟠Пустое множество
Для создания пустого множества используется функция
set(), так как {} создаёт пустой словарьempty_set = set()
print(empty_set) # Output: set()
🟠Создание множества с элементами
Вы можете передать список, строку, кортеж или другой итерируемый объект в функцию
set(). # Создание множества из списка
numbers = set([1, 2, 3, 4, 5])
print(numbers) # Output: {1, 2, 3, 4, 5}
# Создание множества из строки (уникальные символы)
chars = set("hello")
print(chars) # Output: {'h', 'e', 'l', 'o'} (порядок может быть разным)
🟠Использование литералов
Вы также можете использовать фигурные скобки
{} для создания множестваfruits = {"apple", "banana", "cherry"}
print(fruits) # Output: {'apple', 'banana', 'cherry'}🚩Основные операции с множествами
🟠Добавление элементов
Используется метод
add()my_set = {1, 2, 3}
my_set.add(4)
print(my_set) # Output: {1, 2, 3, 4}🟠Удаление элементов
remove() — удаляет элемент, выбрасывая ошибку, если его нет.discard() — удаляет элемент, не выбрасывая ошибку, если его нет.my_set = {1, 2, 3}
my_set.remove(2) # Удаляем элемент 2
print(my_set) # Output: {1, 3}
my_set.discard(5) # Ошибки не будет, если элемента 5 нетpop() — удаляет и возвращает случайный элемент (так как множество неупорядочено)my_set = {1, 2, 3}
removed_element = my_set.pop()
print(removed_element) # Например: 1
print(my_set) # Например: {2, 3}🟠Очистка множества
my_set = {1, 2, 3}
my_set.clear()
print(my_set) # Output: set()🟠Проверка наличия элемента
Используется оператор
inmy_set = {1, 2, 3}
print(2 in my_set) # Output: True
print(5 in my_set) # Output: False🚩Операции над множествами
Python поддерживает классические операции теории множеств:
🟠Объединение (`union` или `|`)
Возвращает множество, содержащее все элементы из двух множеств.
set1 = {1, 2, 3}
set2 = {3, 4, 5}
print(set1 | set2) # Output: {1, 2, 3, 4, 5}
print(set1.union(set2)) # То же самое🟠Пересечение (`intersection` или `&`)
Возвращает элементы, которые присутствуют в обоих множествах.
print(set1 & set2) # Output: {3}
print(set1.intersection(set2)) # То же самое🟠Разность (`difference` или `-`)
Возвращает элементы, которые присутствуют только в одном множестве (а не в другом).
print(set1 - set2) # Output: {1, 2} (только в set1)
print(set1.difference(set2)) # То же самое🟠Симметрическая разность (`symmetric_difference` или `^`)
Возвращает элементы, которые есть в одном из множеств, но не в обоих сразу.
print(set1 ^ set2) # Output: {1, 2, 4, 5}
print(set1.symmetric_difference(set2)) # То же самое🚩Неизменяемое множество (`frozenset`)
Если вам нужно создать множество, которое нельзя изменить, используйте
frozensetfrozen = frozenset([1, 2, 3])
print(frozen) # Output: frozenset({1, 2, 3})
# frozen.add(4) # Ошибка: 'frozenset' object has no attribute 'add'
Ставь 👍 и забирай 📚 Базу знаний
🤔 Какая сложность сортировки слияния в худшем случае?
Сортировка слиянием (
В худшем случае сложность O(n log n).
🚩Как работает сортировка слиянием?
🟠Делим массив пополам
до тех пор, пока не останутся отдельные элементы.
🟠Сортируем и сливаем
полученные подмассивы.
Ставь 👍 и забирай 📚 Базу знаний
Сортировка слиянием (
Merge Sort) — это алгоритм, который использует разделяй и властвуй (divide & conquer). В худшем случае сложность O(n log n).
🚩Как работает сортировка слиянием?
🟠Делим массив пополам
до тех пор, пока не останутся отдельные элементы.
🟠Сортируем и сливаем
полученные подмассивы.
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
def merge(left, right):
sorted_arr = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
sorted_arr.append(left[i])
i += 1
else:
sorted_arr.append(right[j])
j += 1
sorted_arr.extend(left[i:])
sorted_arr.extend(right[j:])
return sorted_arr
arr = [5, 2, 9, 1, 5, 6]
print(merge_sort(arr))
Ставь 👍 и забирай 📚 Базу знаний
🤔 Что значит динамически менять поведение функции?
Это означает возможность изменять логику функции во время выполнения. Такое поведение достигается через декораторы, переменные функций, обёртки или переопределение в рантайме.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Это означает возможность изменять логику функции во время выполнения. Такое поведение достигается через декораторы, переменные функций, обёртки или переопределение в рантайме.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое моржовый оператор?
Моржовый оператор (
🚩Как он работает?
Обычно мы записываем код так:
С
🚩Где использовать?
В циклах (избегаем лишних вычислений). Вместо:
С
В
Без
С
В списковых включениях (list comprehensions)
Без
С
🚩Когда не стоит использовать `:=`?
Если код становится сложнее для чтения
Ставь 👍 и забирай 📚 Базу знаний
Моржовый оператор (
:=) – это новый оператор, появившийся в 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:
...
Ставь 👍 и забирай 📚 Базу знаний
🔥 Скрытые вакансии с удаленной работой для Python разработчика, которые нигде больше не публикуются. Напрямую от компаний, с контактами рекрутеров.
🔹 Python Jobs | Вакансии
🔹 Data Science ML | Вакансии
🔹 Golang Go Jobs | Вакансии
🔸 Все каналы с вакансиями
🔹 Python Jobs | Вакансии
🔹 Data Science ML | Вакансии
🔹 Golang Go Jobs | Вакансии
🔸 Все каналы с вакансиями
🤔 Какие есть коды ошибок HTTP?
В HTTP коды состояния указывают, как сервер обработал запрос. Они делятся на 5 категорий:
1xx (Информационные – запрос принят, продолжаем.
2xx (Успешные) – всё хорошо.
3xx (Перенаправления) – запрашиваемый ресурс перемещён.
4xx (Ошибки клиента) – клиент отправил неправильный запрос.
5xx (Ошибки сервера) – сервер не смог обработать запрос.
🚩Как исправить ошибки HTTP?
4xx:
400: Проверить формат запроса.
401: Убедиться, что пользователь авторизован.
403: Проверить права доступа.
404: Убедиться, что URL правильный.
5xx:
500: Проверить код сервера (ошибки в логах).
502/504: Проверить настройки Nginx/Proxy.
503: Сервер перегружен → добавить балансировку нагрузки.
Ставь 👍 и забирай 📚 Базу знаний
В HTTP коды состояния указывают, как сервер обработал запрос. Они делятся на 5 категорий:
1xx (Информационные – запрос принят, продолжаем.
2xx (Успешные) – всё хорошо.
3xx (Перенаправления) – запрашиваемый ресурс перемещён.
4xx (Ошибки клиента) – клиент отправил неправильный запрос.
5xx (Ошибки сервера) – сервер не смог обработать запрос.
🚩Как исправить ошибки HTTP?
4xx:
400: Проверить формат запроса.
401: Убедиться, что пользователь авторизован.
403: Проверить права доступа.
404: Убедиться, что URL правильный.
5xx:
500: Проверить код сервера (ошибки в логах).
502/504: Проверить настройки Nginx/Proxy.
503: Сервер перегружен → добавить балансировку нагрузки.
Ставь 👍 и забирай 📚 Базу знаний
👍2
🤔 Что такое динамическое программирование?
Это метод решения задач, при котором большая задача разбивается на перекрывающиеся подзадачи, результаты которых запоминаются (мемоизируются). Подходит для оптимизационных задач: рюкзак, наибольшая общая подпоследовательность, пути в решётке.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Это метод решения задач, при котором большая задача разбивается на перекрывающиеся подзадачи, результаты которых запоминаются (мемоизируются). Подходит для оптимизационных задач: рюкзак, наибольшая общая подпоследовательность, пути в решётке.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2
🤔 Как сгенерировать и применить миграцию?
В Django миграции используются для изменения структуры базы данных (создание, изменение и удаление таблиц и полей).
🚩Генерация миграции (`makemigrations`)
🟠Создаём или изменяем модель (`models.py`)
Пример модели пользователя:
🟠Генерируем миграцию
Запускаем команду:
Django создаст файл миграции в
Проверяем SQL-запрос, который будет выполнен
🚩Применение миграции (`migrate`)
После генерации нужно применить миграции к базе данных:
🚩Что делать, если модель изменилась?
Добавим поле в
Сгенерируем новую миграцию
Применяем изменения к БД
🚩Откат миграций (`migrate <номер>`)
Если нужно откатить последнее изменение:
Ставь 👍 и забирай 📚 Базу знаний
В Django миграции используются для изменения структуры базы данных (создание, изменение и удаление таблиц и полей).
🚩Генерация миграции (`makemigrations`)
🟠Создаём или изменяем модель (`models.py`)
Пример модели пользователя:
from django.db import models
class UserProfile(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
🟠Генерируем миграцию
Запускаем команду:
python manage.py makemigrations
Django создаст файл миграции в
migrations/ migrations/
0001_initial.py # Файл с SQL-изменениями
Проверяем SQL-запрос, который будет выполнен
python manage.py sqlmigrate myapp 0001
🚩Применение миграции (`migrate`)
После генерации нужно применить миграции к базе данных:
python manage.py migrate
🚩Что делать, если модель изменилась?
Добавим поле в
models.py class UserProfile(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
email = models.EmailField(default="example@example.com") # Добавили поле
Сгенерируем новую миграцию
python manage.py makemigrations
Применяем изменения к БД
python manage.py migrate
🚩Откат миграций (`migrate <номер>`)
Если нужно откатить последнее изменение:
python manage.py migrate myapp 0001 # Откат до первой миграции
Ставь 👍 и забирай 📚 Базу знаний