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

🔹 пока одна задача ждёт I/O (сеть, БД, файлы), выполняются другие
🔹 процессор не простаивает
🔹 можно обслуживать много задач одним потоком

Итог: ресурсы используются эффективнее, особенно в I/O-нагруженных приложениях.

🐍Вопросы с собесов -> ProstoPython
🔥4
Rookie Mistakes 2— ловушка or при значениях по умолчанию

Очень популярная ошибка у новичков.

Плохо:
def get_limit(limit):
return limit or 10

print(get_limit(0))


Ожидаешь 0, а получаешь 10 😬

Хорошо:
def get_limit(limit):
if limit is None:
return 10
return limit


🧠 Почему так происходит:

or возвращает первое truthy значение

0, '', [] — это False

Python думает, что значения «нет», хотя оно есть

🐍Вопросы с собесов -> ProstoPython
🔥4
🧰 Code Cleanup — выпуск 22
Тема: не усложняй if, когда можно проще


Иногда условия пишут слишком подробно, хотя Python умеет короче.

Плохо:
if is_active == True:
send_email()


Работает, но сравнение с True здесь лишнее.

Code Cleanup:
if is_active:
send_email()


🧠 Почему так лучше:
🔹 код короче и чище
🔹 сразу читается логика
🔹 меньше лишних сравнений

🐍Вопросы с собесов -> ProstoPython
🔥4
Rookie Mistakes #3 — забыли return

Код выглядит нормально.
Но функция делает не то, что ожидаешь 😬


Плохо:

def calc_discount(price):
price * 0.9

result = calc_discount(100)
print(result)


Ожидаешь 90, а получаешь None.

Хорошо:
def calc_discount(price):
return price * 0.9


🧠 Почему так происходит:

🔹Если в функции нет return — Python возвращает None

🔹Выражение само по себе ничего не возвращает

🔹Ошибка не всегда заметна сразу

🐍Вопросы с собесов -> ProstoPython
👍4
Git rebase нужен для переноса коммитов одной ветки поверх другой.

🔹 делает историю линейной и более чистой
🔹 убирает лишние merge-коммиты
🔹 позволяет «переиграть» изменения поверх актуальной версии ветки

Используется для упорядочивания истории перед слиянием.

🐍Вопросы с собесов -> ProstoPython
🔥4
Rookie Mistakes #9 — путаница между sort() и sorted()

Плохо:
numbers = [3, 1, 2]
sorted_numbers = numbers.sort()

print(sorted_numbers)


Ожидаешь [1, 2, 3],
а получаешь None.


Хорошо:
numbers = [3, 1, 2]
sorted_numbers = sorted(numbers)

print(sorted_numbers)


🧠 Почему так происходит:


🔹list.sort() сортирует список на месте и возвращает None

🔹sorted() создаёт новый отсортированный список

🔹Многие путают их из-за похожих названий

🐍Вопросы с собесов -> ProstoPython
👍3
GET
🔹 запрашивает данные
🔹 возвращает тело ответа
🔹 используется для получения ресурсов

POST
🔹 отправляет данные на сервер
🔹 создаёт или изменяет ресурс
🔹 передаёт данные в теле запроса

HEAD
🔹 работает как GET, но
🔹 возвращает только заголовки без тела ответа

🐍Вопросы с собесов -> ProstoPython
🔥4
🧰 Code Cleanup — выпуск 23
Тема: не проверяй ключ через in, если сразу берёшь значение


Плохо:

if "name" in user:
value = user["name"]
else:
value = "Unknown"


Работает.
Но код раздут и делает лишнюю проверку.


Code Cleanup:


value = user.get("name", "Unknown")


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

🔹 короче и чище
🔹 нет двойного обращения к словарю
🔹 меньше ветвлений

🐍Вопросы с собесов -> ProstoPython
🔥41
Новая рубрика - ⏱️ Big O Breakdown

Краткое описание рубрики

Разбираем фрагмент кода и определяем его временную сложность.
Учимся быстро считать O-нотацию без паники и лишней теории.
Именно такие вопросы любят задавать на собеседованиях по Python.

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

Смотри на код и попробуй определить сложность 👇
def count_pairs(nums):
count = 0
for i in range(len(nums)):
for j in range(len(nums)):
count += 1
return count


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


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

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

🧠 Почему так:

Первый цикл проходит n раз

Внутри него второй цикл тоже n раз

n * n = n²

Каждый элемент перебирается для каждого элемента.


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

🐍Вопросы с собесов -> ProstoPython
Правильный ответ: B (1,2,3,4) (1,2,3)

🧠 Почему так:

🔷Кортежи неизменяемые

🔷a += (4,) создаёт новый кортеж

🔷Переменная a начинает ссылаться на новый объект

🔷b всё ещё указывает на старый (1, 2, 3)

🐍Вопросы с собесов -> ProstoPython
👍6
🔹 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