Домклик · май 2025

Тех собес на middle-senior Python Разработчик в Домклик

middle-senior Тех собес 52 вопроса 4 задачи
1

Теория

1. Какие базовые типы данных есть в Python? Как они делятся на категории?

2. Является ли строка изменяемым типом? Что происходит при попытке изменить строку?

3. Чем отличаются кортежи от списков в Python?

4. Какие плюсы и минусы у кортежей и списков?

5. Знаешь ли ты что-нибудь о повторном использовании памяти кортежами?

6. Какая алгоритмическая сложность получения длины списка?

7. Какие атрибуты есть у списков, кроме длины?

8. В чём сложность доступа к элементу списка по индексу и почему?

9. Какова сложность добавления элемента в конец списка? А в начало?

10. Что такое множество (set) в Python и как оно устроено?

11. Сохраняет ли set порядок элементов?

12. Расскажи, как устроен словарь (dict) и как он работает под капотом.

13. Что такое хеш-функция и как работает механизм коллизий?

14. Что используется для разрешения коллизий в Python?

15. Какими могут быть ключи в словаре? Что значит "объект должен быть хешируемым"?

16. Какая структура данных используется под капотом словаря в Python?

17. Какой метод используется для линейной адресации при коллизиях?

18. Расскажи о сложности операций поиска, вставки и удаления в dict.

19. Напиши функцию, которая возвращает список студентов, сдавших курс, учитывая проходной процент.

20. Напиши функцию, которая проверяет, образуют ли два списка последовательность без пропусков.

21. Что такое MRO (Method Resolution Order) и как он работает?

22. Чем отличается старый порядок разрешения методов от нового (алгоритм C3)?

23. Что такое интерфейс и абстрактный класс? В чём разница?

24. Знаешь ли ты паттерны проектирования? Например, Singleton, Factory, Decorator.

25. Расскажи, что такое декоратор в Python и для чего он может быть полезен.

26. Что такое итератор и итерируемый объект в Python?

27. В чём связь между итераторами и паттернами проектирования?

28. Что такое генераторы и как они связаны с итераторами?

29. В чём плюсы использования генераторов?

30. Что такое контекстный менеджер в Python? Как он работает?

31. Что делает метод exit в контекстном менеджере?

32. Какие способы параллельного выполнения кода есть в Python?

33. Чем потоки отличаются от процессов?

34. В каких случаях стоит использовать потоки, а в каких — процессы?

35. Что такое GIL и как он влияет на многопоточность?

36. Что произойдёт, если в Python два потока выполняют CPU-bound задачи?

37. Как потоки ведут себя при I/O-bound задачах?

38. Какие есть способы параллелить код на уровне асинхронности? Что такое asyncio, coroutine, event loop?

39. Что такое Task, Future, и как они взаимодействуют с корутинами?

40. Как работает event loop и как в него возвращается поток управления?

41. Каким образом корутина приостанавливается и возобновляется?

42. Как можно выполнить две асинхронные функции параллельно и сократить время выполнения?

43. Что такое Pytest и что такое фикстуры?

44. Что такое мок и зачем он нужен в тестировании?

45. Какие есть типы индексов в PostgreSQL и зачем они нужны?

46. Что такое B-дерево и чем оно хорошо?

47. В чём отличие хеш-индексов от B-tree?

48. Что такое foreign key и зачем он нужен?

49. Какие есть типы JOIN в SQL?

50. Что такое GROUP BY, HAVING, и чем они отличаются от WHERE?

51. Что такое нормализация и нормальные формы в базах данных?

52. Влияют ли нормальные формы на бизнес? Где граница между технической необходимостью и избыточностью?

2

Лайвкодинг

53. Задача: Написать функцию, которая возвращает список студентов, сдавших курс, учитывая проходной процент.

student_results = {
    "John": ["5/5", "50/50", "10/10", "10/10"],
    "Sarah": ["4/8", "50/57", "7/10", "10/18"],
    "Adam": ["8/10", "22/25", "3/5", "5/5"],
    "Barry": ["3/3", "20/20"]
}

54. Задача: Написать функцию, которая возвращает True, если два списка при объединении образуют последовательность без пробелов.

# consecutive_combo([7, 4, 5, 1], [2, 3, 6]) → True
# consecutive_combo([1, 4, 6, 5], [2, 7, 8, 9]) → False
# consecutive_combo([1, 4, 5, 6], [2, 3, 7, 8, 10]) → False
# consecutive_combo([44, 46], [45]) → True

55. Задача: Оценить время выполнения функции.

async def get_data():
    await get_users()   # execution ~ 0.5 seconds
    await get_orders()  # execution ~ 1.0 seconds

56. Задача: Написать SQL-запросы для таблицы "Продукты".

-- Таблица "Продукты"
-- id (int), name (varchar), company (varchar), product_count (int), price (int), is_discounted (int)

-- 1. Сгруппировать продукты по производителям, у которых цена выше 30000 рублей.
-- 2. Сгруппировать по производителям и найти группы, где более 1 модели и общая стоимость товаров выше 80000 рублей.