AI
prepair.app
Пройти інтерв'ю →
EnglishРусскийУкраїнська
🐍

Senior Python Backendпитання на співбесіді Python розробника

Senior · 5+ років досвіду

Співбесіда Python-розробника охоплює внутрішню будову мови, асинхронність, Django або FastAPI і роботу з базою. Нижче — найчастіші питання з еталонними відповідями. Senior: архітектуру, трейд-офи, менторство та прийняття рішень.

Теми для підготовки

Типи даних і структури
Декоратори та генератори
GIL і конкурентність
asyncio та async/await
Django / FastAPI
ORM і оптимізація SQL

9 питань рівня Senior з відповідями

1

Поясніть різницю між генератором і звичайною функцією. Навіщо потрібен yield?

Відповідь

Звичайна функція обчислює все і повертає один раз; генератор призупиняється на кожному yield і відновлюється з того ж місця, віддаючи значення ліниво. Це означає сталу витрату памʼяті незалежно від кількості елементів, тому можна ітеруватися по файлу в гігабайти або по нескінченній послідовності. Саме yield перетворює функцію на скінченний автомат, який інтерпретатор уміє ставити на паузу.

2

Що таке *args і **kwargs? Наведіть приклад використання.

Відповідь

*args збирає зайві позиційні аргументи в кортеж, **kwargs збирає зайві іменовані у словник. Їх застосовують, коли функція має приймати довільну сигнатуру — найчастіше в декораторах і обгортках, що прокидають усе далі. Дзеркальне застосування — розпакування: виклик f(*items, **options) розгортає послідовність і словник в аргументи.

3

У чому різниця між multiprocessing, threading і asyncio?

Відповідь

Threading дає конкурентність усередині одного процесу і допомагає лише на I/O через GIL. Multiprocessing піднімає окремі інтерпретатори зі справжнім паралелізмом ціною запуску процесів і міжпроцесного обміну — це правильний вибір для CPU-навантаження. asyncio це однопотокова кооперативна конкурентність: задачі поступаються керуванням у точках await, що масштабується на десятки тисяч сокетів, але блокує все, якщо всередині корутини викликати синхронний код.

4

Що таке контекстний менеджер? Як реалізувати свій?

Відповідь

Контекстний менеджер гарантує підготовку та завершення навколо блоку — саме це використовує with, щоб закрити файл або відпустити блокування навіть при винятку. Реалізувати можна класом з __enter__ і __exit__ або генератором під декоратором @contextlib.contextmanager, який робить один yield між кодом підготовки та очищення. Метод __exit__ отримує інформацію про виняток і може придушити його, повернувши True.

5

Поясніть MRO і множинне успадкування.

Відповідь

Method Resolution Order задає порядок, у якому Python шукає атрибут по класах, і обчислюється алгоритмом лінеаризації C3. Він гарантує, що клас завжди йде раніше своїх батьків і що порядок базових класів дотримується, завдяки чому ромбоподібне успадкування поводиться передбачувано. super() йде по MRO, а не стрибає одразу до батька, тому кооперативне множинне успадкування вимагає, щоб кожен клас у ланцюжку викликав super().

6

Що таке N+1 у Django ORM? Як допомагають select_related і prefetch_related?

Відповідь

N+1 виникає, коли queryset повертає N обʼєктів, і кожне звернення до повʼязаного поля породжує окремий запит. select_related вирішує це для ForeignKey і OneToOne, роблячи SQL JOIN і заповнюючи повʼязаний обʼєкт тим самим запитом. prefetch_related працює з ManyToMany і зворотними звʼязками: виконує другий запит і зʼєднує результати вже в Python, тому запитів виходить два, а не один.

7

У чому різниця між shallow copy і deep copy?

Відповідь

Поверхнева копія створює новий зовнішній контейнер, але зберігає посилання на ті самі вкладені обʼєкти, тому зміна вкладеного списку видно через обидві копії. Глибока копія рекурсивно дублює все і дає повну незалежність ціною часу й памʼяті. На практиці з цього народжується баг зі змінюваним значенням за замовчуванням або спільним вкладеним конфігом, який один викликач змінює для всіх.

8

У чому різниця між __str__ і __repr__?

Відповідь

__repr__ адресований розробнику і в ідеалі має бути однозначним — часто це вираз, яким обʼєкт можна було б відтворити; саме його показують REPL і відлагоджувачі. __str__ адресований кінцевому користувачу, його викликають print() і str(), а за відсутності він падає назад на __repr__. Звичка реалізовувати __repr__ цінніша, бо вона робить читабельними логи й трейсбеки.

9

Як Python керує памʼяттю і що таке підрахунок посилань?

Відповідь

CPython звільняє обʼєкт одразу, щойно лічильник посилань падає до нуля, тому звільнення негайне й передбачуване. Оскільки одним підрахунком посилань не можна прибрати циклічні посилання, періодично запускається поколіннєвий циклічний збирач, який їх знаходить і збирає. Практичні наслідки: явно закривати ресурси все одно потрібно, а типова причина витоку памʼяті — посилання, що застрягло в кеші або замиканні.

🦎

Прочитати відповіді недостатньо

На співбесіді ти говориш вголос під тиском. Кем поставить ті самі питання, оцінить кожну відповідь і покаже, що саме підтягнути.

Пройти інтерв'ю Senior Python Backend →
Безкоштовно · 3 інтерв'ю на місяць

Інші рівні — Python Backend

Junior Python BackendMiddle Python BackendУсі питання Python Backend

Інші спеціалізації

🔍Senior QA Manual🤖Senior QA AutomationSenior Java Backend🐘Senior PHP Backend🦫Senior Go Backend🟢Senior Node.js Backend⚛️Senior React Frontend💚Senior Vue Frontend🅰️Senior Angular FrontendSenior Next.js