Prosto Python | вопросы с собесов
363 subscribers
184 photos
1 video
2 files
563 links
🚀 Python-собесы без сюрпризов! Разбираем реальные вопросы, ошибки кандидатов и лайфхаки, которые помогают пройти интервью. Джун → мидл → сеньор — прокачивайся и разнеси следующий собес! 🔥
Download Telegram
🔹 Hash map — структура данных для хранения key -> value с доступом за O(1) в среднем.

🔹 Механика работы:
1️⃣ hash(key) -> получаем число
2️⃣ index = hash % capacity -> индекс в массиве
3️⃣ По индексу хранится значение

🔹 Коллизия — разные ключи дают один индекс.
Решается через:

chaining (список в ячейке)

open addressing (поиск свободной ячейки, как в Python dict)

🔹 Сложность:
O(1) в среднем, O(n) в худшем случае.

🔹 Ключ должен быть неизменяемым и корректно реализовывать hash и eq.

🐍Вопросы с собесов -> ProstoPython
👍3
🧰 Code Cleanup — выпуск 23
Тема: не дублируй вычисление в условии


Иногда одно и то же выражение считают дважды.

Плохо:
if len(get_users()) > 0:
print(len(get_users()))


Работает.
Но функция вызывается два раза.


Code Cleanup:
users = get_users()

if users:
print(len(users))


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

🐍Вопросы с собесов -> ProstoPython
🔥4
⏱️ Big O Breakdown — выпуск 2

Смотри внимательно.
def process(nums):
n = len(nums)

i = 0
while i < n:
print(nums[i])
i *= 2
if i == 0:
i = 1


Какая сложность?

A) O(n)
B) O(log n)
C) O(n²)
D) O(1)

Правильный ответ: B) O(log n)

🧠 Почему так:

i удваивается на каждой итерации

1 —> 2 —> 4 —> 8 —> 16 —> ...

Количество шагов примерно log₂(n)

Это не линейный рост, а логарифмический

🐍Вопросы с собесов -> ProstoPython
👍4
Не запускай.
Подумай, как работает цикл и функции внутри него 👀

Разбор будет через два часа🔥

🐍Вопросы с собесов -> ProstoPython
Правильный ответ: [2, 2, 2]

🧠 Почему так:


🔷Функции не сохраняют значение i в момент создания

🔷Они запоминают ссылку на переменную

🔷После цикла i == 2

🔷Все функции возвращают текущее значение i, то есть 2

🐍Вопросы с собесов -> ProstoPython
😱4🔥3
⏱️ Big O Breakdown — выпуск 3

Смотри внимательно 👀


def example(nums):
n = len(nums)

for i in range(n):
for j in range(i):
print(i, j)


Какая сложность?
A) O(n)
B) O(n log n)
C) O(n²)
D) O(1)

Правильный ответ: C) O(n²)
🧠 Почему так:
Внутренний цикл выполняется:
0 раз
1 раз
2 раза
3 раза
...
(n-1) раз
В сумме это:
0 + 1 + 2 + ... + (n-1)

А это ≈ n² / 2
Константы отбрасываем —> остаётся O(n²)

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


Иногда код усложняют переменной, которая просто хранит состояние проверки.
Плохо:

found = False

for user in users:
if user.id == target_id:
found = True
break

if found:
print("User exists")

Работает.
Но переменная found здесь лишняя.


Code Cleanup:

for user in users:
if user.id == target_id:
print("User exists")
break

Или ещё чище:

if any(user.id == target_id for user in users):
print("User exists")


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

🐍Вопросы с собесов -> ProstoPython
🔥5
⏱️ Big O Breakdown — выпуск 4

Посмотри на код 👀
def contains_zero(nums):
for num in nums:
if num == 0:
return True
return False


Какая сложность?

A) O(1)
B) O(log n)
C) O(n)
D) O(n²)

Правильный ответ: C) O(n)

🧠 Почему так:

🔷Да, есть return внутри цикла.
🔷Да, иногда функция завершится быстро.

Но в худшем случае:

🔷нуля нет

🔷или он в самом конце

🔷Тогда цикл пройдёт по всем n элементам.

А Big O считается по худшему случаю


🐍Вопросы с собесов -> ProstoPython
👍4
🔹 Любые позиционные аргументы (*args).
Они сохраняются в exception.args (tuple).

e = Exception("error", 400)
print(e.args) # ('error', 400)


🔹 Обычно передают строку сообщения.

🔹 В кастомных исключениях можно определить свои параметры через __init__.

Итог: можно передать любые данные, по умолчанию они попадут в .args.
👍4
⏱️ Big O Breakdown — выпуск 5

Смотри внимательно 👀
def example(nums):
n = len(nums)
i = 0

while i < n:
j = 0
while j < n:
print(i, j)
j += 1
i += n


Какая сложность?

A) O(n)
B) O(n log n)
C) O(n²)
D) O(1)

Правильный ответ: A) O(n)

🧠 Почему так:

🔷Внешний цикл увеличивает i на n

🔷Значит он выполняется всего один раз

🔷Внутренний цикл проходит n раз

Итого: n операций —> O(n)

🐍Вопросы с собесов -> ProstoPython
🔥41
Docker Volume

🔹 Volume — механизм хранения данных вне контейнера.

🔹 Зачем нужен

🔹 Данные сохраняются при удалении контейнера
🔹 Можно шарить данные между контейнерами
🔹 Подходит для БД, логов, загрузок

🐍Вопросы с собесов -> ProstoPython
👍2
Десериализация — процесс преобразования данных из внешнего формата (JSON, XML, bytes) в объекты программы.

🔹 Где используется

🔹 HTTP-запросы (body —> объект)
🔹 Работа с файлами
🔹 Очереди сообщений
🔹 Кэш

🐍Вопросы с собесов -> ProstoPython
👍2
💬 Вопрос на собесе:
Что произойдёт, если изменить список во время итерирования по нему?


👶 Junior:
— Ну… наверное просто добавится элемент?

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

🧙‍♂️ Senior:
— Важно понимать механизм.

Python итерируется по индексам.
Если ты удаляешь элементы, индексы сдвигаются.
Цикл продолжает увеличивать индекс, и часть элементов может быть пропущена.

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

🔹 DML-операция
🔹 Удаляет строки с возможностью WHERE
🔹 Логирует удаление каждой строки
🔹 Можно откатить (в транзакции)
🔹 Триггеры срабатывают

TRUNCATE

🔹 DDL-операция
🔹 Удаляет все строки (без WHERE)
🔹 Быстро — очищает страницы таблицы
🔹 Обычно сбрасывает автоинкремент
🔹 В большинстве СУБД можно откатить (например, в PostgreSQL)
🔹 Триггеры не срабатывают (кроме специальных)

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

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

🧠 Почему так:

🔷 lst=[] создаётся один раз при объявлении функции

🔷 += для списка изменяет объект на месте

🔷 Первый вызов —> [1]

🔷 Второй вызов использует тот же список —> [1, 2]

🐍Вопросы с собесов -> ProstoPython
🔥42
⏱️ Big O Breakdown — выпуск 5

Смотри на код 👀
def has_duplicates(nums):
for num in nums:
if num in nums:
return True
return False


Какая сложность?

A) O(n)
B) O(n log n)
C) O(n²)
D) O(1)

Правильный ответ: C) O(n²)

🧠 Почему так:

🔷Внешний цикл проходит n раз

🔷Оператор in для списка работает за O(n)

🔷Внутри каждого прохода выполняется линейный поиск

Итого: n * n = n²

Даже если функция вернёт результат рано,
в худшем случае это всё равно O(n²).


🐍Вопросы с собесов -> ProstoPython
👍4👎1🌚1
🔹 Через super()
class Base:
def greet(self):
print("Hello")

class Child(Base):
def greet(self):
super().greet()
print("World")


🔹 super() возвращает прокси к родительскому классу
🔹 Корректно работает при множественном наследовании

🐍Вопросы с собесов -> ProstoPython
🔥4
💬 Вопрос на собесе:
В чём разница между shallow copy и deep copy?


👶 Junior:
— Ну… shallow это обычная копия, а deep типа полная? 🤔

🧑‍💻 Middle:
Shallow copy копирует только внешний объект.
Вложенные объекты остаются теми же самыми в памяти.

Deep copy копирует всё рекурсивно, включая вложенные структуры.

🧙‍♂️ Senior:
— Главное в ссылках и памяти.

🔹 Shallow copy создаёт новый контейнер, но элементы внутри него — те же объекты.

🔹 Если внутри есть изменяемые структуры, их изменение затронет обе копии.

🔹 Deep copy создаёт полностью независимую структуру.

Пример:
import copy

a = [[1, 2], [3, 4]]
b = copy.copy(a)
c = copy.deepcopy(a)

a[0].append(99)

print(b) # изменится
print(c) # останется прежним


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