Это декоратор, предоставленный модулем
dataclasses
, который автоматически генерирует специальные методы, такие как __init__
,Автоматически генерирует методы, сокращая шаблонный код.
Делает код более чистым и легким для понимания.
Обеспечивает удобные и мощные возможности для работы с данными.
Нужно импортировать его из модуля
dataclasses
и применить к классу. Внутри класса достаточно определить только поля данных.from dataclasses import dataclass
@dataclass
class Person:
name: str
age: int
# Примеры использования
person1 = Person(name="Alice", age=30)
person2 = Person(name="Bob", age=25)
print(person1) # Вывод: Person(name='Alice', age=30)
print(person2) # Вывод: Person(name='Bob', age=25)
print(person1 == person2) # Вывод: False
Инициализирует объект с заданными значениями атрибутов.
Возвращает строковое представление объекта, удобное для отладки.
Сравнивает объекты на равенство по их атрибутам.
__le__,
Вы можете настроить поведение
@dataclass
с помощью параметров, таких как order
, frozen
, и других.Генерирует методы для сравнения объектов.
Делает экземпляры неизменяемыми (immutable).
Пример
from dataclasses import dataclass
@dataclass(order=True, frozen=True)
class Person:
name: str
age: int
person1 = Person(name="Alice", age=30)
person2 = Person(name="Bob", age=25)
print(person1 > person2) # Вывод: True (поскольку 'Alice' > 'Bob' по алфавиту, если имена равны, сравниваются возраста)
# person1.age = 31 # Ошибка: FrozenInstanceError (поскольку класс заморожен)
Вы можете использовать функцию
field()
для настройки отдельных полей, например, для указания значений по умолчанию или исключения полей из методов5)
print(
from dataclasses import dataclass, field
@dataclass
class Person:
name: str
age: int = 0
address: str = field(default="Unknown", repr=False)
person = Person(name="Alice")
print(person) # Вывод: Person(name='Alice', age=0)
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17❤1😁1
Используйте объединение таблиц через UNION или соединения JOIN. Например, SELECT * FROM table1 UNION SELECT * FROM table2.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
В Python практически всё является объектом: числа, строки, функции, классы, модули и даже сам интерпретатор Python рассматривает их как объекты. Однако есть несколько вещей, которые объектами не являются:
Операторы (
+
, -
, *
, and
, or
, not
и т. д.) сами по себе не являются объектами. Они — часть синтаксиса языка и не имеют представления в виде объектов в памяти.a = 10 + 5 # Оператор "+" выполняет сложение, но сам по себе не объект
print(type(+)) # Ошибка: нельзя получить тип оператора
Встроенные ключевые слова 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)
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27
- RIGHT JOIN: возвращает все строки из правой таблицы и соответствующие строки из левой. Несоответствующие строки левой таблицы заполняются NULL.
- INNER JOIN: возвращает только строки, которые соответствуют условиям соединения в обеих таблицах.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥3
В Python существует несколько типов файловых объектов, которые используются для работы с различными типами данных. Рассмотрим основные виды файловых объектов и их особенности.
Это самый распространённый тип файловых объектов. Такие файлы используются для работы с текстовыми данными и поддерживают строковые операции.
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)
Эти файлы используются для работы с двоичными данными (изображениями, видео, аудиофайлами и т. д.).
with open("image.jpg", "rb") as file:
binary_data = file.read() # Читаем файл в бинарном режиме
print(binary_data[:10]) # Выведем первые 10 байтов
with open("copy.jpg", "wb") as file:
file.write(binary_data) # Записываем данные в новый файл
Эти объекты представляют собой файловые буферы, которые хранят данные в оперативной памяти, а не на диске.
from io import StringIO
file = StringIO()
file.write("Привет, мир!") # Запись данных в буфер
file.seek(0) # Перемещаем указатель в начало
print(file.read()) # Читаем данные из буфера
Пример работы с
BytesIO
:from io import BytesIO
file = BytesIO()
file.write(b"Binary data") # Запись бинарных данных
file.seek(0)
print(file.read()) # Чтение данных
Python позволяет работать с файловыми объектами, полученными из нестандартных источников, например, сокетов или каналов связи (
pipes
).import socket
s = socket.socket()
s.connect(("example.com", 80))
s.sendall(b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n")
response = s.makefile("r", encoding="utf-8") # Создание файлового объекта
print(response.readline()) # Читаем первую строку HTTP-ответа
s.close()
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Здесь легко научиться:
▪️Превращать текст в голос
▪️Определять локацию по IP
▪️Писать телеграм-ботов
▪️Создавать 3D-игры
Самый необычный канал про Python, подписывайся – @Python_per_month
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1
Это подход к разработке программного обеспечения, при котором приложение разбивается на отдельные модули (части), каждый из которых решает конкретную задачу. Преимущества:
1. Улучшение читаемости и тестируемости кода.
2. Повторное использование модулей в других проектах.
3. Упрощение отладки и сопровождения.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1
В Django встроена мощная система аутентификации, которая отвечает за идентификацию пользователей, управление учетными записями и контроль доступа к различным частям приложения. Она включает регистрацию, вход, выход, проверку прав пользователей и работу с сессиями.
Аутентификация в Django основана на модели пользователя (
User
) и механизме сессий. Когда пользователь входит в систему, Django проверяет его учетные данные и создает сессию, сохраняя в ней идентификатор пользователя.Процесс можно разделить на несколько шагов:
Пользователь вводит логин и пароль.
Django проверяет данные через аутентификационный бэкенд.
Если данные верны, Django создает сессию.
При каждом запросе Django проверяет, авторизован ли пользователь.
Django предоставляет встроенную модель пользователя
django.contrib.auth.models.User
. Она содержит:username
, email
, password
is_staff
, is_superuser
, is_active
date_joined
, last_login
from django.contrib.auth.models import User
# Создание пользователя
user = User.objects.create_user(username="admin", password="12345")
user.email = "admin@example.com"
user.save()
# Проверка пароля
print(user.check_password("12345")) # True
Django использует функцию
authenticate()
для проверки учетных данных.from django.contrib.auth import authenticate
user = authenticate(username="admin", password="12345")
if user is not None:
print("Успешный вход!")
else:
print("Ошибка аутентификации!")
После успешной аутентификации пользователя можно "впустить" с помощью
login()
.from django.contrib.auth import login, logout
def user_login(request):
user = authenticate(username="admin", password="12345")
if user:
login(request, user) # Создает сессию
return "Пользователь вошел!"
return "Ошибка входа"
def user_logout(request):
logout(request) # Удаляет сессию
return "Пользователь вышел!"
Во вьюхах можно проверить, авторизован ли пользователь
if request.user.is_authenticated:
print("Пользователь залогинен:", request.user.username)
else:
print("Гость")
Для защиты маршрутов можно использовать декоратор
@login_required
:from django.contrib.auth.decorators import login_required
@login_required
def profile(request):
return "Это страница профиля!"
Django по умолчанию использует
django.contrib.auth.backends.ModelBackend
для аутентификации через базу данных. Можно добавить кастомные бэкенды:AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend', # Обычная аутентификация
]
Если стандартной модели
User
недостаточно, можно создать кастомную модельfrom django.contrib.auth.models import AbstractUser
class CustomUser(AbstractUser):
phone_number = models.CharField(max_length=15, unique=True)
# В settings.py указываем свою модель
AUTH_USER_MODEL = "myapp.CustomUser"
Django поддерживает группы пользователей и права доступа.
if user.has_perm("app_name.permission_codename"):
print("У пользователя есть разрешение!")
Использование групп
from django.contrib.auth.models import Group
group = Group.objects.create(name="Editors") # Создаем группу
user.groups.add(group) # Добавляем пользователя в группу
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9
1. Реализация общих функций, таких как логирование.
2. Добавление методов для работы с базами данных или сериализацией.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍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
👍14❤1
1. Текущая рабочая директория: сначала проверяет текущую директорию.
2. Переменная окружения PYTHONPATH: ищет в путях, указанных в переменной.
3. Стандартные каталоги Python: такие как lib/pythonX.X/site-packages.
4. Пользовательские директории: при необходимости добавленные через sys.path.append().
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10💊3❤1🔥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
👍17😁1
- Устаревший HTTP-код, ранее зарезервированный для будущего использования. В современных стандартах он не используется.
2. 307 Redirect:
- Указывает временное перенаправление. В отличие от 302, гарантирует, что метод запроса (например, POST) останется неизменным.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14💊1
Django использует
sqlparse
и asgiref
как вспомогательные библиотеки для работы с SQL и асинхронностью. Разберём их назначение подробно. sqlparse
(SQL Parser) — это библиотека для анализа, форматирования и обработки SQL-запросов. В Django она используется в админке, логах и отладке ORM. Форматирование SQL-запросов в
django.db.connection.queries
from django.db import connection
from sqlparse import format
queries = connection.queries # Получаем список SQL-запросов
for q in queries:
print(format(q["sql"], reindent=True, keyword_case="upper")) # Красивый SQL
Логирование SQL-запросов
sqlparse
помогает Django красиво выводить SQL-запросы в DEBUG=True
.Команда
sqlmigrate
python manage.py sqlmigrate app_name 0001
asgiref
(Asynchronous Server Gateway Interface Reference) — это библиотека, которая помогает Django работать в асинхронном (async) режиме. Django поддерживает ASGI с версии 3.0, и asgiref
— это её обязательная зависимость.Django с версии 3.0 поддерживает асинхронные вьюхи, WebSockets и асинхронные базы данных (например, с
asyncpg
).В
settings.py
есть параметр:ASGI_APPLICATION = "myproject.asgi.application"
Django 4.x поддерживает асинхронные middleware через
asgiref.sync
и asgiref.local
.Django использует
sync_to_async()
и async_to_sync()
из asgiref
:from asgiref.sync import sync_to_async
def sync_function():
return "Hello from sync!"
async_function = sync_to_async(sync_function)
print(async_function()) # Вызывает синхронную функцию в асинхронном коде
Позволяет хранить данные отдельно для каждого потока или запроса.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11💊2
Это принцип, согласно которому объект считается пригодным для использования, если он имеет требуемые методы или поведение, независимо от его типа. Пример:
"Если что-то выглядит как утка, плавает как утка и крякает как утка, то это, скорее всего, утка."
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19👍4💊1
Сортировка слиянием (
Merge Sort
) — это алгоритм, который использует разделяй и властвуй (divide & conquer). В худшем случае сложность O(n log n).
до тех пор, пока не останутся отдельные элементы.
полученные подмассивы.
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
def merge(left, right):
sorted_arr = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
sorted_arr.append(left[i])
i += 1
else:
sorted_arr.append(right[j])
j += 1
sorted_arr.extend(left[i:])
sorted_arr.extend(right[j:])
return sorted_arr
arr = [5, 2, 9, 1, 5, 6]
print(merge_sort(arr))
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10💊1
Конструкция import package.item позволяет импортировать конкретный модуль или объект (например, класс или функцию) из пакета. Это:
1. Упрощает доступ к необходимому элементу без загрузки всего пакета.
2. Повышает читаемость и производительность, так как загружается только требуемый код.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍6
Forwarded from easyoffer
Привет, ребята!
1,5 года я учился на программиста, а сайт easyoffer.ru стал моим пет-проектом. Я создавал его, потому что:
а) нужно было добавить хоть какой-нибудь проект в резюме
б) подготовиться к прохождению собесов
И всё получилось! Благодаря еasyoffer я успешно прошёл собеседование и устроился Python Junior-разработчиком на удаленку с зарплатой 115 тысяч рублей.
Однако ещё во время разработки я понял, что у этого проекта есть потенциал. Казалось, что сайт может стать популярным и, возможно, превратиться в стартап.
По-этому я с самого начала заложил в проект минимальную бизнес-модель, на случай, если сайт начнёт набирать трафик. Я предложил пользователям полный доступ к сайту в обмен на подписку на Telegram-каналы. Это позволяло развивать аудиторию, а в будущем — зарабатывать на рекламе.
Результат превзошёл ожидания!
С момента запуска easyoffer посетило 400 тысяч человек. А когда доход с рекламы превысил мою зарплату программиста, я принял решение уйти с работы и полностью посвятить себя разработке новой версии сайта.
Вот так, зайдя в IT, через 4 месяца вышел через свой же пет-проект. Мне очень повезло
Уже год я работаю над easyoffer 2.0.
Это будет более масштабный и качественной новый проект:
– Появится тренажер
– Появятся задачи из собесов
– Фильтрация контента по грейдам
и еще очень много фич, о которых я расскажу позже.
Хочу, довести easyoffer до ума, чтобы сайт стал настоящим помощником для всех, кто готовится к собеседованиям.
По этому в ближайшее время я объявлю о старте краудфандинговой кампании, чтобы ускорить разработку и я готов щедро отблагодарить всех, кто поддержит проект.
А те, кто поддержат проект первыми, получат специальные лимитированные выгодные вознаграждения. Следите за этим телеграм каналом, если хотите стать первыми сапортерами.
1,5 года я учился на программиста, а сайт easyoffer.ru стал моим пет-проектом. Я создавал его, потому что:
а) нужно было добавить хоть какой-нибудь проект в резюме
б) подготовиться к прохождению собесов
И всё получилось! Благодаря еasyoffer я успешно прошёл собеседование и устроился Python Junior-разработчиком на удаленку с зарплатой 115 тысяч рублей.
Однако ещё во время разработки я понял, что у этого проекта есть потенциал. Казалось, что сайт может стать популярным и, возможно, превратиться в стартап.
По-этому я с самого начала заложил в проект минимальную бизнес-модель, на случай, если сайт начнёт набирать трафик. Я предложил пользователям полный доступ к сайту в обмен на подписку на Telegram-каналы. Это позволяло развивать аудиторию, а в будущем — зарабатывать на рекламе.
Результат превзошёл ожидания!
С момента запуска easyoffer посетило 400 тысяч человек. А когда доход с рекламы превысил мою зарплату программиста, я принял решение уйти с работы и полностью посвятить себя разработке новой версии сайта.
Вот так, зайдя в IT, через 4 месяца вышел через свой же пет-проект. Мне очень повезло
Уже год я работаю над easyoffer 2.0.
Это будет более масштабный и качественной новый проект:
– Появится тренажер
– Появятся задачи из собесов
– Фильтрация контента по грейдам
и еще очень много фич, о которых я расскажу позже.
Хочу, довести easyoffer до ума, чтобы сайт стал настоящим помощником для всех, кто готовится к собеседованиям.
По этому в ближайшее время я объявлю о старте краудфандинговой кампании, чтобы ускорить разработку и я готов щедро отблагодарить всех, кто поддержит проект.
А те, кто поддержат проект первыми, получат специальные лимитированные выгодные вознаграждения. Следите за этим телеграм каналом, если хотите стать первыми сапортерами.
👍7💊7❤6🤯1
Хвостовая рекурсия (tail recursion) — это особый вид рекурсии, когда рекурсивный вызов является последней операцией в функции. В языках, поддерживающих оптимизацию хвостовой рекурсии (TCO – Tail Call Optimization), такие вызовы не создают новый стек вызовов, а переиспользуют текущий, что предотвращает переполнение стека.
Но в Python хвостовая рекурсия НЕ оптимизируется из-за особенностей интерпретатора (Python хранит полную историю вызовов для отладки).
Лучший способ избежать проблем с глубокой рекурсией — заменить её циклом.
def factorial(n, acc=1):
if n == 0:
return acc
return factorial(n - 1, acc * n) # Хвостовая рекурсия (но Python не оптимизирует!)
Решение: заменить на цикл (итеративный подход)
def factorial_iter(n):
acc = 1
while n > 0:
acc *= n
n -= 1
return acc
print(factorial_iter(10000)) # Работает без ошибок
Python имеет ограничение на глубину рекурсии (обычно около
1000
). Можно его увеличитьimport sys
sys.setrecursionlimit(20000) # Увеличение лимита
Если рекурсивная функция пересчитывает одни и те же значения, можно кешировать результаты.
from functools import lru_cache
@lru_cache(None) # Кеширует все вызовы функции
def fibonacci(n):
if n < 2:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(100)) # Работает быстро, без переполнения стека
Если алгоритм требует рекурсии, но стек ограничен, можно использовать список как стек.
def factorial_stack(n):
stack = [(n, 1)]
while stack:
n, acc = stack.pop()
if n == 0:
return acc
stack.append((n - 1, acc * n))
print(factorial_stack(10000)) # Работает без ошибок
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1
- Должен возвращать итератор объекта.
2. Метод next:
- Возвращает следующий элемент последовательности. Поднимает исключение StopIteration, если элементы закончились.
Для итераторов необходимо реализовать оба метода.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12