Да, разные базы данных имеют свои диалекты SQL, например:
- MySQL: поддерживает LIMIT для ограничения выборки.
- PostgreSQL: дополнительные функции, такие как RETURNING.
- SQL Server: использует TOP вместо LIMIT.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥4
В Python словари (
dict
) работают очень быстро, потому что они используют хеш-таблицы. Это позволяет находить значения по ключу в константное время O(1) в большинстве случаев. Давайте разберемся, как это работает.Словарь (
dict
) — это структура данных, которая хранит пары ключ → значение. Например:data = {"name": "Alice", "age": 25, "city": "New York"}
print(data["age"]) # 25
Основной принцип:
Хеш-функция (
hash()
) вычисляет уникальное число (хеш) для ключа.Используется массив (таблица), где данные хранятся по индексам, связанным с хешем.
Поиск по ключу — это просто вычисление хеша и обращение к нужному индексу.
print(hash("age")) # Например, вернет 328847234 (будет разным при каждом запуске)
Когда мы пишем
value = data["age"]
Нет линейного поиска: вместо перебора всех элементов Python сразу вычисляет, где находится нужное значение.
Операция доступа занимает фиксированное время:
hash()
+ обращение по индексу.Даже при большом количестве элементов скорость остается высокой.
Добавим 1 миллион элементов и посмотрим скорость поиска:
import time
data = {i: i * 2 for i in range(1_000_000)}
start = time.time()
print(data[999_999]) # Быстро находит ключ!
end = time.time()
print("Время поиска:", end - start) # Около 0.000001 сек
Иногда два разных ключа могут иметь одинаковый хеш (редко, но возможно). Тогда Python использует связанный список (chaining) или перехеширование.
print(hash("abc") % 10) # Например, 5
print(hash("xyz") % 10) # Тоже 5 (редко, но бывает)
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Cookie — это небольшой фрагмент данных, который браузер хранит от имени сайта. Используется для:
- Хранения сессий и авторизации.
- Сохранения настроек пользователя.
- Отслеживания поведения (например, в аналитике).
Cookie автоматически передаётся при каждом запросе к соответствующему домену.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🔥8
Многопоточность в Python реализуется с помощью модуля
threading
, но из-за GIL (Global Interpreter Lock) потоки не могут выполняться параллельно на нескольких ядрах. Модуль
threading
позволяет запускать несколько потоков (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 начал работу
(пауза 2 секунды)
Поток 1 завершил работу
Поток 2 завершил работу
Все потоки завершены
В отличие от
threading
, модуль 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("Все процессы завершены")
Этот модуль позволяет легко управлять потоками (
ThreadPoolExecutor
) и процессами (ProcessPoolExecutor
). from concurrent.futures import ThreadPoolExecutor
import time
def task(n):
time.sleep(2)
return f"Готово: {n}"
with ThreadPoolExecutor(max_workers=2) as executor:
results = executor.map(task, [1, 2, 3])
for result in results:
print(result)
Пример
ProcessPoolExecutor
(процессы)from concurrent.futures import ProcessPoolExecutor
def square(n):
return n * n
with ProcessPoolExecutor() as executor:
results = executor.map(square, [1, 2, 3, 4])
print(list(results)) # [1, 4, 9, 16]
Модуль
asyncio
не создаёт потоки или процессы, а работает через "корутины" и цикл событий (event loop). import asyncio
async def task():
print("Начало")
await asyncio.sleep(2) # Не блокирует другие задачи
print("Конец")
async def main():
await asyncio.gather(task(), task())
asyncio.run(main())
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🤔1
- Запуск, остановка, удаление контейнера.
- Сборка образа.
- Просмотр логов, ресурсов.
- Работа с томами, сетями. Эти команды позволяют управлять жизненным циклом контейнеров и инфраструктурой на основе образов.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥2
Monkey Patching — это изменение или замена кода существующих классов и функций во время выполнения программы. Хотя этот метод бывает полезен, особенно в тестировании, его использование в продакшене может привести к опасным и непредсказуемым последствиям
Когда ты изменяешь поведение встроенных библиотек или сторонних модулей на лету, программисты, читающие код, не смогут понять, почему стандартные функции ведут себя не так, как ожидалось.
import datetime
# Меняем поведение метода now()
def fake_now():
return datetime.datetime(2000, 1, 1)
datetime.datetime.now = fake_now # Monkey Patch
print(datetime.datetime.now()) # Выведет 2000-01-01 00:00:00
Если библиотека обновится, и её внутренняя логика изменится, Monkey Patch может перестать работать или, что ещё хуже, привести к багам.
Ты сделал Monkey Patch метода
json.dumps
, а потом библиотека json
обновилась и поменяла его сигнатуру. Теперь твой патч сломается или будет работать некорректно. Monkey Patching меняет поведение кода в скрытом режиме, поэтому сложно понять, почему что-то работает не так. Если баг возник из-за патча, отладка может занять часы или даже дни.
Ты исправил баг с
str.split()
, заменив его через Monkey Patch, но через 6 месяцев разработчик обновил код, забыл про патч, и всё сломалось.Monkey Patching меняет поведение для всей программы, а не только в одном модуле или файле. Это делает код хрупким и непредсказуемым.
Если ты изменишь метод
dict.get()
, он будет вести себя по-другому во всех модулях программы. Это может привести к критическим ошибкам. original_get = dict.get
def patched_get(self, key, default=None):
print(f"Запрашивается ключ: {key}")
return original_get(self, key, default)
dict.get = patched_get # Monkey Patch
d = {"a": 10}
print(d.get("a")) # Работает, но теперь с побочным эффектом
Monkey Patch может работать на одной версии Python или библиотеки, но сломаться на другой. В продакшене, где есть разные серверы и окружения, это может вызвать непредсказуемые ошибки.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1
Это компактная форма записи генератора, аналогичная генераторной функции, но записываемая как выражение в круглых скобках. Она похожа на list comprehension, но не создаёт список, а возвращает итератор, который генерирует значения по мере запроса.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥3
Это структурный шаблон проектирования, который предоставляет объект, управляющий доступом к другому объекту. Этот паттерн создаёт суррогат или заместителя для другого объекта и контролирует доступ к нему.
Когда необходимо контролировать доступ к ресурсу.
Когда необходимо отложить создание ресурсоёмких объектов до момента их первого использования.
Для управления ресурсами, такими как память или сетевые соединения.
Для добавления дополнительной функциональности, такой как логирование или кэширование, без изменения кода основного объекта.
Контролирует доступ к объекту, создавая его по требованию.
Контролирует доступ к объекту, ограничивая права пользователей.
Управляет доступом к объекту, находящемуся в другом адресном пространстве.
Кэширует результаты запросов к объекту для повышения производительности.
Заместитель реализует интерфейс основного объекта и перенаправляет вызовы к реальному объекту, добавляя при этом дополнительную функциональность. В этом примере класс
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
Декоратором может быть функция или объект с методом call. Применяется к функциям, методам и классам.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥5
В Python
type
— это встроенная функция и метакласс, который: Определяет тип объекта (
type(obj)
). Создаёт новые классы динамически (
type(name, bases, attrs)
). Функция
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
может создавать новые классы "на лету".MyClass = type("MyClass", (object,), {"x": 10, "hello": lambda self: "Hello!"})
obj = MyClass()
print(obj.x) # 10
print(obj.hello()) # Hello!
В Python
type
— это метакласс для всех классов, то есть классы тоже являются объектами type
.class A:
pass
print(type(A)) # <class 'type'>
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Класс Meta в ModelSerializer определяет настройки сериализатора, включая:
- model – модель, с которой работает сериализатор
- fields – список полей, которые нужно включить или исключить
- exclude – поля, которые не нужно включать
- read_only_fields – поля, которые нельзя изменять
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥3
Асинхронность (
asyncio
) в Python не выполняет код параллельно, а переключается между задачами во время ожидания (I/O-bound). Если в
async
-функции делать тяжёлые вычисления (CPU-bound), это блокирует asyncio
, потому что в Python есть GIL (Global Interpreter Lock). Асинхронность позволяет выполнять задачи без блокировки, но только если они ждут чего-то (файлы, сеть, БД).
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"] * 5
results = await asyncio.gather(*(fetch(url) for url in urls))
asyncio.run(main())
Если в
async
-функции делать тяжёлые вычисления, Python не сможет переключаться между задачами. import asyncio
async def heavy_task(n):
print(f"Вычисляю {n}...")
total = sum(i**2 for i in range(n)) # Долгий процесс
return total
async def main():
await asyncio.gather(heavy_task(10**7), heavy_task(10**7))
asyncio.run(main())
В Python 3.9+ можно выполнять CPU-задачи в отдельных потоках, не блокируя
asyncio
. import asyncio
def heavy_computation(n):
return sum(i**2 for i in range(n))
async def main():
result = await asyncio.to_thread(heavy_computation, 10**7)
print(result)
asyncio.run(main())
Так как Python использует GIL, единственный способ выполнять настоящий параллелизм — это
multiprocessing
.import asyncio
import multiprocessing
def heavy_computation(n):
return sum(i**2 for i in range(n))
async def main():
loop = asyncio.get_running_loop()
with multiprocessing.Pool() as pool:
result = await loop.run_in_executor(pool, heavy_computation, 10**7)
print(result)
asyncio.run(main())
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🤔1
Conflict management — это процесс обнаружения, анализа и разрешения конфликтов:
- В разработке: слияние кода, разные изменения в одной строке, ветке или файле.
- В команде: несогласие между участниками — решается через коммуникации, правила, арбитраж.
- В системах данных: конфликт версий, репликаций или состояния.
В DevOps и разработке чаще говорят о разрешении конфликтов в Git, при merge или rebase.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Текстовые и бинарные файлы — это два типа файлов, которые хранят и обрабатывают данные по-разному. Разберем их отличия.
Текстовые файлы хранят данные в виде обычного текста, используя кодировку (например, UTF-8, ASCII). Они читаются и редактируются текстовыми редакторами (Notepad, VS Code).
-
.txt
— обычный текстовый файл -
.csv
— таблица в текстовом формате -
.json
, .xml
, .html
— текстовые форматы данных Каждый символ в файле представлен в кодировке (например, в UTF-8 буква "А" занимает 1 байт).
В Python текстовые файлы открываются в режиме
t
(text mode). # Запись в текстовый файл
with open("example.txt", "w", encoding="utf-8") as file:
file.write("Привет, мир!")
# Чтение текстового файла
with open("example.txt", "r", encoding="utf-8") as file:
content = file.read()
print(content) # Выведет: Привет, мир!
Бинарные файлы хранят данные в машинном формате (набор байтов). Они не предназначены для чтения человеком и требуют специальных программ для обработки.
-
.exe
— исполняемый файл -
.png
, .jpg
— изображения -
.mp3
, .mp4
— аудио и видео файлы -
.dat
, .bin
— файлы с произвольными данными Байты записываются напрямую без конвертации в текст. Например, число
123
может храниться в 4-байтовом формате (например, 01111011
в двоичном коде). В Python бинарные файлы открываются в режиме
b
(binary mode). # Запись бинарных данных
data = b'\x48\x65\x6C\x6C\x6F' # "Hello" в байтах
with open("example.bin", "wb") as file:
file.write(data)
# Чтение бинарных данных
with open("example.bin", "rb") as file:
content = file.read()
print(content) # Выведет: b'Hello'
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍4💊2
Когда токен истёк:
- Сервер отклоняет запрос с ошибкой авторизации (чаще всего 401).
- Клиент должен использовать refresh токен (если есть), чтобы получить новый access токен.
- Если refresh токена нет или он тоже просрочен — требуется повторная авторизация пользователя.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥4
Если нужно:
Перехватить исключение
Выполнить какие-то действия (лог, очистка, уведомление и т. д.)
Снова выбросить это же исключение
try:
x = 1 / 0 # Ошибка деления на ноль
except ZeroDivisionError:
print("Ошибка! Записываем в лог...")
raise # Повторно выбрасываем то же исключение
Вывод
Ошибка! Записываем в лог...
Traceback (most recent call last):
File "script.py", line 2, in <module>
x = 1 / 0
ZeroDivisionError: division by zero
Пример: Логирование перед повторным выбросом
import logging
logging.basicConfig(filename="errors.log", level=logging.ERROR)
try:
user_input = int("abc") # Ошибка ValueError
except ValueError as e:
logging.error(f"Ошибка: {e}") # Записываем в лог
raise # Повторно выбрасываем исключение
Пример: Очистка ресурсов перед выбросом исключения
try:
file = open("data.txt", "r")
data = file.read()
except FileNotFoundError:
print("Файл не найден. Освобождаем ресурсы...")
raise # Снова выбрасываем исключение
finally:
file.close() # Гарантированно закроет файл
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
Пакет в Python — это папка, содержащая файл __init__.py, который указывает, что она является модулем. Внутри пакета могут находиться другие модули или подпакеты. Это позволяет удобно структурировать код по функциональным блокам и импортировать нужные части.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥1
В Python множество (
set
) — это неупорядоченная коллекция уникальных элементов, которая работает на основе хеш-таблицы. Это значит, что только хешируемые (immutable) объекты могут быть добавлены в 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 не добавятся повторно)
Изменяемые объекты (
list
, set
, dict
)s = { [1, 2, 3] } # Ошибка: TypeError: unhashable type: 'list'
s = { {"key": "value"} } # Ошибка: TypeError: unhashable type: 'dict'
Кортежи с изменяемыми элементами
s = { (1, [2, 3]) } # Ошибка: TypeError
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
Словарь (
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
, frozenset
my_dict[(1, 2, 3)] = "OK"
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14