🤔 Разница между модулем и пакетом?
– Модуль — это отдельный файл .py, содержащий код (функции, классы и т.д.).
– Пакет — это директория с модулями и обязательным файлом init.py . Он может содержать несколько связанных модулей.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
– Пакет — это директория с модулями и обязательным файлом
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1🔥1
🤔 Как выбрать данные из двух таблиц без метода join()?
В SQL можно объединять данные из двух таблиц без использования
🚩Использование подзапросов (`SELECT` внутри `SELECT`)
Подзапрос (
Допустим, у нас есть две таблицы:
🚩Использование `IN` или `EXISTS`
Можно фильтровать данные из одной таблицы, проверяя наличие значений в другой.
🚩Объединение данных через `UNION`
Если таблицы имеют схожие колонки, можно объединить их с
🚩Использование `CROSS JOIN` через `WHERE`
Хотя
Ставь 👍 и забирай 📚 Базу знаний
В 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;
Ставь 👍 и забирай 📚 Базу знаний
🤔 Может ли метод объекта вернуть класс?
Да, метод объекта может вернуть класс. Например:
- Метод объекта может использовать имя класса через self.class.
- Это позволяет получить сам класс, к которому принадлежит объект.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Да, метод объекта может вернуть класс. Например:
- Метод объекта может использовать имя класса через self.class.
- Это позволяет получить сам класс, к которому принадлежит объект.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Почему плохо хранить данные SQL в Docker контейнере?
Хранение данных базы данных (SQL) внутри Docker-контейнера не рекомендуется, потому что контейнеры являются временными и одноразовыми. При удалении или пересоздании контейнера все данные внутри него теряются.
🚩Данные удаляются при удалении контейнера
Контейнеры в Docker спроектированы так, чтобы их можно было легко пересоздавать. Если удалить контейнер (
🚩Проблемы с обновлением и масштабированием
Если база данных хранится внутри контейнера, обновить версию MySQL/PostgreSQL будет сложно. При пересоздании контейнера все данные потеряются, и их придется восстанавливать из резервной копии.
🚩Низкая производительность I/O
Хранение данных внутри контейнера может снизить скорость работы базы, потому что Docker использует копию на запись (Copy-on-Write, CoW).
Решение — использовать прямые тома (volumes) или монтировать каталог хоста.
🚩Проблемы с резервным копированием
Если база находится внутри контейнера, то сделать бэкап или восстановить данные сложно.
Лучшее решение: использовать volumes + делать бэкапы через
Ставь 👍 и забирай 📚 Базу знаний
Хранение данных базы данных (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
Ставь 👍 и забирай 📚 Базу знаний
💊5
🤔 Как импортировать всё содержимое модуля?
Через конструкцию from module import *, но этот способ может привести к конфликтам имён, поэтому не рекомендуется в больших проектах.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Через конструкцию from module import *, но этот способ может привести к конфликтам имён, поэтому не рекомендуется в больших проектах.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 Что такое блокировки (локи) в БД?
Блокировка (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), другие запросы ждут бесконечно. Решение: короткие транзакции, автоматическое завершение. 🟠Снижение производительности
Чем больше блокировок, тем медленнее работа БД.
Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Что такое транзакция?
Транзакция — это набор операций с базой данных, выполняющихся как единое целое. Она гарантирует выполнение принципов ACID (атомарность, согласованность, изолированность, долговечность). При сбое все изменения откатываются.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что такое 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()Ставь 👍 и забирай 📚 Базу знаний
👍2
🤔 Зачем нужен *except?
Он позволяет более гибко обрабатывать исключения, когда их несколько в одной группе. Это полезно в асинхронном коде, когда нужно перехватывать и обрабатывать ошибки определённого типа, не теряя информацию о других исключениях.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Он позволяет более гибко обрабатывать исключения, когда их несколько в одной группе. Это полезно в асинхронном коде, когда нужно перехватывать и обрабатывать ошибки определённого типа, не теряя информацию о других исключениях.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2
🤔 Для чего можно использовать celery?
Celery - это очередь задач (task queue), которая позволяет выполнять задачи асинхронно и распределять их между различными рабочими процессами или узлами. Она обычно используется для выполнения долгих и трудоемких операций в фоновом режиме, таких как обработка задач веб-приложений, отправка электронных писем, генерация отчетов, обработка изображений, а также многие другие.
🚩Вот некоторые типичные сценарии использования Celery:
🟠Обработка задач в фоновом режиме
Позволяет обрабатывать задачи в фоновом режиме, что позволяет вашему веб-приложению быстро возвращать ответ пользователю, не ожидая завершения выполнения задачи. Это особенно полезно для выполнения операций, которые могут занимать длительное время, таких как обработка данных или генерация отчетов.
🟠Отправка электронных писем
Может использоваться для отправки электронных писем асинхронно. Это позволяет вашему приложению отправлять уведомления и письма пользователям без блокировки основного потока выполнения.
🟠Обработка изображений
Может использоваться для обработки изображений асинхронно. Например, вы можете использовать его для изменения размера изображений, преобразования форматов или применения фильтров без задержки ответа вашего приложения.
🟠Периодические задачи
Поддерживает периодические задачи, которые могут выполняться автоматически по расписанию. Это позволяет вам запускать задачи на основе времени, что особенно полезно для выполнения регулярных обновлений и обслуживания.
🟠Распределенные вычисления
Позволяет распределенно выполнять задачи на различных узлах или рабочих процессах, что позволяет обрабатывать большие объемы данных и операций параллельно.
Ставь 👍 и забирай 📚 Базу знаний
Celery - это очередь задач (task queue), которая позволяет выполнять задачи асинхронно и распределять их между различными рабочими процессами или узлами. Она обычно используется для выполнения долгих и трудоемких операций в фоновом режиме, таких как обработка задач веб-приложений, отправка электронных писем, генерация отчетов, обработка изображений, а также многие другие.
🚩Вот некоторые типичные сценарии использования Celery:
🟠Обработка задач в фоновом режиме
Позволяет обрабатывать задачи в фоновом режиме, что позволяет вашему веб-приложению быстро возвращать ответ пользователю, не ожидая завершения выполнения задачи. Это особенно полезно для выполнения операций, которые могут занимать длительное время, таких как обработка данных или генерация отчетов.
🟠Отправка электронных писем
Может использоваться для отправки электронных писем асинхронно. Это позволяет вашему приложению отправлять уведомления и письма пользователям без блокировки основного потока выполнения.
🟠Обработка изображений
Может использоваться для обработки изображений асинхронно. Например, вы можете использовать его для изменения размера изображений, преобразования форматов или применения фильтров без задержки ответа вашего приложения.
🟠Периодические задачи
Поддерживает периодические задачи, которые могут выполняться автоматически по расписанию. Это позволяет вам запускать задачи на основе времени, что особенно полезно для выполнения регулярных обновлений и обслуживания.
🟠Распределенные вычисления
Позволяет распределенно выполнять задачи на различных узлах или рабочих процессах, что позволяет обрабатывать большие объемы данных и операций параллельно.
Ставь 👍 и забирай 📚 Базу знаний
🤔 Какая будет сложность вставки/извлечения в dict?
В среднем — константная сложность O(1), что делает словарь очень быстрым. Однако в редких случаях при коллизиях производительность может временно снижаться.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
В среднем — константная сложность O(1), что делает словарь очень быстрым. Однако в редких случаях при коллизиях производительность может временно снижаться.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍3
🤔 Что такое пакет?
Пакет (
🚩Как создать пакет?
Допустим, мы хотим создать пакет
Код в
Код в
Код в
Теперь можно импортировать функции прямо из пакета:
🚩Импорт модулей из пакета
Импортируем весь пакет (с
Импортируем конкретный модуль
Импортируем конкретную функцию из модуля
🚩Как работают пакеты в Python?
Python ищет пакеты по
Если Python не находит пакет, можно добавить путь вручную:
Можно создавать вложенные пакеты
Импорт:
Ставь 👍 и забирай 📚 Базу знаний
Пакет (
package) в Python — это набор модулей, объединённых в одну директорию. Главное отличие от обычной папки — наличие файла __init__.py, который делает директорию пакетом. 🚩Как создать пакет?
Допустим, мы хотим создать пакет
math_utils с модулями для работы с числами. /my_project
/math_utils ← Это пакет
__init__.py ← Делаем директорию пакетом
arithmetic.py ← Модуль с функциями сложения/вычитания
geometry.py ← Модуль с функциями для работы с фигурами
main.py ← Основной файл программы
Код в
arithmetic.pydef add(a, b):
return a + b
def subtract(a, b):
return a - b
Код в
geometry.py def square_area(side):
return side * side
Код в
__init__.py from .arithmetic import add, subtract
from .geometry import square_area
Теперь можно импортировать функции прямо из пакета:
from math_utils import add, square_area
print(add(2, 3)) # 5
print(square_area(4)) # 16
🚩Импорт модулей из пакета
Импортируем весь пакет (с
__init__.py) from math_utils import add, square_area
Импортируем конкретный модуль
from math_utils import arithmetic
print(arithmetic.add(3, 5))
Импортируем конкретную функцию из модуля
from math_utils.arithmetic import add
print(add(3, 5))
🚩Как работают пакеты в Python?
Python ищет пакеты по
sys.path import sys
print(sys.path) # Пути, где Python ищет модули
Если Python не находит пакет, можно добавить путь вручную:
import sys
sys.path.append("/path/to/my_project")
Можно создавать вложенные пакеты
/my_project
/math_utils
__init__.py
/advanced
__init__.py
calculus.py
Импорт:
from math_utils.advanced.calculus import derivative
Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 Как написать декоратор, чтобы он работал с параметрами?
Для этого создаётся функция, возвращающая декоратор, и уже внутри — основная логика. Такая структура позволяет передавать аргументы декоратору и использовать их при обёртывании функции.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Для этого создаётся функция, возвращающая декоратор, и уже внутри — основная логика. Такая структура позволяет передавать аргументы декоратору и использовать их при обёртывании функции.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 В чем отличие изменяемые / неизменяемые?
В Python все данные делятся на изменяемые (mutable) и неизменяемые (immutable)
🚩Неизменяемые (`immutable`) типы
После создания их нельзя изменить!
Пример:
🚩Изменяемые (`mutable`) типы
Можно менять их содержимое без создания нового объекта.
Пример:
🚩Почему это важно?
Неизменяемые объекты безопаснее для ключей
Используем
Ошибки с изменяемыми значениями по умолчанию
Используем
🚩Копирование объектов (`copy()` vs `deepcopy()`)
Используем
Ставь 👍 и забирай 📚 Базу знаний
В Python все данные делятся на изменяемые (mutable) и неизменяемые (immutable)
🚩Неизменяемые (`immutable`) типы
После создания их нельзя изменить!
x = 10
print(id(x)) # 140735598722544 (адрес в памяти)
x = x + 5 # Создаётся новый объект!
print(id(x)) # 140735598722704 (новый адрес)
Пример:
str неизменяемая s = "hello"
print(id(s)) # 140735598723664
s = s + " world" # Создаётся новая строка!
print(id(s)) # 140735598724240 (новый адрес)
🚩Изменяемые (`mutable`) типы
Можно менять их содержимое без создания нового объекта.
lst = [1, 2, 3]
print(id(lst)) # 140735598722544
lst.append(4) # Изменяем список
print(id(lst)) # 140735598722544 (адрес остался тот же!)
Пример:
dict изменяемый d = {"name": "Alice"}
print(id(d)) # 140735598723664
d["age"] = 25 # Добавляем ключ
print(id(d)) # 140735598723664 (адрес не изменился!)🚩Почему это важно?
Неизменяемые объекты безопаснее для ключей
dict и set d = {}
d[[1, 2, 3]] = "Ошибка!" # ❌ TypeError: unhashable type: 'list'Используем
tuple вместо list (он неизменяемый) d[(1, 2, 3)] = "OK"
Ошибки с изменяемыми значениями по умолчанию
def add_item(lst=[]): # ❌ Опасный код!
lst.append(1)
return lst
print(add_item()) # [1]
print(add_item()) # [1, 1] ❌ Список не создаётся заново!
Используем
None вместо списка def add_item(lst=None):
if lst is None:
lst = []
lst.append(1)
return lst
🚩Копирование объектов (`copy()` vs `deepcopy()`)
copy() делает поверхностную копию (новый объект, но старые вложенные элементы). deepcopy() делает глубокую копию (всё новое). import copy
lst1 = [[1, 2, 3], [4, 5, 6]]
lst2 = copy.copy(lst1) # Поверхностная копия
lst2[0][0] = 99
print(lst1) # [[99, 2, 3], [4, 5, 6]] ❌ Исходный список изменился!
Используем
deepcopy() для полной независимой копии lst3 = copy.deepcopy(lst1)
lst3[0][0] = 100
print(lst1) # [[99, 2, 3], [4, 5, 6]] ✅ Не изменился!
Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Что такое хешируемые типы данных?
Это типы данных, которые имеют постоянное значение хеша и неизменяемы. Только такие типы можно использовать как ключи в словарях или элементы во множествах. Примеры: строки, числа, кортежи (если внутри только хешируемые элементы).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Это типы данных, которые имеют постоянное значение хеша и неизменяемы. Только такие типы можно использовать как ключи в словарях или элементы во множествах. Примеры: строки, числа, кортежи (если внутри только хешируемые элементы).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 Что такое IP адрес и доменное имя?
Это два важных понятия в контексте работы интернета и компьютерных сетей. Они используются для идентификации устройств и ресурсов в сети, а также для упрощения доступа к ним.
🚩IP-адрес (Internet Protocol Address)
Это уникальный числовой идентификатор, присваиваемый каждому устройству, подключенному к сети, использующей протокол IP (Internet Protocol). IP-адреса используются для маршрутизации пакетов данных между устройствами в сети.
🟠IPv4 (Internet Protocol version 4)
Формат: 32-битные числа, записанные в виде четырех десятичных чисел, разделенных точками (например, 192.168.1.1). Пример: 192.168.0.1, 8.8.8.8
🟠IPv6 (Internet Protocol version 6)
Формат: 128-битные числа, записанные в виде восьми групп шестнадцатеричных чисел, разделенных двоеточиями (например, 2001:0db8:85a3:0000:0000:8a2e:0370:7334). Пример: 2001:0db8:85a3:0000:0000:8a2e:0370:7334, ::1 (loopback адрес)
🚩Доменное имя
Это удобочитаемое имя, используемое для идентификации IP-адреса на уровне пользователя. Доменные имена упрощают доступ к ресурсам в интернете, так как их легче запомнить и использовать, чем числовые IP-адреса.
🟠Top-Level Domain (TLD)
Верхний уровень, например, .com, .org, .net.
🟠Second-Level Domain (SLD)
Основная часть доменного имени, например, example в example.com.
🟠Subdomain
Дополнительные уровни, например, www в www.example.com.
🚩Преобразование доменных имен в IP-адреса
Для преобразования доменных имен в IP-адреса используется система доменных имен (DNS, Domain Name System). DNS-серверы выполняют роль "телефонной книги" интернета, переводя доменные имена в соответствующие им IP-адреса.
Ставь 👍 и забирай 📚 Базу знаний
Это два важных понятия в контексте работы интернета и компьютерных сетей. Они используются для идентификации устройств и ресурсов в сети, а также для упрощения доступа к ним.
🚩IP-адрес (Internet Protocol Address)
Это уникальный числовой идентификатор, присваиваемый каждому устройству, подключенному к сети, использующей протокол IP (Internet Protocol). IP-адреса используются для маршрутизации пакетов данных между устройствами в сети.
🟠IPv4 (Internet Protocol version 4)
Формат: 32-битные числа, записанные в виде четырех десятичных чисел, разделенных точками (например, 192.168.1.1). Пример: 192.168.0.1, 8.8.8.8
🟠IPv6 (Internet Protocol version 6)
Формат: 128-битные числа, записанные в виде восьми групп шестнадцатеричных чисел, разделенных двоеточиями (например, 2001:0db8:85a3:0000:0000:8a2e:0370:7334). Пример: 2001:0db8:85a3:0000:0000:8a2e:0370:7334, ::1 (loopback адрес)
🚩Доменное имя
Это удобочитаемое имя, используемое для идентификации IP-адреса на уровне пользователя. Доменные имена упрощают доступ к ресурсам в интернете, так как их легче запомнить и использовать, чем числовые IP-адреса.
🟠Top-Level Domain (TLD)
Верхний уровень, например, .com, .org, .net.
🟠Second-Level Domain (SLD)
Основная часть доменного имени, например, example в example.com.
🟠Subdomain
Дополнительные уровни, например, www в www.example.com.
🚩Преобразование доменных имен в IP-адреса
Для преобразования доменных имен в IP-адреса используется система доменных имен (DNS, Domain Name System). DNS-серверы выполняют роль "телефонной книги" интернета, переводя доменные имена в соответствующие им IP-адреса.
Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Какие преимущества использования функций?
Функции упрощают поддержку кода, делают его переиспользуемым и модульным. Они способствуют разбиению программы на логические части, что облегчает отладку и тестирование. Также они позволяют сократить объём кода и сделать его более понятным.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Функции упрощают поддержку кода, делают его переиспользуемым и модульным. Они способствуют разбиению программы на логические части, что облегчает отладку и тестирование. Также они позволяют сократить объём кода и сделать его более понятным.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2
🤔 Какие бывают виды тестов?
Существует несколько видов тестов, каждый из которых имеет свою цель и особенности.
🚩Виды
🟠Юнит-тесты (Unit Tests)
Проверка работы отдельных модулей или функций в изоляции от других частей системы.
Ориентированы на минимальные части кода (функции, методы, классы).
Высокая скорость выполнения.
Простота написания и отладки.
Обычно пишутся разработчиками.
🟠Интеграционные тесты (Integration Tests)
Проверка взаимодействия между различными модулями или компонентами системы.
Тестируют комбинации модулей и их взаимодействие.
Более сложные и медленные по сравнению с юнит-тестами.
Могут выявить проблемы в интерфейсах между модулями.
🟠Системные тесты (System Tests)
Проверка всей системы целиком на соответствие требованиям.
Тестируют систему в рабочей среде.
Включают проверку всех функциональных и нефункциональных требований.
Могут включать пользовательские сценарии.
Тестирование веб-приложения на основе реальных пользовательских сценариев, включая проверку интерфейса, баз данных и API.
🟠Приемочные тесты (Acceptance Tests)
Проверка соответствия системы требованиям и ожиданиям заказчика или конечного пользователя.
Часто выполняются вместе с заказчиком или пользователем.
Фокусируются на бизнес-требованиях и пользовательских сценариях.
Успешное прохождение приемочных тестов является критерием готовности системы к выпуску.
Тестирование нового функционала с участием конечных пользователей для проверки его удобства и соответствия их ожиданиям.
🟠Регрессионные тесты (Regression Tests)
Убедиться, что изменения в коде не вызвали новых ошибок в уже работающем функционале.
Выполняются после внесения изменений в код.
Обычно автоматизируются и включают повторное выполнение всех или части существующих тестов.
Повторное выполнение всех юнит-тестов и интеграционных тестов после рефакторинга кода.
🟠Нефункциональные тесты (Non-functional Tests)
Проверка нефункциональных аспектов системы, таких как производительность, безопасность, удобство использования и др.
🚩Основные виды:
🟠Тесты производительности
Измеряют скорость выполнения, пропускную способность и время отклика системы.
🟠Тесты безопасности
Оценивают защищенность системы от угроз и атак.
🟠Тесты удобства использования
Проверяют удобство и интуитивность пользовательского интерфейса.
Ставь 👍 и забирай 📚 Базу знаний
Существует несколько видов тестов, каждый из которых имеет свою цель и особенности.
🚩Виды
🟠Юнит-тесты (Unit Tests)
Проверка работы отдельных модулей или функций в изоляции от других частей системы.
Ориентированы на минимальные части кода (функции, методы, классы).
Высокая скорость выполнения.
Простота написания и отладки.
Обычно пишутся разработчиками.
def add(a, b):
return a + b
def test_add():
assert add(1, 2) == 3
🟠Интеграционные тесты (Integration Tests)
Проверка взаимодействия между различными модулями или компонентами системы.
Тестируют комбинации модулей и их взаимодействие.
Более сложные и медленные по сравнению с юнит-тестами.
Могут выявить проблемы в интерфейсах между модулями.
def fetch_data_from_api():
response = requests.get('https://api.example.com/data')
return response.json()
def test_fetch_data_from_api():
data = fetch_data_from_api()
assert 'key' in data
🟠Системные тесты (System Tests)
Проверка всей системы целиком на соответствие требованиям.
Тестируют систему в рабочей среде.
Включают проверку всех функциональных и нефункциональных требований.
Могут включать пользовательские сценарии.
Тестирование веб-приложения на основе реальных пользовательских сценариев, включая проверку интерфейса, баз данных и API.
🟠Приемочные тесты (Acceptance Tests)
Проверка соответствия системы требованиям и ожиданиям заказчика или конечного пользователя.
Часто выполняются вместе с заказчиком или пользователем.
Фокусируются на бизнес-требованиях и пользовательских сценариях.
Успешное прохождение приемочных тестов является критерием готовности системы к выпуску.
Тестирование нового функционала с участием конечных пользователей для проверки его удобства и соответствия их ожиданиям.
🟠Регрессионные тесты (Regression Tests)
Убедиться, что изменения в коде не вызвали новых ошибок в уже работающем функционале.
Выполняются после внесения изменений в код.
Обычно автоматизируются и включают повторное выполнение всех или части существующих тестов.
Повторное выполнение всех юнит-тестов и интеграционных тестов после рефакторинга кода.
🟠Нефункциональные тесты (Non-functional Tests)
Проверка нефункциональных аспектов системы, таких как производительность, безопасность, удобство использования и др.
🚩Основные виды:
🟠Тесты производительности
Измеряют скорость выполнения, пропускную способность и время отклика системы.
🟠Тесты безопасности
Оценивают защищенность системы от угроз и атак.
🟠Тесты удобства использования
Проверяют удобство и интуитивность пользовательского интерфейса.
Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Когда выполняется файл __init__.py?
Этот файл выполняется при первом импорте модуля или пакета, в котором он находится. Он может содержать код инициализации или указывать, какие модули нужно экспортировать при импорте пакета. В современных версиях Python он не обязателен, но по-прежнему широко используется.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Этот файл выполняется при первом импорте модуля или пакета, в котором он находится. Он может содержать код инициализации или указывать, какие модули нужно экспортировать при импорте пакета. В современных версиях Python он не обязателен, но по-прежнему широко используется.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍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'>
Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Где лучше хранить хеш запроса — в Redis или PostgreSQL?
- Redis — лучше для временного хранения, кэширования, частого доступа;
- PostgreSQL — если хеш должен быть постоянным, использоваться в связях и аналитике.
Если нужны быстродействие и частые запросы — Redis. Если нужна надёжность и история — PostgreSQL.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
- Redis — лучше для временного хранения, кэширования, частого доступа;
- PostgreSQL — если хеш должен быть постоянным, использоваться в связях и аналитике.
Если нужны быстродействие и частые запросы — Redis. Если нужна надёжность и история — PostgreSQL.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍3🔥1