Prosto Python | вопросы с собесов
364 subscribers
184 photos
1 video
2 files
568 links
🚀 Python-собесы без сюрпризов! Разбираем реальные вопросы, ошибки кандидатов и лайфхаки, которые помогают пройти интервью. Джун → мидл → сеньор — прокачивайся и разнеси следующий собес! 🔥
Download Telegram
⏱️ 1 минута о Python: Что делает map()? 🗺

Когда нужно применить одну функцию ко всем элементам списка — не обязательно писать цикл.
Python умеет это делать красиво 💅
nums = [1, 2, 3, 4]
squared = map(lambda x: x ** 2, nums)
print(list(squared))

[1, 4, 9, 16]


💡 map(func, iterable) — применяет функцию func ко всем элементам и возвращает итератор.

📘 Где полезно:

🔷быстро преобразовать данные

🔷заменить циклы в одну строку

🔷сочетать с list(), set(), tuple()

🐍Вопросы с собесов -> ProstoPython
👍51
🔷 В Django система аутентификации основана на встроенном приложении django.contrib.auth, которое управляет пользователями, паролями и сессиями.

🔹 При входе пользователь проходит проверку через authenticate() и login().
🔹 Django создаёт сессию, связывая пользователя с уникальным идентификатором.
🔹 На каждом запросе request.user показывает текущего авторизованного пользователя.

👉 Система поддерживает регистрацию, вход, выход и права доступа «из коробки».

🐍Вопросы с собесов -> ProstoPython
4
💬 Вопрос на собесе:
В чём разница между асинхронностью и параллелизмом?


👶 Junior:
— Ну… и то, и то вроде делает несколько задач одновременно? 🤔

🧑‍💻 Middle:
Параллелизм — это когда код реально выполняется одновременно.
Асинхронность — это когда задачи поочерёдно делят время выполнения, не блокируя друг друга.

🧙‍♂️ Senior:
— Отличие в уровне:
🔹 Параллелизм — про одновременное выполнение кода на нескольких вычислительных единицах.
🔹 Асинхронность — про управление ожиданием, когда одна задача временно “ждёт” (например, сетевой ответ), а управление передаётся другой.
🔹 В Python за асинхронность отвечает asyncio и цикл событий,
а за параллелизм — threading (потоки) и multiprocessing (процессы).

📘 Пример в реальной жизни:

Асинхронность — официант обслуживает несколько столов по очереди, не стоя без дела.

Параллелизм — несколько официантов работают одновременно 🍽

🐍Вопросы с собесов -> ProstoPython
👍4
🔷 RESTful — это стиль построения веб-API, основанный на принципах REST (Representational State Transfer).

🔹 Использует стандартные HTTP-методы (GET, POST, PUT, DELETE)
🔹 Работает с ресурсами, представляемыми в виде URL
🔹 Возвращает данные чаще всего в формате JSON

👉 RESTful-сервис — это API, которое следует этим правилам, обеспечивая простоту, предсказуемость и масштабируемость.

🐍Вопросы с собесов -> ProstoPython
🔥2🏆1
🔷 Динамическое программирование — это метод оптимизации, при котором сложная задача разбивается на перекрывающиеся подзадачи, а результаты этих подзадач сохраняются для повторного использования.

👉 Нужно, чтобы избежать лишних вычислений и ускорить решение задач, например — вычисление чисел Фибоначчи, поиск кратчайшего пути, оптимизация ресурсов.


🐍Вопросы с собесов -> ProstoPython
🔥4
⏱️ 1 минута о Python: Что делает globals() и locals()? 🌍🔍

Иногда нужно посмотреть, какие переменные доступны прямо сейчас —
и Python даёт для этого два очень полезных инструмента: globals() и locals().
x = 10

def demo():
y = 20
print("locals:", locals())
print("globals keys:", list(globals().keys())[:5])

demo()


Примерный вывод:
locals: {'y': 20}
globals keys: ['__name__', '__doc__', 'x', ...]


🧠 Что это такое?

locals() -> возвращает словарь локальных переменных (внутри функции, цикла, блока).

globals() -> возвращает словарь глобальных переменных файла/модуля.

🐍Вопросы с собесов -> ProstoPython
👍5
Убедиться, что экземпляр принадлежит классу-потомку, можно с помощью isinstance() — он проверяет объект на принадлежность классу с учётом наследования.

👉 Например:

isinstance(obj, ChildClass)


Если obj создан из ChildClass или его наследников — результат будет True.

🐍Вопросы с собесов -> ProstoPython
4
🧰 Code Cleanup — выпуск 2
Тема: заменяем громоздкие проверки на питоничный стиль

Иногда код работает, но выглядит так, будто писал его человек,
который боялся использовать возможности Python 😅
Сегодня чистим одну из самых распространённых историй — длинные проверки.

Как часто пишут начинающие:
if user is not None and user.is_active == True and len(user.roles) > 0:
print("Access granted")


Работает? Да.
Красиво? …ну такое 🫠

Питоничный вариант:
if user and user.is_active and user.roles:
print("Access granted")


🧹 Что улучшили:

Убрали == True — лишнее сравнение.

Сократили is not None → Python сам проверяет truthiness.

Список ролей (user.roles) в логическом контексте сам становится False, если пуст.

Перестали превращать простое условие в лабиринт.

💡 Правило для запоминания:
Если объект в Python можно интерпретировать как True/False —
позвольте Python сделать это за вас.


🐍Вопросы с собесов -> ProstoPython
6
Основные виды тестов:

1️⃣ Юнит-тесты — проверяют отдельные функции и классы изолированно.

2️⃣ Интеграционные тесты — проверяют взаимодействие модулей между собой.

3️⃣ Функциональные (acceptance) тесты — проверяют работу функций и сценариев приложения.

4️⃣ Системные тесты — проверяют приложение целиком.

5️⃣ Регрессионные тесты — убеждаются, что новые изменения не сломали старый функционал.

6️⃣ Нагрузочные тесты — измеряют поведение системы под высокой нагрузкой.

7️⃣ UI/End-to-End тесты — проверяют работу приложения глазами пользователя.

🐍Вопросы с собесов -> ProstoPython
🔥51
🧩 Новая рубрика — PyTools Finder!🔥🔥🔥

Будем разбирать одну интересную и полезную библиотеку Python,
которая реально может упростить жизнь разработчика: от ускорения кода до автоматизации, работы с данными, API, файлами 🤓

Коротко, понятным языком, с примерами и реальными кейсами.
Никакой воды — только то, что можно применить сразу же.

🐍Вопросы с собесов -> ProstoPython
👍4
🧩 PyTools Finder
Библиотека дня: pydantic

Если ты когда-нибудь страдал от бесконечных проверок типов, валидации данных и ловил баги из-за «не того формата»,
то pydantic — это то, что делает жизнь Python-разработчика спокойнее 😌.

🔥 Что делает Pydantic полезным:

Автоматически валидирует входные данные

Преобразует типы (str -> int, dict -> объект и т.д.)

Делает удобные модели данных, как в TypeScript

Покрывает половину рутины за тебя

Пример — валидация без лишнего шума ⬇️
from pydantic import BaseModel

class User(BaseModel):
name: str
age: int

u = User(name="Alice", age="23")
print(u.age) # 23 — автоматически сконвертировал!


Почему это важно?
Потому что плохие данные ломают даже хороший код.
А pydantic превращает хаос входящей информации в аккуратные, понятные структуры данных.

🐍Вопросы с собесов -> ProstoPython
🏆5
🧰 Code Cleanup — выпуск 3
Тема: избавляемся от лишних проверок

Иногда код работает… но выглядит как будто его писал человек, который очень сомневался в каждом шаге 😅
Вот типичный пример:

До (слишком многословно):
def normalize_name(name):
if name is not None:
if isinstance(name, str):
if name.strip() != "":
return name.strip().title()
return None


Работает? Да.
Понятно? Еле-еле.

После (чисто и по-питоничному):
def normalize_name(name):
if not isinstance(name, str) or not name.strip():
return None
return name.strip().title()


Что изменилось:


🔹 убрали вложенные if, теперь условие читается с первого взгляда

🔹 возврат данных стал предсказуемым

🔹 код короче, но логика прежняя

🔹 легче поддерживать и расширять

🐍Вопросы с собесов -> ProstoPython
🔥4
CRUD — это набор базовых операций над данными:

C — Create (создание)
R — Read (чтение)
U — Update (обновление)
D — Delete (удаление)

Эти операции лежат в основе работы большинства приложений и баз данных.

🐍Вопросы с собесов -> ProstoPython
👍4
⏱️ 1 минута о Python — setdefault()

Когда нужно добавить элемент в словарь, но при этом не перезаписать существующее значение — многие пишут вот так:
if key not in data:
data[key] = []
data[key].append(value)


Работает, но выглядит громоздко.
Python умеет проще 😎


⭐️ setdefault()

Метод, который возвращает значение по ключу,
а если ключа нет — создаёт его с дефолтом.


⚡️ Пример
data = {}
data.setdefault("users", []).append("Alice")
data.setdefault("users", []).append("Bob")

print(data)


Результат:
{"users": ["Alice", "Bob"]}

🧠 Почему это удобно?

🔷Избавляет от лишних проверок

🔷Позволяет «лениво» создавать списки, словари и даже сложные структуры

🔷Снижает количество кода и повышает читаемость

🐍Вопросы с собесов -> ProstoPython
6
GET не предназначен для передачи тела запроса, а значит отправить файл через GET невозможно.

Вот истинное положение дел:

GET не может отправлять файл

У GET нет тела (body) — оно игнорируется большинством серверов и библиотек.

Поэтому файл нельзя вложить в GET так же, как в POST/PUT.

🐍Вопросы с собесов -> ProstoPython
🔥4
🧰 Code Cleanup — выпуск 4
Тема: избавляемся от лишних условий в return


Нередко можно встретить такой код — он работает, но выглядит как будто автор очень старался усложнить простую вещь 😅

До (типичное "если да — верни True")
def is_adult(age):
if age >= 18:
return True
else:
return False

Работает? Да.
Но логика избыточная: Python умеет проще.


После (коротко и по делу)
def is_adult(age):
return age >= 18


Почему так лучше:

🔹 меньше кода — меньше ошибок

🔹 читатель сразу видит условие, а не структуру из if/else

🔹 легче поддерживать и тестировать

🐍Вопросы с собесов -> ProstoPython
👍4
Apache Kafka — это платформа для потоковой передачи данных, которая используется для:

🔹 обмена сообщениями между сервисами
🔹 обработки данных в реальном времени
🔹 буферизации нагрузки
🔹 надёжного хранения и повторного чтения событий

Итог: обеспечивает быстрый, масштабируемый и устойчивый обмен данными.

🐍Вопросы с собесов -> ProstoPython
🔥3
🧰 Code Cleanup — выпуск 5
Тема: превращаем длинные проверки в понятные конструкции


Часто в коде встречаются такие монстры:
длинное условие, которое занимает три строки, и ты уже забыл, что проверяешь к концу выражения 😅


До (условие, которое путает мозг):
def can_access(user):
if user is not None and user.is_active and not user.is_banned and user.role in ["admin", "moderator"]:
return True
return False


Нет, оно не плохое.
Но читать такое — страдание.


После (логика та же, читаемость лучше):
def can_access(user):
if not user:
return False

allowed_roles = {"admin", "moderator"}

return (
user.is_active
and not user.is_banned
and user.role in allowed_roles
)


Что изменилось:

🔹 разбили логику на смысловые блоки

🔹 вынесли роли в отдельную структуру → проще поддерживать

🔹 избавились от «простыни» внутри одного if

🔹 вернули булево выражение напрямую (без громоздких if/else)

🐍Вопросы с собесов -> ProstoPython
🏆4
🧰 Code Cleanup — выпуск 6
Тема: убираем дублирование и повторяющиеся конструкции


Один из частых анти-паттернов — одинаковые куски кода, разбросанные по функции.
Работает? Да.
Но поддерживать такое — мучение 😵‍💫


До (копируем одну и ту же логику три раза):
def format_user(user):
if user.name:
name = user.name.strip().title()
else:
name = "Unknown"

if user.email:
email = user.email.strip().lower()
else:
email = "no-email"

if user.city:
city = user.city.strip().title()
else:
city = "N/A"

return {"name": name, "email": email, "city": city}


Каждый блок делает одно и то же.
Это прямой сигнал: пора вынести повторение в отдельную функцию.


После (коротко, чисто, понятно):
def normalize(value, default, transform=str):
if not value:
return default
return transform(value.strip())

def format_user(user):
return {
"name": normalize(user.name, "Unknown", str.title),
"email": normalize(user.email, "no-email", str.lower),
"city": normalize(user.city, "N/A", str.title),
}


Что изменилось:

🔹 повторяющаяся логика вынесена в отдельную функцию

🔹 меньше кода — больше смысла

🔹 легко переиспользовать и расширять

🔹 структура format_user стала читабельной

🐍Вопросы с собесов -> ProstoPython
🔥3
В заголовках (headers) могут содержаться:

📌 Метаданные запроса и ответа
— тип контента (Content-Type)
— длина тела (Content-Length)
— кодировка (Content-Encoding)

📌 Информация о клиенте и сервере
— User-Agent
— Server
— Host

📌 Аутентификация и безопасность
— Authorization
— Cookie
— Set-Cookie

📌 Кэширование и контроль времени
— Cache-Control
— Expires
— ETag

📌 Параметры соединения
— Connection
— Keep-Alive

Заголовки передают служебную информацию, необходимую для корректной обработки HTTP-запросов и ответов.

🐍Вопросы с собесов -> ProstoPython
🔥4
🧰 Code Cleanup — выпуск 7
Тема: упрощаем вложенные условия


Часто можно встретить код с кучей вложенных if, который работает, но читается как лабиринт 😅

До (слишком много уровней вложенности):
def process_order(order):
if order is not None:
if order.items:
if order.user.is_active:
print("Processing order")


Работает? Да.
Но читается плохо и сложно поддерживать.


После (питонично и читабельно):
def process_order(order):
if not order or not order.items or not order.user.is_active:
return
print("Processing order")


Что изменилось:

🔹 убрали лишние уровни вложенности

🔹 сразу проверяем условия, при которых функция не должна работать (guard clause)

🔹 код стал компактным, читаемым и понятным с первого взгляда

🐍Вопросы с собесов -> ProstoPython
👍4