Prosto Python | вопросы с собесов
363 subscribers
184 photos
1 video
2 files
566 links
🚀 Python-собесы без сюрпризов! Разбираем реальные вопросы, ошибки кандидатов и лайфхаки, которые помогают пройти интервью. Джун → мидл → сеньор — прокачивайся и разнеси следующий собес! 🔥
Download Telegram
С Новым годом 🎄

Пусть в новом году будет больше ясности —
в голове, в коде и в том, куда ты вообще идёшь.

Пусть Python приносит не только ошибки и Stack Overflow,
а ощущение, что ты реально что-то умеешь и растёшь.

Спасибо, что вы здесь и читаете канал.
В новом году продолжаем делать полезный контент🎉🎉🎉

🐍Вопросы с собесов -> ProstoPython
🎉51
🐍 Python Style — выпуск №7
Тема: list comprehension вместо for + append


Частая картина в коде — собираем список через цикл.
Работает, но выглядит громоздко 👀


Не лучший вариант (for + append):

numbers = [1, 2, 3, 4, 5]
squares = []

for n in numbers:
squares.append(n ** 2)


Много строк и лишних движений для простой операции.

Python Style — используем list comprehension:

numbers = [1, 2, 3, 4, 5]
squares = [n ** 2 for n in numbers]

🧠 Почему так лучше:
🔹 логика в одной строке
🔹 сразу видно, что и откуда берётся
🔹 меньше кода — меньше ошибок
🔹 стандартный питоновский приём

📌 Бонус: с условием

squares = [n ** 2 for n in numbers if n % 2 == 0]

Чисто. Ясно. По-питоновски 🐍

🐍Вопросы с собесов -> ProstoPython
👍4
WebSocket — это протокол, обеспечивающий постоянное двустороннее соединение между клиентом и сервером.

🔹 работает поверх одного TCP-соединения
🔹 позволяет серверу и клиенту обмениваться данными в реальном времени
🔹 не требует постоянных HTTP-запросов

Используется для чатов, уведомлений, онлайн-игр и других real-time приложений.

🐍Вопросы с собесов -> ProstoPython
🔥3👍2
Денормализация — это намеренное добавление избыточных данных в базу для ускорения чтения запросов.

🔹 снижает количество JOIN
🔹 повышает производительность чтения
🔹 увеличивает дублирование данных
🔹 усложняет обновление и поддержку целостности

Используется, когда скорость чтения важнее строгой нормализации.

🐍Вопросы с собесов -> ProstoPython
🔥4
🐍 Python Style — выпуск №8
Тема: dict.get() вместо лишних if


Очень распространённый код, который работает, но выглядит перегруженным.

Не лучший стиль:
if "price" in data:
price = data["price"]
else:
price = 0


Логика простая, а кода много.

Python Style:
price = data.get("price", 0)


Коротко и сразу понятно:
👉 «возьми price, а если нет — пусть будет 0»

🧠 Почему это хороший стиль:


🔹 меньше кода

🔹 меньше условий

🔹 ниже шанс ошибки

🔹 читается в одну строку

📌 Правило Python Style:
Если словарь -> сначала думай про get().

🐍Вопросы с собесов -> ProstoPython
🔥4
Пакет — это набор связанных модулей, объединённых в одну структуру.

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

В Python пакет — это способ логически группировать функциональность.

🐍Вопросы с собесов -> ProstoPython
4
🐍 Python Style — выпуск №9
Тема: не используй == True и == False


Код может работать идеально… и при этом выглядеть странно 👀
Один из самых частых примеров — сравнение с True и False.


Плохой стиль:
if is_active == True:
send_email()


Или ещё хуже:
if is_active == False:
block_user()


Python Style:
if is_active:
send_email()

if not is_active:
block_user()


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

🔹 короче и чище

🔹 читается как обычная речь

🔹 меньше визуального шума

🔹 это официальный стиль Python (PEP 8)

🐍Вопросы с собесов -> ProstoPython
🔥3
PEP 8 — это официальный стиль-гайд Python, который описывает правила оформления кода.

🔹 отступы и длину строк
🔹 именование переменных, функций и классов
🔹 расположение импортов
🔹 форматирование выражений

PEP 8 нужен, чтобы код был читаемым, единообразным и понятным для всей команды.

🐍Вопросы с собесов -> ProstoPython
🏆4
🐍 Python Style
Тема: enumerate() вместо ручного счётчика


Очень часто можно увидеть такой код 👇
Работает, но выглядит как C, а не Python 😅


Не по-питоничному:
i = 0
for item in items:
print(i, item)
i += 1


Python Style:
for i, item in enumerate(items):
print(i, item)


А если нужен старт не с нуля:
for i, item in enumerate(items, start=1):
print(i, item)


🧠 Почему это хороший стиль:

🔹 меньше кода

🔹 меньше ошибок со счётчиком

🔹 читается в одну строку

🔹 сразу видно намерение

🐍Вопросы с собесов -> ProstoPython
👍4
HTTP — это протокол клиент-серверного взаимодействия по модели запрос-ответ.

🔹 клиент отправляет HTTP-запрос
🔹 сервер обрабатывает его и возвращает HTTP-ответ
🔹 каждый запрос независим и не хранит состояние (stateless)
🔹 данные передаются в виде заголовков и тела сообщения

HTTP используется для передачи ресурсов в вебе и лежит в основе работы сайтов и API.

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


Код может быть «чистым» на вид, но при этом дорогим по производительности.
Особенно часто это встречается при работе со списками.


До (лишние проходы):

numbers = [1, 2, 3, 4, 5, 6]

evens = []
for n in numbers:
if n % 2 == 0:
evens.append(n)

squares = []
for n in evens:
squares.append(n * n)


Два цикла.
Два прохода.


После (один проход):
squares = [n * n for n in numbers if n % 2 == 0]


🧠 Почему это лучше:

🔹 один проход вместо двух

🔹 меньше кода

🔹 проще читать

🔹 быстрее на больших данных

🐍Вопросы с собесов -> ProstoPython
👍4
🐍 Python Style
Тема: with open() вместо ручного закрытия файлов

Один из самых простых способов сделать код безопаснее —
не закрывать файлы вручную.

Плохой стиль:

file = open("data.txt", "r")
data = file.read()
file.close()


Что может пойти не так?
Если между open() и close() упадёт ошибка — файл останется открыт.


Python Style:

with open("data.txt", "r") as file:
data = file.read()


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

🔹 файл закроется автоматически

🔹 код короче и чище

🔹 безопасно при ошибках

🔹 стандарт де-факто в Python

🐍Вопросы с собесов -> ProstoPython
🔥4
Объект первого класса — это сущность, с которой можно обращаться так же, как с обычными значениями.

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

В Python функции, классы и типы являются объектами первого класса.

🐍Вопросы с собесов -> ProstoPython
🔥4
Оценка сложности O(n) возникает, когда время работы алгоритма растёт линейно от количества входных данных — каждая операция выполняется один раз для каждого элемента.

O(n²) появляется, когда для каждого элемента выполняется полный проход по всем остальным (например, вложенные циклы).

O(n) предпочтительнее, потому что при росте данных время выполнения увеличивается гораздо медленнее: при больших n линейный алгоритм работает на порядки быстрее квадратичного.

🐍Вопросы с собесов -> ProstoPython
👍3
🐍 Python Style
Тема: не используй range(len(...)), если можно проще


Очень частый паттерн у начинающих — и почти никогда у опытных Python-разработчиков 👀

Не по-питоничному:

for i in range(len(users)):
print(users[i])


Работает, но выглядит как перенос кода из других языков.


Python Style:
for user in users:
print(user)


А если нужен и индекс, и значение:
for i, user in enumerate(users):
print(i, user)


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

🔹 меньше шума

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

🔹 код читается как обычный текст

🔹 Python создан именно для такого стиля

🐍Вопросы с собесов -> ProstoPython
🔥3
🐍 Python Style
Тема: используй any() и all() вместо ручных проверок

Иногда в коде встречаются такие конструкции 👇
Работают, но выглядят громоздко и утомительно.


Не по-питоничному:
has_negative = False
for x in numbers:
if x < 0:
has_negative = True
break


Python Style:
has_negative = any(x < 0 for x in numbers)


И наоборот — если нужно проверить все элементы:

all_positive = all(x > 0 for x in numbers)


🧠 Почему это хороший стиль:

🔹 короче и выразительнее

🔹 сразу видно намерение

🔹 работает лениво (эффективно)

🔹 меньше вспомогательных переменных

🐍Вопросы с собесов -> ProstoPython
👍4🔥2
🧰 Code Cleanup — выпуск 18
Тема: убираем магические числа из кода


Магические числа — это числа, которые появляются в коде без объяснения.
Например:

Плохо:
if user.age >= 18:
allow_access()


Что значит 18? Почему именно 18? 🔍


Code Cleanup:
ADULT_AGE = 18

if user.age >= ADULT_AGE:
allow_access()


Теперь понятно, что это за число, и если правила изменятся — достаточно поменять константу в одном месте.

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

🔹 код читается сразу

🔹 проще поддерживать

🔹 меньше ошибок при изменениях

🔹 понятнее для команды и ревьюеров

🐍Вопросы с собесов -> ProstoPython
🏆4👍1
🐍 Python Style
Тема: используй set для проверок вхождения


Часто нужно проверить, есть ли элемент в коллекции 👇
Работает, но можно сделать быстрее и чище.


Не по-питоничному:

items = [1, 3, 5, 7, 9]

if x in items:
print("Найдено")


(Особенно больно, если список большой)
Python Style:


items = {1, 3, 5, 7, 9}

if x in items:
print("Найдено")


🧠 Почему это хороший стиль:
🔹 проверка in за O(1), а не O(n)
🔹 код сразу говорит: «мне важна уникальность и поиск»
🔹 меньше скрытых проблем с производительностью
🔹 идеально для фильтров, флагов, whitelists / blacklists

📌 Запомни:
list — когда важен порядок
set — когда важна скорость и уникальность

🐍Вопросы с собесов -> ProstoPython
🔥4👍2
Попробуйте ответить без запуска кода, разбор будет через 2 часа

🐍Вопросы с собесов -> ProstoPython
👍3
Правильный ответ
Правильный вариант:


[1]
[1, 2]
[1, 2, 3]


🧠 Почему именно так

Подвох в значении по умолчанию аргумента items=[].

В Python:

🔷 значения аргументов по умолчанию
🔷 создаются один раз — в момент определения функции
🔷 и переиспользуются при каждом вызове

То есть items — это один и тот же список для всех вызовов add_item.

Что происходит пошагово:

1️⃣ add_item(1)
🔷 список был пуст
🔷 добавили 1
🔷 [1]

2️⃣ add_item(2)
🔷 это тот же самый список
🔷 добавили 2
🔷 [1, 2]

3️⃣ add_item(3)
🔷 снова тот же объект
🔷 [1, 2, 3]

Накидайте 🔥, если было полезно и интересно

🐍Вопросы с собесов -> ProstoPython
🔥5