Это структурный шаблон проектирования, который предоставляет объект, управляющий доступом к другому объекту. Этот паттерн создаёт суррогат или заместителя для другого объекта и контролирует доступ к нему.
Когда необходимо контролировать доступ к ресурсу.
Когда необходимо отложить создание ресурсоёмких объектов до момента их первого использования.
Для управления ресурсами, такими как память или сетевые соединения.
Для добавления дополнительной функциональности, такой как логирование или кэширование, без изменения кода основного объекта.
Контролирует доступ к объекту, создавая его по требованию.
Контролирует доступ к объекту, ограничивая права пользователей.
Управляет доступом к объекту, находящемуся в другом адресном пространстве.
Кэширует результаты запросов к объекту для повышения производительности.
Заместитель реализует интерфейс основного объекта и перенаправляет вызовы к реальному объекту, добавляя при этом дополнительную функциональность. В этом примере класс
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()
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5💊1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11💊3🔥1
Разбить список (
list) можно разными способами в зависимости от задачи: На части фиксированной длины
На N частей
По условию
Если нужно разделить список на подсписки длиной
n, можно использовать list comprehensiondef split_list(lst, size):
return [lst[i:i + size] for i in range(0, len(lst), size)]
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(split_list(data, 3))
Вывод
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Если нужно разделить список на
N частей, можно использовать numpy или itertools import numpy as np
def split_into_n_parts(lst, n):
return np.array_split(lst, n)
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(split_into_n_parts(data, 4))
Вывод
[array([1, 2, 3]), array([4, 5]), array([6, 7]), array([8, 9])]
Если нужно разделить список по какому-то критерию, например, на чётные и нечётные числа
data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
even = [x for x in data if x % 2 == 0]
odd = [x for x in data if x % 2 != 0]
print(even, odd)
Вывод
[2, 4, 6, 8] [1, 3, 5, 7, 9]
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
1. Тип переменной определяется во время выполнения, а не во время компиляции.
2. Это позволяет переменной менять тип в процессе выполнения.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥1
Словарь (
dict) — это структура данных, которая хранит пары "ключ → значение". Через
{} (фигурные скобки)my_dict = {"name": "Alice", "age": 25, "city": "New York"}Изменение значения
my_dict["age"] = 26 # Меняем возраст
del — удаление по ключуdel my_dict["city"]
Перебор ключей (
for key in dict)for key in my_dict:
print(key, my_dict[key])
Проверка наличия ключа
if "name" in my_dict:
print("Ключ существует!")
Создадим словарь квадратов чисел
squares = {x: x**2 for x in range(1, 6)}
print(squares) # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}Нельзя использовать
list как ключ! my_dict[[1, 2, 3]] = "Ошибка" # TypeError: unhashable type: 'list'
Можно использовать
tuple, int, str, frozensetmy_dict[(1, 2, 3)] = "OK"
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3💊1
Можно использовать системные утилиты, которые выводят сведения об объёме оперативной памяти, её использовании и свободном объёме.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊32🤔5👍2
git stash — это команда в Git, которая сохраняет незакоммиченные изменения во временное хранилище (stash) и очищает рабочую директорию. Нужно переключиться на другую ветку, но есть незаконченные изменения. Хочешь сохранить текущую работу, но не коммитить её. Нужно экспериментировать, но без риска потерять код.
Сохранить изменения в
stash git stash
Посмотреть список сохранённых изменений
git stash list
Выведет список всех
stash-ов stash@{0}: WIP on main: 1234567 Добавил новую фичу
stash@{1}: WIP on dev: 89abcde Исправил багВосстановить сохранённые изменения
git stash pop # Восстановит изменения и удалит stash
ИЛИ
git stash apply # Восстановит, но stash останется в списке
Удалить
stash после применения git stash drop stash@{0} # Удалит конкретный stash
git stash clear # Удалит все stash'иСценарий
- Ты работаешь в ветке
main, но нужно срочно переключиться на dev. - У тебя есть изменения, которые ты не хочешь коммитить.
Решение
git stash # Сохраняем изменения
git checkout dev # Переключаемся на другую ветку
# Делаем нужную работу...
git checkout main # Возвращаемся в основную ветку
git stash pop # Восстанавливаем изменения
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10💊1
– Через оператор % (устаревший стиль).
– Метод .format().
– f-строки (f"{переменная}").
– Конкатенация (+), если речь не о форматировании, а о сложении.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Хранение данных базы данных (SQL) внутри Docker-контейнера не рекомендуется, потому что контейнеры являются временными и одноразовыми. При удалении или пересоздании контейнера все данные внутри него теряются.
Контейнеры в Docker спроектированы так, чтобы их можно было легко пересоздавать. Если удалить контейнер (
docker rm), все данные, хранящиеся внутри него, исчезнут навсегда. docker run --name mydb -e MYSQL_ROOT_PASSWORD=secret -d mysql
docker stop mydb
docker rm mydb # Удаляем контейнер – все данные пропали!
Если база данных хранится внутри контейнера, обновить версию MySQL/PostgreSQL будет сложно. При пересоздании контейнера все данные потеряются, и их придется восстанавливать из резервной копии.
Хранение данных внутри контейнера может снизить скорость работы базы, потому что 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
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
- re.match() проверяет только начало строки на соответствие шаблону. Если начало не совпадает — возвращает None.
-
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥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: Сервер перегружен → добавить балансировку нагрузки.
Ставь 👍 и забирай 📚 Базу знаний
👍6
🤔 Что такое git stash?
git stash — это временное сохранение текущих изменений в "карман", чтобы вернуться к чистому состоянию рабочего каталога. Это удобно, если нужно переключиться на другую ветку, не делая коммит. Позже можно восстановить изменения или удалить их.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
git stash — это временное сохранение текущих изменений в "карман", чтобы вернуться к чистому состоянию рабочего каталога. Это удобно, если нужно переключиться на другую ветку, не делая коммит. Позже можно восстановить изменения или удалить их.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍6🔥2
🤔 Что в python не является объектом?
В Python практически всё является объектом: числа, строки, функции, классы, модули и даже сам интерпретатор Python рассматривает их как объекты. Однако есть несколько вещей, которые объектами не являются:
🟠Операторы и синтаксические конструкции
Операторы (
🟠Ключевые слова (keywords)
Встроенные ключевые слова Python (
🟠Идентификаторы переменных
Хотя переменные ссылаются на объекты, сами идентификаторы (имена переменных) — это просто ссылки, а не объекты.
🟠Аннотации типов во время компиляции
Аннотации типов в Python, такие как
Ставь 👍 и забирай 📚 Базу знаний
В Python практически всё является объектом: числа, строки, функции, классы, модули и даже сам интерпретатор Python рассматривает их как объекты. Однако есть несколько вещей, которые объектами не являются:
🟠Операторы и синтаксические конструкции
Операторы (
+, -, *, and, or, not и т. д.) сами по себе не являются объектами. Они — часть синтаксиса языка и не имеют представления в виде объектов в памяти.a = 10 + 5 # Оператор "+" выполняет сложение, но сам по себе не объект
print(type(+)) # Ошибка: нельзя получить тип оператора
🟠Ключевые слова (keywords)
Встроенные ключевые слова Python (
if, else, while, for, def, class, return и т. д.) не являются объектами. Они зарезервированы интерпретатором и используются для управления потоком выполнения кода.print(type(if)) # Ошибка: ключевое слово не является объектом
🟠Идентификаторы переменных
Хотя переменные ссылаются на объекты, сами идентификаторы (имена переменных) — это просто ссылки, а не объекты.
x = 42 # x — это имя, а не объект
print(type(x)) # Это целое число, но само имя "x" объектом не является
🟠Аннотации типов во время компиляции
Аннотации типов в Python, такие как
list[str], не создают объекты во время компиляции кода. Они интерпретируются только на уровне анализа типов.def func(x: int) -> str:
return str(x)
Ставь 👍 и забирай 📚 Базу знаний
👍7
🤔 Как открывается WebSocket?
Соединение начинается с HTTP-запроса, который просит сервер перейти на протокол WebSocket. Если сервер согласен, он отвечает подтверждением, после чего создаётся постоянный канал связи, через который обе стороны могут отправлять и получать данные без повторной авторизации.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Соединение начинается с HTTP-запроса, который просит сервер перейти на протокол WebSocket. Если сервер согласен, он отвечает подтверждением, после чего создаётся постоянный канал связи, через который обе стороны могут отправлять и получать данные без повторной авторизации.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥4👍3
🤔 Какие есть высокоуровневые языки программирования?
Предоставляют более высокую степень абстракции от аппаратного обеспечения компьютера, чем низкоуровневые языки. Они ориентированы на удобство программирования, упрощение разработки, читаемость и поддержку кода. Эти языки скрывают детали работы с памятью и процессором, позволяя программистам сосредоточиться на логике приложения.
🚩Основные высокоуровневые языки программирования:
🟠Python
Веб-разработка, анализ данных, научные исследования, искусственный интеллект, автоматизация.
🟠Java
Разработка корпоративного ПО, веб-приложений, мобильных приложений (Android), больших распределенных систем.
🟠C#
Разработка настольных приложений, веб-приложений, игр (с использованием Unity), облачных сервисов.
🟠JavaScript
Веб-разработка, создание интерактивных пользовательских интерфейсов, серверные приложения, мобильные приложения (с использованием фреймворков, таких как React Native).
🟠Ruby
Веб-разработка, скрипты автоматизации, создание прототипов.
🟠PHP
Веб-разработка, серверные приложения, управление контентом.
🟠Swift
Разработка мобильных и настольных приложений для экосистемы Apple.
🟠Kotlin
Разработка Android-приложений, серверных приложений, веб-приложений.
🟠Go (Golang)
Разработка серверных приложений, облачных сервисов, микросервисов.
🟠Rust
Системное программирование, разработка высокопроизводительных приложений, безопасное многопоточность.
Ставь 👍 и забирай 📚 Базу знаний
Предоставляют более высокую степень абстракции от аппаратного обеспечения компьютера, чем низкоуровневые языки. Они ориентированы на удобство программирования, упрощение разработки, читаемость и поддержку кода. Эти языки скрывают детали работы с памятью и процессором, позволяя программистам сосредоточиться на логике приложения.
🚩Основные высокоуровневые языки программирования:
🟠Python
Веб-разработка, анализ данных, научные исследования, искусственный интеллект, автоматизация.
def greet(name):
return f"Hello, {name}!"
print(greet("World"))
🟠Java
Разработка корпоративного ПО, веб-приложений, мобильных приложений (Android), больших распределенных систем.
public class Main {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
🟠C#
Разработка настольных приложений, веб-приложений, игр (с использованием Unity), облачных сервисов.
using System;
class Program {
static void Main() {
Console.WriteLine("Hello, World!");
}
}
🟠JavaScript
Веб-разработка, создание интерактивных пользовательских интерфейсов, серверные приложения, мобильные приложения (с использованием фреймворков, таких как React Native).
function greet(name) {
return `Hello, ${name}!`;
}
console.log(greet("World")); 🟠Ruby
Веб-разработка, скрипты автоматизации, создание прототипов.
def greet(name)
"Hello, #{name}!"
end
puts greet("World")
🟠PHP
Веб-разработка, серверные приложения, управление контентом.
<?php
function greet($name) {
return "Hello, $name!";
}
echo greet("World");
?>
🟠Swift
Разработка мобильных и настольных приложений для экосистемы Apple.
func greet(name: String) -> String {
return "Hello, \(name)!"
}
print(greet(name: "World")) 🟠Kotlin
Разработка Android-приложений, серверных приложений, веб-приложений.
fun greet(name: String): String {
return "Hello, $name!"
}
fun main() {
println(greet("World"))
} 🟠Go (Golang)
Разработка серверных приложений, облачных сервисов, микросервисов.
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
🟠Rust
Системное программирование, разработка высокопроизводительных приложений, безопасное многопоточность.
fn main() {
println!("Hello, World!");
}Ставь 👍 и забирай 📚 Базу знаний
👍5
🤔 Что знаешь про singleton?
Singleton — это паттерн проектирования, который ограничивает инстанцирование класса одним объектом. В Python его можно реализовать с помощью модуля или класса с использованием приватного конструктора и метода класса для доступа к экземпляру.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍4
🤔 Как происходит наследование моделей в Django?
В Django можно наследовать модели, используя стандартное наследование классов. Это помогает повторно использовать код, организовывать данные и добавлять общие поля в несколько моделей. Django поддерживает три основных типа наследования:
🟠Абстрактные модели
Абстрактные модели используются, когда нужно создать базовый класс с полями и методами, которые должны быть унаследованы, но сам класс не должен создавать таблицу в базе данных.
Создается базовый класс с
Дочерние классы наследуют его поля и методы, но не его саму в виде отдельной таблицы.
🟠Многоуровневое (конкретное) наследование
Этот тип наследования создаёт отдельные таблицы для каждой модели. Используется, когда дочерний класс должен представлять отдельную сущность, но при этом иметь доступ к полям родительского класса.
Django создаёт отдельные таблицы в БД для родительской и дочерней модели.
Дочерняя модель автоматически получает
🟠Прокси-модели (Proxy Models)
Используются, когда нужно изменить поведение модели без изменения структуры базы данных.
Прокси-модель наследует поля родительской модели.
В
Можно переопределять методы, добавлять новые, но не менять поля.
Ставь 👍 и забирай 📚 Базу знаний
В Django можно наследовать модели, используя стандартное наследование классов. Это помогает повторно использовать код, организовывать данные и добавлять общие поля в несколько моделей. Django поддерживает три основных типа наследования:
🟠Абстрактные модели
Абстрактные модели используются, когда нужно создать базовый класс с полями и методами, которые должны быть унаследованы, но сам класс не должен создавать таблицу в базе данных.
Создается базовый класс с
abstract = True в Meta.Дочерние классы наследуют его поля и методы, но не его саму в виде отдельной таблицы.
from django.db import models
class BaseModel(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True # Указывает, что это абстрактная модель
class Post(BaseModel):
title = models.CharField(max_length=255)
content = models.TextField()
class Comment(BaseModel):
text = models.TextField()
🟠Многоуровневое (конкретное) наследование
Этот тип наследования создаёт отдельные таблицы для каждой модели. Используется, когда дочерний класс должен представлять отдельную сущность, но при этом иметь доступ к полям родительского класса.
Django создаёт отдельные таблицы в БД для родительской и дочерней модели.
Дочерняя модель автоматически получает
OneToOneField на родительскую.class Person(models.Model):
name = models.CharField(max_length=255)
class Employee(Person): # Отдельная таблица employee
salary = models.DecimalField(max_digits=10, decimal_places=2)
🟠Прокси-модели (Proxy Models)
Используются, когда нужно изменить поведение модели без изменения структуры базы данных.
Прокси-модель наследует поля родительской модели.
В
Meta указывается proxy = True.Можно переопределять методы, добавлять новые, но не менять поля.
class Person(models.Model):
name = models.CharField(max_length=255)
class Manager(Person):
class Meta:
proxy = True # Указываем, что это прокси-модель
def get_uppercase_name(self):
return self.name.upper()
Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Что такое Self Join?
Self Join — это соединение таблицы самой с собой, как будто это две разные таблицы. Используется, например, для иерархических структур (менеджер-сотрудник), где один объект связан с другим того же типа.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Self Join — это соединение таблицы самой с собой, как будто это две разные таблицы. Используется, например, для иерархических структур (менеджер-сотрудник), где один объект связан с другим того же типа.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥5👍4
🤔 Что такое 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
Ставь 👍 и забирай 📚 Базу знаний
👍7
🤔 Что такое UDP?
UDP (User Datagram Protocol) — лёгкий и быстрый протокол без гарантии доставки:
- Нет установления соединения.
- Пакеты могут приходить в любом порядке или теряться.
- Быстрее TCP, но ненадёжнее.
Часто используется в видеозвонках, онлайн-играх, стриминге, где важна скорость, а не идеальная точность.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
UDP (User Datagram Protocol) — лёгкий и быстрый протокол без гарантии доставки:
- Нет установления соединения.
- Пакеты могут приходить в любом порядке или теряться.
- Быстрее TCP, но ненадёжнее.
Часто используется в видеозвонках, онлайн-играх, стриминге, где важна скорость, а не идеальная точность.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍8💊2