Python | Вопросы собесов
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads
Ko'proq ko'rsatish📈 Telegram kanali Python | Вопросы собесов analitikasi
Python | Вопросы собесов (@python_easy_ru) Rus til segmentidagi kanali faol ishtirokchi. Hozirda hamjamiyat 12 637 obunachidan iborat bo'lib, Texnologiyalar & Aralashmalar toifasida 9 922-o'rinni va Rossiya mintaqasida 51 155-o'rinni egallagan.
📊 Auditoriya ko‘rsatkichlari va dinamika
невідомо sanasidan buyon loyiha tez o‘sib, 12 637 obunachiga ega bo‘ldi.
13 Oktabr, 2026 dagi oxirgi ma’lumotlarga ko‘ra kanal barqaror faollikka ega. Oxirgi 30 kunda obunachilar soni -115 ga, so‘nggi 24 soatda esa -6 ga o‘zgardi va umumiy qamrov yuqori darajada qolmoqda.
- Tasdiqlash holati: Tasdiqlanmagan
- Jalb etish (ER): Auditoriya o‘rtacha 6.04% darajada jalb etiladi. Nashrdan keyingi dastlabki 24 soatda kontent odatda umumiy obunachilar sonining 4.18% ini tashkil etuvchi reaksiyalarni to‘playdi.
- Post qamrovi: Har bir post o‘rtacha 763 marta ko‘riladi; birinchi sutkada odatda 528 ta ko‘rish yig‘iladi.
- Reaksiyalar va o‘zaro ta’sir: Auditoriya faol: har bir postga o‘rtacha 2 ta reaksiya keladi.
- Tematik yo‘nalishlar: Kontent ставь, модуль, строка, docker, alice kabi asosiy mavzularga jamlangan.
📝 Tavsif va kontent siyosati
Muallif resursni shaxsiy fikrni ifoda etish maydoni sifatida ta’riflaydi:
“Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy
Контакт для рекламы: @sendme_ads”
Yuqori yangilanish chastotasi (oxirgi ma’lumot 14 Oktabr, 2026 da olingan) sababli kanal doimo dolzarb va katta qamrovli bo‘lib qoladi. Analitika auditoriya kontent bilan faol hamkorlik qilishini, uni Texnologiyalar & Aralashmalar toifasidagi muhim ta’sir nuqtasiga aylantirishini ko‘rsatadi.
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)) # Работает без ошибок
🟠Использование `sys.setrecursionlimit()` (не рекомендуется)
Python имеет ограничение на глубину рекурсии (обычно около 1000). Можно его увеличить
import sys
sys.setrecursionlimit(20000) # Увеличение лимита
🟠Использование `functools.lru_cache()` (мемоизация)
Если рекурсивная функция пересчитывает одни и те же значения, можно кешировать результаты.
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)) # Работает быстро, без переполнения стека
🟠Использование `stack` вместо рекурсии (эмуляция стека)
Если алгоритм требует рекурсии, но стек ограничен, можно использовать список как стек.
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)) # Работает без ошибок
Ставь 👍 и забирай 📚 Базу знаний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))
Ставь 👍 и забирай 📚 Базу знанийsqlparse и asgiref как вспомогательные библиотеки для работы с SQL и асинхронностью. Разберём их назначение подробно.
🟠`sqlparse` – разбор SQL-запросов
sqlparse (SQL Parser) — это библиотека для анализа, форматирования и обработки SQL-запросов. В Django она используется в админке, логах и отладке ORM.
🚩Где используется в Django?
Форматирование 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` – асинхронность в Django
asgiref (Asynchronous Server Gateway Interface Reference) — это библиотека, которая помогает Django работать в асинхронном (async) режиме. Django поддерживает ASGI с версии 3.0, и asgiref — это её обязательная зависимость.
🚩Где используется в Django?
🟠Поддержка ASGI
Django с версии 3.0 поддерживает асинхронные вьюхи, WebSockets и асинхронные базы данных (например, с asyncpg).
В settings.py есть параметр:
ASGI_APPLICATION = "myproject.asgi.application"
🟠Асинхронные middleware
Django 4.x поддерживает асинхронные middleware через asgiref.sync и asgiref.local.
🟠Преобразование `async` → `sync` и наоборот
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()) # Вызывает синхронную функцию в асинхронном коде
🟠Локальное хранилище для асинхронных задач (`asgiref.local.Local`)
Позволяет хранить данные отдельно для каждого потока или запроса.
Ставь 👍 и забирай 📚 Базу знанийset) — это неупорядоченная коллекция уникальных элементов, которая работает на основе хеш-таблицы. Это значит, что только хешируемые (immutable) объекты могут быть добавлены в set.
🚩Можно добавить в `set`:
Числа (int, float, complex)
s = {1, 2.5, 3+4j}
Строки (str)
s = {"apple", "banana", "cherry"}
Кортежи (tuple), если они тоже содержат только неизменяемые объекты
s = {(1, 2), ("a", "b")}
Булевые значения (bool)** (но True считается 1, а False — 0)
s = {True, False, 1, 0}
print(s) # {False, True} (0 и 1 не добавятся повторно)
🚩Нельзя добавить в `set`
Изменяемые объекты (list, set, dict)
s = { [1, 2, 3] } # Ошибка: TypeError: unhashable type: 'list'
s = { {"key": "value"} } # Ошибка: TypeError: unhashable type: 'dict'
Кортежи с изменяемыми элементами
s = { (1, [2, 3]) } # Ошибка: TypeError
Ставь 👍 и забирай 📚 Базу знанийdict) работают очень быстро, потому что они используют хеш-таблицы. Это позволяет находить значения по ключу в константное время O(1) в большинстве случаев. Давайте разберемся, как это работает.
🟠Как устроен словарь в Python?
Словарь (dict) — это структура данных, которая хранит пары ключ → значение. Например:
data = {"name": "Alice", "age": 25, "city": "New York"}
print(data["age"]) # 25
🟠Как работает хеш-таблица?
Основной принцип:
Хеш-функция (hash()) вычисляет уникальное число (хеш) для ключа.
Используется массив (таблица), где данные хранятся по индексам, связанным с хешем.
Поиск по ключу — это просто вычисление хеша и обращение к нужному индексу.
print(hash("age")) # Например, вернет 328847234 (будет разным при каждом запуске)
Когда мы пишем
value = data["age"]
🟠Почему поиск занимает O(1)?
Нет линейного поиска: вместо перебора всех элементов 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 (редко, но бывает)
Ставь 👍 и забирай 📚 Базу знанийUser) и механизме сессий. Когда пользователь входит в систему, Django проверяет его учетные данные и создает сессию, сохраняя в ней идентификатор пользователя.
Процесс можно разделить на несколько шагов:
Пользователь вводит логин и пароль.
Django проверяет данные через аутентификационный бэкенд.
Если данные верны, Django создает сессию.
При каждом запросе Django проверяет, авторизован ли пользователь.
🚩Основные компоненты системы аутентификации
🟠Модель пользователя (`User`)
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
🟠Аутентификация (`authenticate`)
Django использует функцию authenticate() для проверки учетных данных.
from django.contrib.auth import authenticate
user = authenticate(username="admin", password="12345")
if user is not None:
print("Успешный вход!")
else:
print("Ошибка аутентификации!")
🟠Вход и выход (`login` / `logout`)
После успешной аутентификации пользователя можно "впустить" с помощью 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 "Это страница профиля!"
🚩Настройка аутентификации
🟠Настройки в `settings.py`
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) # Добавляем пользователя в группу
Ставь 👍 и забирай 📚 Базу знаний 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)
🟠Бинарные файлы (`BufferedReader`, `BufferedWriter`)
Эти файлы используются для работы с двоичными данными (изображениями, видео, аудиофайлами и т. д.).
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) # Записываем данные в новый файл
🟠Файлы ввода-вывода в памяти (`io.StringIO`, `io.BytesIO`)
Эти объекты представляют собой файловые буферы, которые хранят данные в оперативной памяти, а не на диске.
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()
Ставь 👍 и забирай 📚 Базу знаний+, -, *, 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)
Ставь 👍 и забирай 📚 Базу знаний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
🚩Автоматически генерируемые методы
🟠`__init__`
Инициализирует объект с заданными значениями атрибутов.
🟠`__repr__`
Возвращает строковое представление объекта, удобное для отладки.
🟠`__eq__`
Сравнивает объекты на равенство по их атрибутам.
🟠`__lt__`, __le__,🤔 Что так🤔 Что такМогут быть сгенерированы для сравнения объектов (если указано).
🚩Настройка поведения
Вы можете настроить поведение @dataclass с помощью параметров, таких как order, frozen, и других.
🟠`order=True`
Генерирует методы для сравнения объектов.
🟠`frozen=True`
Делает экземпляры неизменяемыми (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)
Ставь 👍 и забирай 📚 Базу знаний