🤔 Какие объекты можно положить в множество?
В Python множество (
🚩Можно добавить в `set`:
Числа (
Строки (
Кортежи (
Булевые значения (
🚩Нельзя добавить в `set`
Изменяемые объекты (
Кортежи с изменяемыми элементами
Ставь 👍 и забирай 📚 Базу знаний
В Python множество (
set) — это неупорядоченная коллекция уникальных элементов, которая работает на основе хеш-таблицы. Это значит, что только хешируемые (immutable) объекты могут быть добавлены в set.🚩Можно добавить в `set`:
Числа (
int, float, complex) s = {1, 2.5, 3+4j}Строки (
str) s = {"apple", "banana", "cherry"}Кортежи (
tuple), если они тоже содержат только неизменяемые объекты s = {(1, 2), ("a", "b")}Булевые значения (
bool)** (но True считается 1, а False — 0) s = {True, False, 1, 0}
print(s) # {False, True} (0 и 1 не добавятся повторно)🚩Нельзя добавить в `set`
Изменяемые объекты (
list, set, dict) s = { [1, 2, 3] } # Ошибка: TypeError: unhashable type: 'list' s = { {"key": "value"} } # Ошибка: TypeError: unhashable type: 'dict'Кортежи с изменяемыми элементами
s = { (1, [2, 3]) } # Ошибка: TypeErrorСтавь 👍 и забирай 📚 Базу знаний
👍8
🤔 Строка — это последовательность или нет?
Да, в Python строка (str) — это последовательность символов, поддерживающая индексацию, срезы и итерируемость.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Да, в Python строка (str) — это последовательность символов, поддерживающая индексацию, срезы и итерируемость.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍8🔥1
🤔 Что такое многопоточность/многопроцессорность?
В программировании многопоточность и многопроцессорность помогают выполнять задачи параллельно, но работают по-разному.
🟠Многопоточность (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 завершил работу
Все процессы завершены
Ставь 👍 и забирай 📚 Базу знаний
👍5
🤔 Что такое self?
Это ссылка на текущий экземпляр класса, используемая для доступа к атрибутам и методам объекта.
Он всегда первым аргументом передаётся в методы экземпляра класса.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Это ссылка на текущий экземпляр класса, используемая для доступа к атрибутам и методам объекта.
Он всегда первым аргументом передаётся в методы экземпляра класса.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍9🔥2💊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()Ставь 👍 и забирай 📚 Базу знаний
👍9
🤔 Какие типы HTTP запросов знаешь? В чем их отличия?
Типы: GET (получение данных), POST (отправка данных), PUT (обновление ресурса), DELETE (удаление ресурса), PATCH (частичное обновление). GET передаёт параметры в URL, а POST отправляет данные в теле запроса. PUT и DELETE изменяют состояние сервера, а PATCH обновляет только указанные части ресурса.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Типы: GET (получение данных), POST (отправка данных), PUT (обновление ресурса), DELETE (удаление ресурса), PATCH (частичное обновление). GET передаёт параметры в URL, а POST отправляет данные в теле запроса. PUT и DELETE изменяют состояние сервера, а PATCH обновляет только указанные части ресурса.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍7
🤔 В чем отличия pytz от datetime?
🟠`datetime` – встроенный модуль Python
Модуль
🟠`pytz` – внешний модуль для работы с часовыми поясами
Библиотека
🚩Как работать с часовыми поясами правильно?
Создание
Конвертация времени между часовыми поясами
Использование UTC (лучший подход для серверов)
Ставь 👍 и забирай 📚 Базу знаний
🟠`datetime` – встроенный модуль Python
Модуль
datetime позволяет работать с датами и временем, но по умолчанию он не поддерживает часовые пояса.from datetime import datetime
dt = datetime.now() # Получаем текущую дату и время
print(dt) # Например: 2024-02-28 14:30:00.123456
print(dt.tzinfo) # None (нет информации о часовом поясе)
🟠`pytz` – внешний модуль для работы с часовыми поясами
Библиотека
pytz добавляет поддержку часовых поясов и позволяет работать с разными временными зонами. from datetime import datetime
import pytz
tz = pytz.timezone("Europe/Moscow") # Часовой пояс Москвы
dt = datetime.now(tz) # Получаем текущее время с учетом часового пояса
print(dt) # Например: 2024-02-28 17:30:00+03:00
print(dt.tzinfo) # Europe/Moscow
🚩Как работать с часовыми поясами правильно?
Создание
datetime с часовым поясом pytz dt = datetime(2024, 2, 28, 15, 0) # Наивная дата
tz = pytz.timezone("Europe/Moscow")
dt = tz.localize(dt) # Присваиваем часовой пояс
print(dt) # 2024-02-28 15:00:00+03:00
Конвертация времени между часовыми поясами
ny_tz = pytz.timezone("America/New_York")
ny_time = dt.astimezone(ny_tz)
print(ny_time) # Конвертированное время в Нью-ЙоркеИспользование UTC (лучший подход для серверов)
utc_now = datetime.now(pytz.UTC) # Текущее время в UTC
print(utc_now) # Например: 2024-02-28 14:30:00+00:00
Ставь 👍 и забирай 📚 Базу знаний
👍6🤔1💊1
🤔 Что такое Docker image?
Docker image — это шаблон неизменяемой файловой системы, содержащий всё необходимое для запуска приложения: ОС, библиотеки, зависимости, файлы. Из образа можно запускать один или несколько контейнеров.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Docker image — это шаблон неизменяемой файловой системы, содержащий всё необходимое для запуска приложения: ОС, библиотеки, зависимости, файлы. Из образа можно запускать один или несколько контейнеров.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍4
🤔 Для чего можно использовать celery?
Celery - это очередь задач (task queue), которая позволяет выполнять задачи асинхронно и распределять их между различными рабочими процессами или узлами. Она обычно используется для выполнения долгих и трудоемких операций в фоновом режиме, таких как обработка задач веб-приложений, отправка электронных писем, генерация отчетов, обработка изображений, а также многие другие.
🚩Вот некоторые типичные сценарии использования Celery:
🟠Обработка задач в фоновом режиме
Позволяет обрабатывать задачи в фоновом режиме, что позволяет вашему веб-приложению быстро возвращать ответ пользователю, не ожидая завершения выполнения задачи. Это особенно полезно для выполнения операций, которые могут занимать длительное время, таких как обработка данных или генерация отчетов.
🟠Отправка электронных писем
Может использоваться для отправки электронных писем асинхронно. Это позволяет вашему приложению отправлять уведомления и письма пользователям без блокировки основного потока выполнения.
🟠Обработка изображений
Может использоваться для обработки изображений асинхронно. Например, вы можете использовать его для изменения размера изображений, преобразования форматов или применения фильтров без задержки ответа вашего приложения.
🟠Периодические задачи
Поддерживает периодические задачи, которые могут выполняться автоматически по расписанию. Это позволяет вам запускать задачи на основе времени, что особенно полезно для выполнения регулярных обновлений и обслуживания.
🟠Распределенные вычисления
Позволяет распределенно выполнять задачи на различных узлах или рабочих процессах, что позволяет обрабатывать большие объемы данных и операций параллельно.
Ставь 👍 и забирай 📚 Базу знаний
Celery - это очередь задач (task queue), которая позволяет выполнять задачи асинхронно и распределять их между различными рабочими процессами или узлами. Она обычно используется для выполнения долгих и трудоемких операций в фоновом режиме, таких как обработка задач веб-приложений, отправка электронных писем, генерация отчетов, обработка изображений, а также многие другие.
🚩Вот некоторые типичные сценарии использования Celery:
🟠Обработка задач в фоновом режиме
Позволяет обрабатывать задачи в фоновом режиме, что позволяет вашему веб-приложению быстро возвращать ответ пользователю, не ожидая завершения выполнения задачи. Это особенно полезно для выполнения операций, которые могут занимать длительное время, таких как обработка данных или генерация отчетов.
🟠Отправка электронных писем
Может использоваться для отправки электронных писем асинхронно. Это позволяет вашему приложению отправлять уведомления и письма пользователям без блокировки основного потока выполнения.
🟠Обработка изображений
Может использоваться для обработки изображений асинхронно. Например, вы можете использовать его для изменения размера изображений, преобразования форматов или применения фильтров без задержки ответа вашего приложения.
🟠Периодические задачи
Поддерживает периодические задачи, которые могут выполняться автоматически по расписанию. Это позволяет вам запускать задачи на основе времени, что особенно полезно для выполнения регулярных обновлений и обслуживания.
🟠Распределенные вычисления
Позволяет распределенно выполнять задачи на различных узлах или рабочих процессах, что позволяет обрабатывать большие объемы данных и операций параллельно.
Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 pickle.dumps / pickle.dump, pickle.loads / pickle.load?
Эти функции сериализуют и десериализуют Python-объекты в бинарном формате. В отличие от JSON, pickle поддерживает больше типов, но может быть небезопасен для недоверенных данных.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Эти функции сериализуют и десериализуют Python-объекты в бинарном формате. В отличие от JSON, pickle поддерживает больше типов, но может быть небезопасен для недоверенных данных.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 Какие есть особенности исключения в Python?
В Python исключения (
Все исключения в Python — это объекты, унаследованные от
Все исключения унаследованы от
Можно перехватывать несколько исключений
Если не знаем, какая ошибка может произойти:
Можно создать свой класс ошибки, унаследованный от
Ставь 👍 и забирай 📚 Базу знаний
В Python исключения (
exceptions) — это специальные объекты, которые возникают при ошибках и прерывают выполнение программы, если их не обработать.Все исключения в Python — это объекты, унаследованные от
BaseException. try:
1 / 0
except ZeroDivisionError as e:
print(type(e)) # <class 'ZeroDivisionError'>
print(e) # division by zero
Все исключения унаследованы от
BaseException: BaseException
├── Exception
│ ├── ArithmeticError
│ │ ├── ZeroDivisionError
│ │ ├── OverflowError
│ ├── ValueError
│ ├── IndexError
│ ├── KeyError
│ ├── TypeError
├── SystemExit
├── KeyboardInterrupt
Можно перехватывать несколько исключений
try:
x = int("abc") # Ошибка ValueError
except (ValueError, TypeError) as e:
print(f"Ошибка: {e}")
Если не знаем, какая ошибка может произойти:
try:
x = 1 / 0
except Exception as e:
print(f"Ошибка: {e}") # division by zero
finally выполняется всегда try:
1 / 0
except ZeroDivisionError:
print("Ошибка!")
finally:
print("Этот код выполнится всегда")
raise позволяет выбрасывать исключения вручную raise ValueError("Ошибка: неверное значение!")Можно создать свой класс ошибки, унаследованный от
Exception: class MyError(Exception):
pass
raise MyError("Это моя ошибка!")
Ставь 👍 и забирай 📚 Базу знаний
👍2
🤔 Threading что это?
Threading в Python — это использование потоков для выполнения множества задач одновременно в рамках одного процесса. Это полезно для выполнения I/O-задержанных задач и повышения реактивности программы. Однако из-за глобальной блокировки интерпретатора (GIL) в CPython, потоки не всегда могут эффективно использоваться для задач, требующих интенсивных вычислений.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2🔥1
🤔 Как управлять кешированием в HTTP?
Кэширование в HTTP позволяет уменьшить нагрузку на сервер и ускорить загрузку страниц за счёт сохранения копий ресурсов.
Управление кэшем происходит через HTTP-заголовки, которые указывают, как долго хранить данные и когда обновлять их.
🟠Управление кэшированием через `Cache-Control`
🟠Управление кэшем с `ETag` (оптимизированное обновление)
Сервер отправляет ресурс с
При следующем запросе браузер отправляет
Если ресурс не изменился, сервер отвечает
Если ресурс изменился — сервер отправляет новую версию.
🟠Кэширование через `Last-Modified`
Работает аналогично
Сервер отправляет заголовок
Браузер запрашивает ресурс с
🟠Полное отключение кэша
Если нужно всегда загружать свежие данные, используем:
🟠Управление кэшем через `Vary`
Если ресурс зависит от заголовков (
🟠Принудительное обновление кэша (Cache Busting)
Если сервер отправил старый кэш, можно обновить ресурс с новым URL.
Способы
Добавить версию в URL
Использовать хеш в имени файла:
Ставь 👍 и забирай 📚 Базу знаний
Кэширование в HTTP позволяет уменьшить нагрузку на сервер и ускорить загрузку страниц за счёт сохранения копий ресурсов.
Управление кэшем происходит через HTTP-заголовки, которые указывают, как долго хранить данные и когда обновлять их.
🟠Управление кэшированием через `Cache-Control`
Cache-Control — основной заголовок для кэширования, который указывает, как долго хранить ресурс и когда обновлять его.Cache-Control: no-cache # Браузер всегда запрашивает ресурс заново
Cache-Control: no-store # Запрещает кэширование вообще
Cache-Control: public, max-age=3600 # Кэшировать 1 час (3600 секунд)
Cache-Control: private, max-age=600 # Кэш только для одного пользователя (например, личный кабинет)
Cache-Control: must-revalidate # Клиент должен проверять, истёк ли срок кэша перед загрузкой
🟠Управление кэшем с `ETag` (оптимизированное обновление)
ETag — это уникальный идентификатор версии файла. Сервер отправляет ресурс с
ETag: ETag: "abc123"
При следующем запросе браузер отправляет
If-None-Match: If-None-Match: "abc123"
Если ресурс не изменился, сервер отвечает
304 Not Modified (клиент использует кэш). Если ресурс изменился — сервер отправляет новую версию.
HTTP/1.1 304 Not Modified
🟠Кэширование через `Last-Modified`
Работает аналогично
ETag, но вместо идентификатора используется дата последнего изменения.Сервер отправляет заголовок
Last-Modified: Wed, 21 Feb 2024 10:00:00 GMT
Браузер запрашивает ресурс с
If-Modified-Since If-Modified-Since: Wed, 21 Feb 2024 10:00:00 GMT
🟠Полное отключение кэша
Если нужно всегда загружать свежие данные, используем:
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache # Устарел, но нужен для старых браузеров
Expires: 0
🟠Управление кэшем через `Vary`
Если ресурс зависит от заголовков (
User-Agent, Accept-Encoding), используем Vary.Vary: User-Agent
🟠Принудительное обновление кэша (Cache Busting)
Если сервер отправил старый кэш, можно обновить ресурс с новым URL.
Способы
Добавить версию в URL
/style.css?v=2
Использовать хеш в имени файла:
/style.abc123.css
Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Что такое полиморфизм?
Полиморфизм — это способность объектов разных классов реагировать на один и тот же метод по-разному. В Python полиморфизм достигается через динамическую типизацию, где методы с одинаковыми именами могут вызываться для объектов разных классов. Это позволяет писать более гибкий и расширяемый код, так как один интерфейс может использоваться для взаимодействия с разными типами данных. Полиморфизм делает программы более абстрактными и удобными для расширения.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍5
🤔 Что такое RESTful?
Это подход к проектированию веб-сервисов, основанный на архитектурном стиле REST (*Representational State Transfer*). Это не протокол или стандарт, а набор принципов и ограничений, которые используются для создания систем, взаимодействующих через HTTP. Если API соответствует этим принципам, его называют RESTful.
🚩 Основные принципы REST
🟠Клиент-серверная архитектура
Клиент (например, браузер или мобильное приложение) и сервер (где размещена база данных и логика обработки данных) чётко разделены:
Клиент запрашивает данные или отправляет запросы к серверу.
Сервер отвечает, предоставляя ресурсы или выполняя действия.
🟠Состояние отсутствия (Stateless)
Каждый запрос от клиента к серверу должен быть самодостаточным. Это означает, что сервер не хранит информацию о состоянии клиента между запросами. Вся необходимая информация передается в запросе (например, токен аутентификации).
🟠Унифицированный интерфейс
RESTful API использует единый, стандартный интерфейс для взаимодействия. Это достигается следующими средствами:
Идентификация ресурсов через URI: Каждый ресурс имеет уникальный адрес (URI).
Использование стандартных HTTP-методов:
GET — для получения данных.
POST — для создания новых данных.
PUT или PATCH — для обновления данных.
DELETE — для удаления данных.
Ресурсы как представления: Ресурсы передаются в формате JSON, XML или другом формате.
🟠Кэширование
Ответы сервера могут быть кэшируемыми. Это уменьшает нагрузку на сервер и ускоряет работу клиента.
🟠Единообразие и слои
RESTful системы могут включать несколько слоев (например, балансировщики нагрузки, кеш-сервисы), но клиент взаимодействует только с сервером, не зная о внутренних слоях.
🟠Код по требованию (опционально)
Иногда сервер может передавать исполняемый код (например, JavaScript) клиенту, чтобы расширить его функциональность. Это не обязательно.
🚩Почему RESTful важен?
RESTful архитектура позволяет:
🟠Сделать API простым и понятным
Клиенты легко понимают, как обращаться к ресурсам (используя стандартные методы и адреса).
🟠Обеспечить гибкость
Клиенты и серверы могут развиваться независимо друг от друга.
🟠Поддерживать масштабируемость
RESTful API легко масштабируются, так как все запросы независимы друг от друга (статичность).
🟠Облегчить интеграцию
RESTful API поддерживают стандартизированные протоколы (HTTP), что делает интеграцию с другими сервисами проще.
Ставь 👍 и забирай 📚 Базу знаний
Это подход к проектированию веб-сервисов, основанный на архитектурном стиле REST (*Representational State Transfer*). Это не протокол или стандарт, а набор принципов и ограничений, которые используются для создания систем, взаимодействующих через HTTP. Если API соответствует этим принципам, его называют RESTful.
🚩 Основные принципы REST
🟠Клиент-серверная архитектура
Клиент (например, браузер или мобильное приложение) и сервер (где размещена база данных и логика обработки данных) чётко разделены:
Клиент запрашивает данные или отправляет запросы к серверу.
Сервер отвечает, предоставляя ресурсы или выполняя действия.
🟠Состояние отсутствия (Stateless)
Каждый запрос от клиента к серверу должен быть самодостаточным. Это означает, что сервер не хранит информацию о состоянии клиента между запросами. Вся необходимая информация передается в запросе (например, токен аутентификации).
🟠Унифицированный интерфейс
RESTful API использует единый, стандартный интерфейс для взаимодействия. Это достигается следующими средствами:
Идентификация ресурсов через URI: Каждый ресурс имеет уникальный адрес (URI).
GET https://api.example.com/users/123
Использование стандартных HTTP-методов:
GET — для получения данных.
POST — для создания новых данных.
PUT или PATCH — для обновления данных.
DELETE — для удаления данных.
Ресурсы как представления: Ресурсы передаются в формате JSON, XML или другом формате.
🟠Кэширование
Ответы сервера могут быть кэшируемыми. Это уменьшает нагрузку на сервер и ускоряет работу клиента.
🟠Единообразие и слои
RESTful системы могут включать несколько слоев (например, балансировщики нагрузки, кеш-сервисы), но клиент взаимодействует только с сервером, не зная о внутренних слоях.
🟠Код по требованию (опционально)
Иногда сервер может передавать исполняемый код (например, JavaScript) клиенту, чтобы расширить его функциональность. Это не обязательно.
🚩Почему RESTful важен?
RESTful архитектура позволяет:
🟠Сделать API простым и понятным
Клиенты легко понимают, как обращаться к ресурсам (используя стандартные методы и адреса).
🟠Обеспечить гибкость
Клиенты и серверы могут развиваться независимо друг от друга.
🟠Поддерживать масштабируемость
RESTful API легко масштабируются, так как все запросы независимы друг от друга (статичность).
🟠Облегчить интеграцию
RESTful API поддерживают стандартизированные протоколы (HTTP), что делает интеграцию с другими сервисами проще.
Ставь 👍 и забирай 📚 Базу знаний
💊2
🤔 Какие стратегии расширения Django известны?
Django можно расширять через подключение сторонних библиотек, создание middleware, написание собственных шаблонных фильтров, а также использование сигналов и кастомных полей моделей.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 Какие ограничения есть у рекурсии в Python?
Рекурсия — это мощный инструмент, но в Python она имеет ограничения, которые нужно учитывать при написании кода.
🟠Ограничение на глубину рекурсии (`sys.getrecursionlimit()`)
В Python по умолчанию рекурсия ограничена 1000 вызовами, чтобы избежать переполнения стека.
Если превысить этот лимит, программа вызовет ошибку
🚩Как изменить лимит?
Можно увеличить глубину рекурсии, но это небезопасно
🟠Рекурсия требует много памяти
Каждый рекурсивный вызов создаёт новый фрейм в стеке вызовов.
🟠Отсутствие оптимизации хвостовой рекурсии
Другие языки (например, Lisp, JavaScript) автоматически оптимизируют хвостовую рекурсию (Tail Call Optimization, TCO).
Python не делает этого, поэтому даже "идеальная" рекурсия всё равно переполняет стек.
🟠Рекурсия медленнее цикла
Рекурсивный вызов требует больше накладных расходов (создание стек-фреймов), чем обычный
Ставь 👍 и забирай 📚 Базу знаний
Рекурсия — это мощный инструмент, но в Python она имеет ограничения, которые нужно учитывать при написании кода.
🟠Ограничение на глубину рекурсии (`sys.getrecursionlimit()`)
В Python по умолчанию рекурсия ограничена 1000 вызовами, чтобы избежать переполнения стека.
import sys
print(sys.getrecursionlimit()) # 1000 (обычное значение)
Если превысить этот лимит, программа вызовет ошибку
def recursive():
return recursive()
recursive() # RecursionError: maximum recursion depth exceeded
🚩Как изменить лимит?
Можно увеличить глубину рекурсии, но это небезопасно
sys.setrecursionlimit(2000) # Увеличиваем до 2000
🟠Рекурсия требует много памяти
Каждый рекурсивный вызов создаёт новый фрейм в стеке вызовов.
def factorial(n):
if n == 1:
return 1
return n * factorial(n - 1)
print(factorial(10000)) # Ошибка из-за переполнения стека
🟠Отсутствие оптимизации хвостовой рекурсии
Другие языки (например, Lisp, JavaScript) автоматически оптимизируют хвостовую рекурсию (Tail Call Optimization, TCO).
Python не делает этого, поэтому даже "идеальная" рекурсия всё равно переполняет стек.
def tail_recursive(n, acc=1):
if n == 1:
return acc
return tail_recursive(n - 1, n * acc)
print(tail_recursive(1000)) # Всё равно вызовет RecursionError
🟠Рекурсия медленнее цикла
Рекурсивный вызов требует больше накладных расходов (создание стек-фреймов), чем обычный
for или while.# Итеративный вариант (быстрее)
def factorial_iter(n):
result = 1
for i in range(1, n + 1):
result *= i
return result
# Рекурсивный вариант (медленнее)
def factorial_rec(n):
if n == 1:
return 1
return n * factorial_rec(n - 1)
Ставь 👍 и забирай 📚 Базу знаний
👍5
🤔 Что быстрее — списки или кортежи?
Кортежи быстрее списков, так как они неизменяемы, легче и оптимальнее с точки зрения памяти. Это делает операции над ними (особенно доступ) немного производительнее.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Кортежи быстрее списков, так как они неизменяемы, легче и оптимальнее с точки зрения памяти. Это делает операции над ними (особенно доступ) немного производительнее.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍7🔥1💊1
🤔 Что такое деструктор класса?
Это специальный метод, который вызывается автоматически, когда объект класса уничтожается. В Python этот метод называется
🚩Определение и использование деструктора
Определяется внутри класса с помощью метода
🟠Класс
🟠Метод
🟠Деструктор
🚩Создание и уничтожение объекта
Когда объект класса создается, вызывается конструктор. Когда объект больше не нужен, вызывается деструктор:
🚩Важные замечания
🟠Сборка мусора
Python использует механизм сборки мусора для автоматического управления памятью. Когда объект больше не используется (например, нет активных ссылок на него), сборщик мусора удаляет объект и вызывает его деструктор.
🟠Неопределенное время вызова
Точное время вызова деструктора зависит от работы сборщика мусора. Это означает, что нельзя гарантировать момент вызова деструктора. Поэтому для критических операций лучше использовать явное управление ресурсами, например, с помощью контекстных менеджеров (
🟠Контекстные менеджеры
Для явного управления ресурсами и их освобождения в предсказуемый момент лучше использовать контекстные менеджеры.
Ставь 👍 и забирай 📚 Базу знаний
Это специальный метод, который вызывается автоматически, когда объект класса уничтожается. В 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Ставь 👍 и забирай 📚 Базу знаний
🔥3
🤔 Какие нововведения появились с версии Python 3.7?
Python 3.7 принёс несколько важных улучшений:
- Гарантия порядка в dict — словари сохраняют порядок вставки ключей (до этого поведение не было гарантировано).
- Модуль dataclasses — упрощённое объявление классов с полями.
- Новая система обнаружения и обработки прерываний (asyncio.run ()).
- getattr и dir на уровне модуля.
- Улучшения в производительности и стабильности, в том числе оптимизация вызовов функций.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Python 3.7 принёс несколько важных улучшений:
- Гарантия порядка в dict — словари сохраняют порядок вставки ключей (до этого поведение не было гарантировано).
- Модуль dataclasses — упрощённое объявление классов с полями.
- Новая система обнаружения и обработки прерываний (
- getattr и dir на уровне модуля.
- Улучшения в производительности и стабильности, в том числе оптимизация вызовов функций.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
💊9👍1