🤔 Для чего нужны static method?
Статические методы (static methods) в Python используются для создания методов, которые связаны с классом, но не требуют доступа к экземпляру этого класса или к самим данным класса. Это методы, которые выполняют функции, связанные с классом, но не изменяют и не используют состояние экземпляра (атрибуты объекта) или состояние самого класса (атрибуты класса). Они могут быть вызваны на уровне класса, а не на уровне экземпляра класса.
🚩Как создать статический метод
Для создания статического метода в Python используется декоратор
🚩Пример использования статического метода
Вы можете вызывать статический метод как через сам класс, так и через его экземпляр:
🚩Зачем нужны статические методы
🟠Логическая группировка
Статические методы позволяют логически группировать функции, которые связаны с классом, но не зависят от состояния конкретного экземпляра. Это помогает организовать код и делает его более читабельным.
🟠Удобство вызова
Иногда полезно вызывать метод, не создавая экземпляр класса. Например, если метод выполняет какую-то утилитарную функцию или обрабатывает данные, не связанные с объектом.
🟠Избежание изменений состояния
Поскольку статические методы не могут изменять состояние экземпляра или класса, их использование может способствовать созданию безопасного и предсказуемого кода.
🚩Сравнение с методами класса и экземпляра
🟠Методы экземпляра
Методы экземпляра (instance methods) принимают первым аргументом
🟠Методы класса
Методы класса (class methods) принимают первым аргументом
🟠Статические методы
Статические методы не принимают
Ставь 👍 и забирай 📚 Базу знаний
Статические методы (static methods) в Python используются для создания методов, которые связаны с классом, но не требуют доступа к экземпляру этого класса или к самим данным класса. Это методы, которые выполняют функции, связанные с классом, но не изменяют и не используют состояние экземпляра (атрибуты объекта) или состояние самого класса (атрибуты класса). Они могут быть вызваны на уровне класса, а не на уровне экземпляра класса.
🚩Как создать статический метод
Для создания статического метода в Python используется декоратор
@staticmethod. Давайте рассмотрим пример:class MyClass:
@staticmethod
def static_method(arg1, arg2):
return arg1 + arg2
🚩Пример использования статического метода
Вы можете вызывать статический метод как через сам класс, так и через его экземпляр:
result = MyClass.static_method(5, 10)
print(result) # Вывод: 15
my_instance = MyClass()
result = my_instance.static_method(3, 7)
print(result) # Вывод: 10
🚩Зачем нужны статические методы
🟠Логическая группировка
Статические методы позволяют логически группировать функции, которые связаны с классом, но не зависят от состояния конкретного экземпляра. Это помогает организовать код и делает его более читабельным.
🟠Удобство вызова
Иногда полезно вызывать метод, не создавая экземпляр класса. Например, если метод выполняет какую-то утилитарную функцию или обрабатывает данные, не связанные с объектом.
🟠Избежание изменений состояния
Поскольку статические методы не могут изменять состояние экземпляра или класса, их использование может способствовать созданию безопасного и предсказуемого кода.
🚩Сравнение с методами класса и экземпляра
🟠Методы экземпляра
Методы экземпляра (instance methods) принимают первым аргументом
self, что позволяет им изменять состояние конкретного экземпляра класса. class MyClass:
def instance_method(self, value):
self.value = value
🟠Методы класса
Методы класса (class methods) принимают первым аргументом
cls, что позволяет им изменять состояние самого класса. class MyClass:
class_variable = 0
@classmethod
def class_method(cls, value):
cls.class_variable = value
🟠Статические методы
Статические методы не принимают
self или cls в качестве первого аргумента и не могут изменять состояние экземпляра или класса. class MyClass:
@staticmethod
def static_method(arg1, arg2):
return arg1 + arg2
Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 Для чего нужны предупреждения (warnings) и как создать собственное?
Предупреждения — это сообщения о потенциальных проблемах, которые не прерывают выполнение. Их можно создать с помощью модуля warnings и вызвать через warn().
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Предупреждения — это сообщения о потенциальных проблемах, которые не прерывают выполнение. Их можно создать с помощью модуля warnings и вызвать через warn().
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍3🔥1
🤔 Что случится с сервером при использовании GET?
Когда сервер получает HTTP-запрос типа GET, он выполняет следующие действия
🟠Анализ запроса
проверяет URL и параметры в строке запроса (например,
🟠Поиск ресурса
находит запрашиваемый файл, данные из базы или другой ресурс.
🟠Возврат ответа
отправляет данные клиенту (если ресурс найден — код 200, если нет — 404).
🚩Особенности GET-запроса
🟠Безопасный
не изменяет данные на сервере, используется только для чтения.
🟠Идемпотентный
повторные запросы дают одинаковый результат.
🟠Параметры в URL
данные передаются через строку запроса, что не подходит для конфиденциальной информации.
Ставь 👍 и забирай 📚 Базу знаний
Когда сервер получает HTTP-запрос типа GET, он выполняет следующие действия
🟠Анализ запроса
проверяет URL и параметры в строке запроса (например,
?id=123). 🟠Поиск ресурса
находит запрашиваемый файл, данные из базы или другой ресурс.
🟠Возврат ответа
отправляет данные клиенту (если ресурс найден — код 200, если нет — 404).
🚩Особенности GET-запроса
🟠Безопасный
не изменяет данные на сервере, используется только для чтения.
🟠Идемпотентный
повторные запросы дают одинаковый результат.
🟠Параметры в URL
данные передаются через строку запроса, что не подходит для конфиденциальной информации.
import requests
response = requests.get("https://api.example.com/data", params={"id": 123})
print(response.text) # Данные с сервера
Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 В чем разница между итератором и генератором?
Итератор — это объект, который поддерживает метод `__iter__()` и `__next__()` и позволяет проходить по коллекции элементов. Генератор — это специальный вид итератора, который создается с помощью ключевого слова `yield` и позволяет лениво возвращать элементы по одному, сохраняя состояние между вызовами. Генераторы обычно используются для обработки больших данных, поскольку они не требуют загрузки всего набора данных в память. Итераторы, в свою очередь, могут быть созданы вручную с помощью классов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍4💊1
🤔 Какие есть коды ошибок 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: Сервер перегружен → добавить балансировку нагрузки.
Ставь 👍 и забирай 📚 Базу знаний
👍5
🤔 Какие знаешь итераторы?
Итераторами являются генераторы, файлы, объекты, возвращаемые iter(), а также методы словаря (keys(), items()), списки, множества и строки. Любой объект, реализующий iter() и next(), считается итератором.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Итераторами являются генераторы, файлы, объекты, возвращаемые iter(), а также методы словаря (keys(), items()), списки, множества и строки. Любой объект, реализующий iter() и next(), считается итератором.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2🔥1💊1
🤔 Для чего нужно ключевое слово global?
Ключевое слово global используется для объявления переменной глобальной внутри функции. Без него любое присваивание переменной внутри функции создаёт новую локальную переменную. Если нужно изменить переменную, определённую вне функции — следует явно указать global.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Ключевое слово global используется для объявления переменной глобальной внутри функции. Без него любое присваивание переменной внутри функции создаёт новую локальную переменную. Если нужно изменить переменную, определённую вне функции — следует явно указать global.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍7
🤔 Какие задачи хорошо параллелятся, какие плохо?
Параллельные вычисления — это выполнение нескольких задач одновременно, чтобы ускорить работу программы. Но не все задачи можно эффективно распараллелить.
🚩Независимые задачи (Embarrassingly Parallel Tasks)
Это задачи, которые можно выполнять полностью независимо друг от друга, без обмена данными.
Обработка изображений (фильтры, преобразования)
Генерация фрагментов видео
Рендеринг 3D-графики (каждый кадр рендерится отдельно)
Обучение моделей машинного обучения на разных данных (если без обмена параметрами)
🚩Численные вычисления на больших данных (SIMD-операции, GPU-ускорение)
Если однотипные операции выполняются на большом массиве данных, их можно делать параллельно.
Умножение матриц (используется в нейросетях)
Обработка сигналов (FFT, фильтрация)
Физические симуляции
🚩Веб-запросы и сетевые операции
Когда программа ждет ответа от сервера, процесс простаивает. Можно запускать запросы асинхронно, чтобы делать их параллельно.
Скачивание файлов
Парсинг веб-страниц
Вызовы API
Ставь 👍 и забирай 📚 Базу знаний
Параллельные вычисления — это выполнение нескольких задач одновременно, чтобы ускорить работу программы. Но не все задачи можно эффективно распараллелить.
🚩Независимые задачи (Embarrassingly Parallel Tasks)
Это задачи, которые можно выполнять полностью независимо друг от друга, без обмена данными.
Обработка изображений (фильтры, преобразования)
Генерация фрагментов видео
Рендеринг 3D-графики (каждый кадр рендерится отдельно)
Обучение моделей машинного обучения на разных данных (если без обмена параметрами)
from concurrent.futures import ProcessPoolExecutor
from PIL import Image
def process_image(image_path):
img = Image.open(image_path)
img = img.convert("L") # Перевод в черно-белый формат
img.save(f"processed_{image_path}")
images = ["img1.jpg", "img2.jpg", "img3.jpg"]
with ProcessPoolExecutor() as executor:
executor.map(process_image, images)
🚩Численные вычисления на больших данных (SIMD-операции, GPU-ускорение)
Если однотипные операции выполняются на большом массиве данных, их можно делать параллельно.
Умножение матриц (используется в нейросетях)
Обработка сигналов (FFT, фильтрация)
Физические симуляции
import numpy as np
A = np.random.rand(1000, 1000)
B = np.random.rand(1000, 1000)
C = A @ B # Быстрое умножение матриц (использует несколько ядер процессора)
🚩Веб-запросы и сетевые операции
Когда программа ждет ответа от сервера, процесс простаивает. Можно запускать запросы асинхронно, чтобы делать их параллельно.
Скачивание файлов
Парсинг веб-страниц
Вызовы API
import asyncio
import aiohttp
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
async def main():
urls = ["https://example.com", "https://google.com"]
tasks = [fetch(url) for url in urls]
responses = await asyncio.gather(*tasks)
print(responses)
asyncio.run(main())
Ставь 👍 и забирай 📚 Базу знаний
👍3🤔1💊1
🤔 Можно ли создать декоратор из класса?
Да, если класс реализует метод call, он может быть использован как декоратор. Такой декоратор может хранить состояние между вызовами.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Да, если класс реализует метод call, он может быть использован как декоратор. Такой декоратор может хранить состояние между вызовами.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥2👍1
🤔 Какие блоки для обработки исключений существуют в Python?
Python предоставляет блоки try, except, else и finally. Блок try содержит потенциально опасный код, except — обрабатывает исключения, else выполняется, если не произошло исключений, а finally срабатывает всегда, независимо от результата выполнения блока.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Python предоставляет блоки try, except, else и finally. Блок try содержит потенциально опасный код, except — обрабатывает исключения, else выполняется, если не произошло исключений, а finally срабатывает всегда, независимо от результата выполнения блока.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1🔥1💊1
🤔 Что такое объект первого класса?
Объект первого класса (или сущность первого класса) — это концепция из программирования, которая означает, что объект обладает всеми следующими свойствами:
🟠Хранение в переменной или структуре данных
объект можно присвоить переменной или сохранить в структуре данных (например, списке, словаре).
🟠Передача в функцию в качестве аргумента
объект можно передавать как параметр функции.
🟠Возврат из функции как результата
функция может возвращать объект.
🟠Динамическое создание
объект можно создавать во время выполнения программы (не только на этапе компиляции).
🚩Почему это важно?
Объекты первого класса делают язык более гибким и мощным. Например:
Функции можно передавать как аргументы для реализации более сложных вычислений.
Можно хранить функции в структурах данных, что позволяет создавать таблицы вызовов функций или карты действий.
Возможность возвращать функции из других функций упрощает реализацию таких концепций, как замыкания и фабрики функций.
🚩Пример на Python
Присваивание функции переменной
Передача функции как аргумента
Возврат функции из функции
Ставь 👍 и забирай 📚 Базу знаний
Объект первого класса (или сущность первого класса) — это концепция из программирования, которая означает, что объект обладает всеми следующими свойствами:
🟠Хранение в переменной или структуре данных
объект можно присвоить переменной или сохранить в структуре данных (например, списке, словаре).
🟠Передача в функцию в качестве аргумента
объект можно передавать как параметр функции.
🟠Возврат из функции как результата
функция может возвращать объект.
🟠Динамическое создание
объект можно создавать во время выполнения программы (не только на этапе компиляции).
🚩Почему это важно?
Объекты первого класса делают язык более гибким и мощным. Например:
Функции можно передавать как аргументы для реализации более сложных вычислений.
Можно хранить функции в структурах данных, что позволяет создавать таблицы вызовов функций или карты действий.
Возможность возвращать функции из других функций упрощает реализацию таких концепций, как замыкания и фабрики функций.
🚩Пример на Python
Присваивание функции переменной
def say_hello():
return "Hello!"
# Функция присваивается переменной
greet = say_hello
print(greet()) # Вывод: Hello!
Передача функции как аргумента
def apply_function(func, value):
return func(value)
def square(x):
return x * x
result = apply_function(square, 5)
print(result) # Вывод: 25
Возврат функции из функции
def multiplier(n):
def multiply(x):
return x * n
return multiply
double = multiplier(2)
print(double(10)) # Вывод: 20
Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Что такое монолитная архитектура, её плюсы и минусы?
Монолит — это единое приложение, где все компоненты находятся в одной системе.
Плюсы:
- проще начать разработку;
- меньше накладных расходов;
- отладка и деплой проще.
Минусы:
- сложнее масштабировать по частям;
- одно изменение может повлиять на всё приложение;
- трудно разделить работу между командами.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Плюсы:
- проще начать разработку;
- меньше накладных расходов;
- отладка и деплой проще.
Минусы:
- сложнее масштабировать по частям;
- одно изменение может повлиять на всё приложение;
- трудно разделить работу между командами.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 Что такое паттерн Стратегия (Strategy) ?
Это поведенческий паттерн проектирования, который определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми. Паттерн "Стратегия" позволяет изменять алгоритмы независимо от клиентов, которые их используют.
🚩Зачем нужен данный паттерн?
🟠Изоляция алгоритмов
Позволяет инкапсулировать различные алгоритмы и использовать их независимо.
🟠Упрощение кода
Устраняет дублирование кода и упрощает классы, которые используют эти алгоритмы.
🟠Гибкость и расширяемость
Легко добавлять новые алгоритмы или изменять существующие без изменения клиентского кода.
🚩Как работает данный паттерн?
🟠Стратегия (Strategy)
Интерфейс, определяющий общий метод, который должны реализовать все алгоритмы.
🟠Конкретные стратегии (ConcreteStrategy)
Реализации различных алгоритмов, которые реализуют интерфейс стратегии.
🟠Контекст (Context)
Класс, использующий стратегию для выполнения задачи.
🚩Плюсы и минусы
➕Изоляция алгоритмов
Алгоритмы инкапсулируются в отдельные классы, что упрощает их замену и добавление.
➕Упрощение кода
Контекст использует стратегии, избегая громоздких условных операторов.
➕Гибкость и расширяемость
Легко добавлять новые стратегии без изменения существующего кода.
➖Усложнение структуры кода
Добавление множества классов стратегий может усложнить проект.
➖Контекст знает о стратегиях
Контекст должен знать о всех возможных стратегиях, чтобы иметь возможность их переключать.
🚩Когда использовать данный паттерн?
Когда есть несколько вариантов алгоритмов для выполнения задачи.
Когда нужно динамически выбирать алгоритм во время выполнения.
Когда необходимо избежать множества условных операторов для выбора алгоритма.
Ставь 👍 и забирай 📚 Базу знаний
Это поведенческий паттерн проектирования, который определяет семейство алгоритмов, инкапсулирует каждый из них и делает их взаимозаменяемыми. Паттерн "Стратегия" позволяет изменять алгоритмы независимо от клиентов, которые их используют.
🚩Зачем нужен данный паттерн?
🟠Изоляция алгоритмов
Позволяет инкапсулировать различные алгоритмы и использовать их независимо.
🟠Упрощение кода
Устраняет дублирование кода и упрощает классы, которые используют эти алгоритмы.
🟠Гибкость и расширяемость
Легко добавлять новые алгоритмы или изменять существующие без изменения клиентского кода.
🚩Как работает данный паттерн?
🟠Стратегия (Strategy)
Интерфейс, определяющий общий метод, который должны реализовать все алгоритмы.
🟠Конкретные стратегии (ConcreteStrategy)
Реализации различных алгоритмов, которые реализуют интерфейс стратегии.
🟠Контекст (Context)
Класс, использующий стратегию для выполнения задачи.
from abc import ABC, abstractmethod
# Интерфейс стратегии
class Strategy(ABC):
@abstractmethod
def sort(self, data):
pass
# Конкретные стратегии
class BubbleSortStrategy(Strategy):
def sort(self, data):
print("Sorting using Bubble Sort")
for i in range(len(data)):
for j in range(0, len(data)-i-1):
if data[j] > data[j+1]:
data[j], data[j+1] = data[j+1], data[j]
class QuickSortStrategy(Strategy):
def sort(self, data):
print("Sorting using Quick Sort")
self.quick_sort(data, 0, len(data) - 1)
def quick_sort(self, data, low, high):
if low < high:
pi = self.partition(data, low, high)
self.quick_sort(data, low, pi - 1)
self.quick_sort(data, pi + 1, high)
def partition(self, data, low, high):
pivot = data[high]
i = low - 1
for j in range(low, high):
if data[j] <= pivot:
i = i + 1
data[i], data[j] = data[j], data[i]
data[i + 1], data[high] = data[high], data[i + 1]
return i + 1
# Контекст
class SortingContext:
def __init__(self, strategy: Strategy):
self._strategy = strategy
def set_strategy(self, strategy: Strategy):
self._strategy = strategy
def sort(self, data):
self._strategy.sort(data)
# Клиентский код
data = [5, 2, 9, 1, 5, 6]
context = SortingContext(BubbleSortStrategy())
context.sort(data)
print(data) # [1, 2, 5, 5, 6, 9]
context.set_strategy(QuickSortStrategy())
data = [3, 7, 8, 5, 2, 1, 9, 5, 4]
context.sort(data)
print(data) # [1, 2, 3, 4, 5, 5, 7, 8, 9]
🚩Плюсы и минусы
➕Изоляция алгоритмов
Алгоритмы инкапсулируются в отдельные классы, что упрощает их замену и добавление.
➕Упрощение кода
Контекст использует стратегии, избегая громоздких условных операторов.
➕Гибкость и расширяемость
Легко добавлять новые стратегии без изменения существующего кода.
➖Усложнение структуры кода
Добавление множества классов стратегий может усложнить проект.
➖Контекст знает о стратегиях
Контекст должен знать о всех возможных стратегиях, чтобы иметь возможность их переключать.
🚩Когда использовать данный паттерн?
Когда есть несколько вариантов алгоритмов для выполнения задачи.
Когда нужно динамически выбирать алгоритм во время выполнения.
Когда необходимо избежать множества условных операторов для выбора алгоритма.
Ставь 👍 и забирай 📚 Базу знаний
👍2
🤔 Разница между компилируемыми и интерпретируемыми языками?
- Компилируемые: исходный код переводится в машинный до выполнения. Пример: C++.
- Интерпретируемые: код исполняется построчно во время выполнения. Пример: Python. Python — интерпретируемый, хотя использует промежуточную байткод-компиляцию.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
- Компилируемые: исходный код переводится в машинный до выполнения. Пример: C++.
- Интерпретируемые: код исполняется построчно во время выполнения. Пример: Python. Python — интерпретируемый, хотя использует промежуточную байткод-компиляцию.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2
🤔 Назови основные команды docker?
Docker — это инструмент для создания, развертывания и управления контейнерами. Основные команды позволяют управлять образами, контейнерами, сетями и томами.
🚩Работа с образами (`images`)
Образы — это "шаблоны" для создания контейнеров.
Пример: скачиваем Python-образ
🚩Работа с контейнерами (`containers`)
Контейнер — это запущенный процесс на основе образа.
Пример: запустить контейнер с Ubuntu и войти в него
Пример: остановить и удалить контейнер
🚩Работа с томами (`volumes`)
Том (volume) — это способ хранения данных, которые не пропадут при перезапуске контейнера.
Пример: подключить том к контейнеру
🚩Работа с сетями (`networks`)
Сети в Docker позволяют контейнерам взаимодействовать друг с другом.
Пример: запустить два контейнера в одной сети
🚩5. Docker Compose (`docker-compose.yml`)
Docker Compose позволяет управлять несколькими контейнерами с помощью
Пример
Запуск
Ставь 👍 и забирай 📚 Базу знаний
Docker — это инструмент для создания, развертывания и управления контейнерами. Основные команды позволяют управлять образами, контейнерами, сетями и томами.
🚩Работа с образами (`images`)
Образы — это "шаблоны" для создания контейнеров.
Пример: скачиваем Python-образ
docker pull python:3.11
🚩Работа с контейнерами (`containers`)
Контейнер — это запущенный процесс на основе образа.
Пример: запустить контейнер с Ubuntu и войти в него
docker run -it ubuntu bash
Пример: остановить и удалить контейнер
docker stop my_app
docker rm my_app
🚩Работа с томами (`volumes`)
Том (volume) — это способ хранения данных, которые не пропадут при перезапуске контейнера.
Пример: подключить том к контейнеру
docker run -v my_data:/app/data ubuntu
🚩Работа с сетями (`networks`)
Сети в Docker позволяют контейнерам взаимодействовать друг с другом.
Пример: запустить два контейнера в одной сети
docker network create my_network
docker run -d --network my_network --name app1 ubuntu
docker run -d --network my_network --name app2 ubuntu
🚩5. Docker Compose (`docker-compose.yml`)
Docker Compose позволяет управлять несколькими контейнерами с помощью
docker-compose.yml. Пример
docker-compose.ymlversion: "3"
services:
app:
image: python:3.11
volumes:
- my_data:/app/data
networks:
- my_network
volumes:
my_data:
networks:
my_network:
Запуск
docker compose up -d
Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Название переменных?
Должны начинаться с буквы или подчёркивания, содержать только буквы, цифры и подчёркивания. Не допускается совпадение с ключевыми словами.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Должны начинаться с буквы или подчёркивания, содержать только буквы, цифры и подчёркивания. Не допускается совпадение с ключевыми словами.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2
🤔 Что такое паттерн Заместитель (Proxy)?
Это структурный шаблон проектирования, который предоставляет объект, управляющий доступом к другому объекту. Этот паттерн создаёт суррогат или заместителя для другого объекта и контролирует доступ к нему.
🚩Зачем нужен паттерн Заместитель
🟠Управление доступом
Когда необходимо контролировать доступ к ресурсу.
🟠Отложенная инициализация
Когда необходимо отложить создание ресурсоёмких объектов до момента их первого использования.
🟠Управление ресурсами
Для управления ресурсами, такими как память или сетевые соединения.
🟠Логирование и кэширование
Для добавления дополнительной функциональности, такой как логирование или кэширование, без изменения кода основного объекта.
🚩Типы заместителей
🟠Управляющий заместитель (Virtual Proxy):
Контролирует доступ к объекту, создавая его по требованию.
🟠Защитный заместитель (Protection Proxy):
Контролирует доступ к объекту, ограничивая права пользователей.
🟠Удалённый заместитель (Remote Proxy)
Управляет доступом к объекту, находящемуся в другом адресном пространстве.
🟠Кэш-прокси (Cache Proxy)
Кэширует результаты запросов к объекту для повышения производительности.
🚩Как используется паттерн Заместитель
Заместитель реализует интерфейс основного объекта и перенаправляет вызовы к реальному объекту, добавляя при этом дополнительную функциональность. В этом примере класс
Ставь 👍 и забирай 📚 Базу знаний
Это структурный шаблон проектирования, который предоставляет объект, управляющий доступом к другому объекту. Этот паттерн создаёт суррогат или заместителя для другого объекта и контролирует доступ к нему.
🚩Зачем нужен паттерн Заместитель
🟠Управление доступом
Когда необходимо контролировать доступ к ресурсу.
🟠Отложенная инициализация
Когда необходимо отложить создание ресурсоёмких объектов до момента их первого использования.
🟠Управление ресурсами
Для управления ресурсами, такими как память или сетевые соединения.
🟠Логирование и кэширование
Для добавления дополнительной функциональности, такой как логирование или кэширование, без изменения кода основного объекта.
🚩Типы заместителей
🟠Управляющий заместитель (Virtual Proxy):
Контролирует доступ к объекту, создавая его по требованию.
🟠Защитный заместитель (Protection Proxy):
Контролирует доступ к объекту, ограничивая права пользователей.
🟠Удалённый заместитель (Remote Proxy)
Управляет доступом к объекту, находящемуся в другом адресном пространстве.
🟠Кэш-прокси (Cache Proxy)
Кэширует результаты запросов к объекту для повышения производительности.
🚩Как используется паттерн Заместитель
Заместитель реализует интерфейс основного объекта и перенаправляет вызовы к реальному объекту, добавляя при этом дополнительную функциональность. В этом примере класс
Proxy контролирует доступ к классу RealSubject, добавляя проверку доступа и логирование.from abc import ABC, abstractmethod
class Subject(ABC):
@abstractmethod
def request(self):
pass
class RealSubject(Subject):
def request(self):
print("Реальный объект: Обработка запроса.")
class Proxy(Subject):
def __init__(self, real_subject):
self._real_subject = real_subject
def request(self):
if self.check_access():
self._real_subject.request()
self.log_access()
def check_access(self):
print("Заместитель: Проверка доступа перед выполнением запроса.")
return True
def log_access(self):
print("Заместитель: Логирование времени запроса.")
# Клиентский код
real_subject = RealSubject()
proxy = Proxy(real_subject)
proxy.request()
Ставь 👍 и забирай 📚 Базу знаний
👍2🔥1
🤔 Какие есть опции в свойстве on_delete?
on_delete в Django определяет поведение при удалении связанного объекта (например, ForeignKey).
Варианты:
- CASCADE — удаляет все связанные объекты.
- PROTECT — вызывает исключение, если есть связанные объекты.
- SET_NULL — обнуляет значение поля (если null=True).
- SET_DEFAULT — устанавливает значение по умолчанию.
- SET(...) — можно передать функцию или значение.
- DO_NOTHING — ничего не делает (может привести к ошибке на уровне БД).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
on_delete в Django определяет поведение при удалении связанного объекта (например, ForeignKey).
Варианты:
- CASCADE — удаляет все связанные объекты.
- PROTECT — вызывает исключение, если есть связанные объекты.
- SET_NULL — обнуляет значение поля (если null=True).
- SET_DEFAULT — устанавливает значение по умолчанию.
- SET(...) — можно передать функцию или значение.
- DO_NOTHING — ничего не делает (может привести к ошибке на уровне БД).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1💊1
🤔 Что за функция sleep()?
Функция
🚩Как использовать `sleep()` в Python?
Функция
🚩Где используется `sleep()`?
Ожидание в цикле (имитация загрузки)
Запросы к серверу с паузами (чтобы не забанили)
Искусственная задержка перед повторной попыткой
Ставь 👍 и забирай 📚 Базу знаний
Функция
sleep() из модуля time приостанавливает выполнение программы на заданное количество секунд. 🚩Как использовать `sleep()` в Python?
Функция
sleep() принимает один аргумент** — число секунд (может быть дробным). import time
print("Программа началась...")
time.sleep(3) # Ожидание 3 секунды
print("3 секунды прошло!")
🚩Где используется `sleep()`?
Ожидание в цикле (имитация загрузки)
for i in range(5, 0, -1):
print(i)
time.sleep(1) # Задержка 1 секунда между выводами
print("Старт!")
Запросы к серверу с паузами (чтобы не забанили)
import time
import requests
for i in range(3):
response = requests.get("https://example.com")
print(f"Запрос {i+1}: статус {response.status_code}")
time.sleep(2) # Ждём 2 секунды перед следующим запросом
Искусственная задержка перед повторной попыткой
for attempt in range(3):
print(f"Попытка {attempt + 1}...")
time.sleep(2) # Ожидание 2 секунды перед новой попыткой
Ставь 👍 и забирай 📚 Базу знаний
👍1💊1
🤔 Как получить из генератора список?
Можно просто передать генератор в функцию list(). Это принудительно извлечёт все элементы и вернёт их в виде списка.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Можно просто передать генератор в функцию list(). Это принудительно извлечёт все элементы и вернёт их в виде списка.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
💊1
🤔 Что такое GET?
GET — это HTTP-метод, который используется для запроса данных с сервера.
Когда ты открываешь веб-сайт или вводишь URL в браузере — это GET-запрос. Браузер запрашивает страницу у сервера, и сервер возвращает данные.
🚩Как работает GET-запрос?
1⃣Клиент (браузер, программа) отправляет GET-запрос на сервер.
2⃣Сервер обрабатывает запрос и возвращает ответ (HTML-страницу, JSON-данные, картинку и т. д.).
3⃣Данные отображаются пользователю.
🚩Пример GET-запроса
Когда ты заходишь на
Ответ сервера
🚩Особенности GET-запроса
🟠Читаемый URL
параметры передаются в строке запроса (например,
🟠Безопасен
GET не изменяет данные на сервере.
🟠Можно кэшировать
браузеры и серверы могут сохранять результаты GET-запросов.
🟠Ограниченная длина URL
слишком длинные запросы могут не работать.
🟠Не подходит для конфиденциальных данных
передача пароля в URL (
🚩GET-запрос с параметрами
Если нужно передать параметры, они добавляются в URL:
В Python можно отправить GET-запрос с помощью библиотеки
Ставь 👍 и забирай 📚 Базу знаний
GET — это HTTP-метод, который используется для запроса данных с сервера.
Когда ты открываешь веб-сайт или вводишь URL в браузере — это GET-запрос. Браузер запрашивает страницу у сервера, и сервер возвращает данные.
🚩Как работает GET-запрос?
1⃣Клиент (браузер, программа) отправляет GET-запрос на сервер.
2⃣Сервер обрабатывает запрос и возвращает ответ (HTML-страницу, JSON-данные, картинку и т. д.).
3⃣Данные отображаются пользователю.
🚩Пример GET-запроса
Когда ты заходишь на
https://example.com/users, браузер отправляет: GET /users HTTP/1.1
Host: example.com
Ответ сервера
[
{"id": 1, "name": "Alice"},
{"id": 2, "name": "Bob"}
]
🚩Особенности GET-запроса
🟠Читаемый URL
параметры передаются в строке запроса (например,
?id=123). 🟠Безопасен
GET не изменяет данные на сервере.
🟠Можно кэшировать
браузеры и серверы могут сохранять результаты GET-запросов.
🟠Ограниченная длина URL
слишком длинные запросы могут не работать.
🟠Не подходит для конфиденциальных данных
передача пароля в URL (
?password=123) небезопасна. 🚩GET-запрос с параметрами
Если нужно передать параметры, они добавляются в URL:
GET /search?q=python&page=2
В Python можно отправить GET-запрос с помощью библиотеки
requests import requests
response = requests.get("https://api.example.com/users", params={"id": 123})
print(response.json()) # Получаем ответ в JSON
Ставь 👍 и забирай 📚 Базу знаний
👍1