Спасательный круг для собеседования на Python-разработчика

Шпаргалка в форме вопрос-ответ с примерами и ссылками на источники в помощь для собеседования на Python. Составлена по реальным интервью.

Спасательный круг для собеседования на Python-разработчика

Всё ли вы знаете для собеседования на Python? Ниже мы собрали популярные вопросы для разработчика Python и ответы на них. Там, где кратким пояснением не обойтись, приведены ссылки на подходящие источники. Естественно, никакой список не обозначит все возможные вопросы собеседования. Зато вы сможете отыскать лакуны в знаниях и вовремя их исправить.

Типы данных и конструкции, которые нужно знать для собеседования на Python

Какие вам знакомы структуры данных Python? Перечислите, какие из них mutable/immutable.

Кроме базовых структур данных (mutable: list, dict, set и immutable – tuple) полезно разбираться в модуле collections с удобными дополнительными структурами, такими как Counter.

Что делает функция id()?

Возвращает идентификатор переданного объекта, уникальный на время его существования.

Как удалить повторяющиеся элементы списка, сохранив порядок следования остальных?

lst = ["a", "b", "a", "c", "c"]
lst = list(dict.fromkeys(lst))

Как получить список всех атрибутов объекта?

В простейшем виде с помощью функции dir(). Об особых случаях читайте здесь.

Как получить конкатенацию кортежей, выкинув неуникальные элементы?

Через множества:

tuple(set((1, 2)) ^ set((2, 3)))

Почему при изменении списка в цикле используется конструкция вида for x in x in lst[:]?

Здесь применяется оператор среза [:], то есть создается копия. Поэтому изменения в цикле не влияют на оригинальный список.

Где будет быстрее поиск и почему: dict, list, set, tuple?

Средняя временная сложность поиска в множествах и словарях соответствует O(1), в случае последовательностей O(n). Кортежи – это неизменяемый тип, поэтому они могут давать выигрыш в скорости перед списками.

Есть два списка одинаковой длины. В одном – ключи, в другом – значения. Как составить словарь?

dict(zip(['key1', 'key2'], ['value1', 'value2']))

Как инвертировать словарь, то есть поменять местами пары ключ-значения?

Базовыми средствами без привлечения библиотеки itertools так:

d = {'a': 1, 'b': 2}
dict(zip(d.values(), d.keys()))

Итераторы и анонимные функции

В чем отличие (i for i in arr) от [i for i in arr]?

Слева – выражение-генератор, справа – генератор списка (list comprehension). Генератор списка целиком создает список в памяти, а выражение-генератор – по мере необходимости.

В чем отличие итераторов и генераторов?

Итератор является более общей концепцией, чем генератор, и представляет собой любой объект, класс которого имеет методы __next__ и __iter__. Генератор – это итератор, который обычно создается путем вызова функции, содержащей не менее одного оператора yield. Это ключевое слово действует аналогично return, но возвращает объект-генератор.

Что такое анонимные функции? Где они могут быть полезны?

В Python анонимные функции создаются при помощи лямбда-выражений. Такие выражения удобно использовать в местах, где ожидается функция с достаточно ограниченной задачей.

Классы и декораторы

Если для собеседования на Python вам необходимо освежить знания в ООП, загляните в статью ООП на Python.

Что такое магические методы?

Так называют специальные методы, обрамленные двумя подчеркиваниями. Магические методы представляют простой способ заставить объекты вести себя аналогично встроенным типам. Это, в частности, позволяет стандартизировать поведение базовых операторов с экземплярами класса.

Чем new отличается от init?

Метод __new__ используется, когда нужно управлять процессом создания нового экземпляра, а __init__ – когда контролируется его инициализация. Поэтому new возвращает новый экземпляр класса, а init – ничего.

Какая разница между одинарным (_) и двойным (__) подчеркиванием перед именем объекта?

Одинарным подчеркиванием задаются частные переменные, функции, методы и классы. Все эти объекты будут проигнорированы при импорте с помощью

from module import *

Двойное подчеркивание применяется для искажения имен атрибутов в классе (вызвать такой метод стандартным образом не получится). О других случаях.

Как в Python воплощены public, private, protected методы?

Этот вопрос напрямую связан с предыдущим. Все компоненты класса Python по умолчанию являются открытыми (public). Для защищенных (protected) методов по соглашению Python добавляется префикс одиночного подчеркивания, для закрытых (private) методов – префикс двойного подчеркивания. Примеры и пояснения.

Что такое MRO?

MRO – сокращение от method resolution order. То есть это способ разрешения проблемы множественного наследования классов. Для конструирования линеаризации класса в версиях Python с новым стилем классов используется алгоритм C3 линеаризации.

Для чего в Python используются слоты?

Магический атрибут __slots__ позволяет задать ограниченный набор атрибутов, которыми будет обладать экземпляр класса. За счет такого ограничения можно повысить скорость работы при доступе к атрибутам и сэкономить место в памяти.

Что такое контекстные менеджеры? Где они применяются? Как создать свой контекстный менеджер?

Контекстные менеджеры – это конструкции, которые упрощают работу с тем или иным интерфейсом. Например, работу с файлами или базами данных. Создаются они с помощью оператора with. Для создания собственного класса контекстного менеджера используется библиотека contextlib.

Декораторы, дескрипторы и метаклассы

Что такое декораторы с параметрами?

В качестве декоратора можно использовать выражение, значение которого – функция, принимающая и возвращающая функцию. А значит, можно создавать декораторы с параметрами (фабрики декораторов). Подробно с примерами.

Чем отличаются и как используются декораторы @classmethod и @staticmethod?

Базовые декораторы classmethod, staticmethod используются для методов, определённых внутри классов. В метод класса первым аргументом передаётся класс. Аналогично метод экземпляра в первом аргументе получает сам экземпляр. Статичный метод используется в том случае, когда метод не имеет доступа к тому, что представляет собой класс или объект класса.

Что такое дескриптор?

Дескриптор – атрибут объекта, чьё поведение при доступе переопределяется методами __get__, __set__ и __delete__. Если определен хотя бы один из этих методов, объект становится дескриптором.

Что такое метаклассы в Python?

В Python классы являются объектами, поэтому они сами должны чем-то генерироваться. Эти конструкции представляют собой своеобразные «классы классов» и называются метаклассами. Примером встроенного метакласса является type. В основном метаклассы используются для создания API. Подробнее читайте в нашей публикации.

Тестирование, отладка и стиль кода

Как вы тестируете код? Что такое mock?

Для модульного тестирования используется unittest. Если вы пока не тестировали код на Python, у нас есть гайд. Mock – это специальный модуль (ставший недавно частью стандартной библиотеки) для тестирования без существенной адаптации кода под тесты.

Как проводится отладка программ на Python?

В Python есть модуль pdb. Он позволяет пошагово провести отладку программы. В версии 3.7 появилась функция breakpoint(), которая также облегчает дебаггинг.

Что такое PEP8?

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

Какие есть программы для проверки стиля кода? Каковы их преимущества и недостатки?

Скажем, pylint, pyflakes. Наиболее популярные инструменты мы уже описали и сравнили.

Производительность и проектирование

В чём состоит отличие процессов от потоков?

Модули – это subprocess и threading. Использование нескольких процессов аналогично использованию нескольких независимых программ, обмен данными организован через каналы. Если приложение должно выполнять несколько задач в одно и то же время, используются потоки (threads). В этом случае для ограничения доступа потоков к памяти в Python имеется блокировщик GIL.

Что такое AsyncIO? Когда его имеет смысл использовать?

В отличие от потоков, в AsyncIO переключение между сопрограммами происходит лишь тогда, когда сопрограмма ожидает завершения внешней операции. AsyncIO подойдет, если приложение большую часть времени тратит на чтение/запись данных, а не их обработку, то есть, например, для работы с веб-сокетами.

В чем заключается проблема циклических зависимостей? Как ее решить?

Циклические зависимости обычно служат признаком некачественного проектирования системы. Временное решение – перенести импорт во вложенные области видимости. В частности, определения функций.

Как реализовать шаблон Singleton на Python? Какие есть альтернативы?

Стандартный пример описан в примерах PEP-0318. Менее удобна для тестирования реализация через декоратор, элегантнее вариант через метаклассы.

Какие шаблоны проектирования вы еще знаете? Какими пользовались?

Фабричный метод, абстрактная фабрика, прототип, компоновщик, итератор.

Какие вопросы с вашего собеседования на Python-разработчика вы здесь не нашли?

Комментарии

ВАКАНСИИ

Добавить вакансию
Разработчик C++
Москва, по итогам собеседования

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ