В этой статье мы рассмотрим вопросы, которые задают на собеседовании Python-разработчикам. Мы сосредоточимся на вопросах для специалистов уровня Middle и Senior. Вопросы для собеседования на позицию Junior-разработчика мы рассматривали ранее.
Вопросы для собеседования на позицию Middle Python Developer
1. Как улучшить производительность программы на Python?
Вообще, есть множество вещей, способных улучшить код на Python. Вот, к примеру, некоторые из них:
- Структура данных. Нужно выбрать правильную структуру данных, подходящую для нашей цели в программе.
- Стандартная библиотека. Везде, где это возможно, следует использовать методы стандартных библиотек. Эти методы имеют гораздо лучшую производительность, чем пользовательские реализации.
- Абстракция. Иногда абстрагирование и косвенное обращение могут привести к снижению производительности программы. Поэтому следует удалить избыточное абстрагирование в исходном коде.
- Алгоритм. Использование правильного алгоритма может иметь большое значение. Поэтому для решения задач, требующих высокой производительности, крайне важно подобрать наиболее подходящий алгоритм.
2. Что такое pickling в Python?
Pickling – это процесс, с помощью которого иерархия объектов Python может быть преобразована в поток байтов. Обратной операцией является unpickling.
В Python есть модуль с соответствующим именем — pickle. В этом модуле реализован мощный алгоритм сериализации и десериализации структур объектов Python.
Pickling также иногда называют сериализацией или сортировкой. С помощью сериализации мы можем передавать объекты Python по сети. Она также используется для сохранения состояния объекта в Python. Мы можем записать его в файл или в базу данных.
3. Как работает управление памятью в Python?
В Python есть специальное пространство, которое называется «heap space». Оно содержит все объекты и структуры данных в Python. В CPython, например, есть диспетчер памяти, отвечающий за управление этим пространством.
В диспетчере памяти Python есть различные компоненты, обрабатывающие сегментацию, совместное использование, кэширование, предварительное выделение памяти и т.д. Диспетчер памяти также заботится о сборке мусора, используя алгоритм подсчета ссылок.
4. Как передаются аргументы в методе Python? Как значение или как ссылка?
Каждый аргумент в методе Python – это объект. Все переменные в Python имеют ссылку на объект. Поэтому аргументы в методе Python передаются по ссылке.
Поскольку некоторые из объектов, переданных как ссылка, являются изменяемыми, мы можем изменить эти объекты внутри метода. Однако для неизменяемого объекта, такого как string, любое изменение, сделанное внутри метода, не отразится снаружи.
[python_ad_block]5. Как осуществляется модульное тестирование кода Python?
unittest – это среда модульного тестирования в Python. Модульное тестирование означает тестирование разных компонентов программы по отдельности.
В чем важность модульного тестирования?
Представьте себе сценарий: вы создаете программное обеспечение, которое использует три компонента — A, B и C. Теперь предположим, что в какой-то момент ваше ПО ломается. Как узнать, какой компонент нарушил работу программы?
Возможно, отказал компонент A, что, в свою очередь, вызвало неисправность компонента B, и в итоге это вызвало поломку всей программы. А может быть, проблема была в компоненте С. И так далее. Таких комбинаций может быть много. Вот почему необходимо правильно протестировать каждый компонент: это поможет узнать, что может послужить причиной сбоя программы.
6. Какая польза от генераторов в Python?
Генератор можно использовать для создания итераторов. Генератор пишется как обычная функция, но он может использовать оператор yield для возврата данных во время вызова функции. Таким образом мы можем написать сложную логику, работающую как итератор.
Генератор более компактен, чем итератор, потому что в нем автоматически создаются функции __iter__()
и __next__()
. Также внутри генератора локальные переменные и состояние выполнения сохраняются между несколькими вызовами. Следовательно, нет необходимости добавлять дополнительные переменные, такие как self.index
и т.д., для отслеживания итераций.
Генератор также улучшает читаемость кода. По сути, это очень простая реализация итератора.
7. Каково значение функций, которые начинаются и заканчиваются символом _ в Python?
Python предоставляет множество встроенных функций, которые окружены символами подчеркивания _
в начале и в конце имени функции. Двойной символ нижнего подчеркивания используется для зарезервированных имен функций. Они также известны как системные имена.
8. В чем разница между xrange и range в Python?
В Python мы используем range(0,10)
для создания в памяти списка из 10 чисел. Но в Python есть еще одна похожая функция — xrange()
. Вместо списка объектов она возвращает последовательность объектов.
В xrange()
все значения не сохраняются в памяти одновременно. Это функция, основанная на отложенной загрузке. Преимущество xrange()
над range()
в обычных сценариях минимально.
Важно отметить, что начиная с версии 3.1 xrange()
устарела, так что скорее всего вам она не пригодится. Но если вдруг вас спросят об этой функции, вас это уже не застанет врасплох.
9. Что такое Flask?
Flask – это фреймворк Python для разработки веб-приложений. Это очень простой фреймворк, имеющий множество расширений для создания приложений корпоративного уровня. По умолчанию Flask не предоставляет уровень абстракции данных или проверку формы. Для выполнения таких задач поверх него можно использовать внешние библиотеки.
10. Какая польза от функции zip() в Python?
Встроенная функция zip()
может использоваться для агрегирования всех итерируемых объектов итератора. Также ее можно использовать для агрегирования итерируемых объектов из двух итераторов. Используя функцию zip()
, входные данные из разных источников можно разделить на фиксированное количество наборов.
11. Как мы можем получить данные из базы данных MySQL?
Для работы с базой данных MySQL импортируется модуль MySQLdb. Кроме того, важно помнить, что конкретная база данных должна быть подключена путем передачи URL-адреса, имени пользователя, пароля и имени базы данных. После установления соединения можно открыть курсор при помощи cursor()
. Затем, при помощи функции fetch()
, мы выполняем запросы и извлекаем данные из таблиц.
12. В чем разница между split() и срезом в Python?
Функция split()
позволяет делить строки на подстроки. По умолчанию строка делится на части по пробелам, но разделитель можно указать явно. Тогда можно будет разделить строку, скажем, по запятым.
Срезы же являются строковой операцией для извлечения части строки или некоторой части списка.
13. Как отладить кусок кода на Python?
В Python для дебага кода можно использовать отладчик pdb
. Чтобы начать отладку, необходимо ввести следующие строки в верхней части кода Python.
import pdb pdb.set_trace()
После добавления этих строк код запускается в режиме отладки.
Вопросы для собеседования на позицию Senior Python Developer
14. Как указать кодировку кода в исходном файле Python?
По умолчанию исходный код на Python имеет кодировку UTF-8. Но мы также можем указать нашу собственную кодировку. Это можно сделать, добавив в исходном файле, после #!
, следующую строку:
# -*- coding: encoding -*-
В этой строке нужно заменить encoding на кодировку, которую мы хотим использовать (например, ascii, latin-1 и т.д.).
15. Как выполняется статический анализ скрипта на Python?
Для этой цели можно использовать PyChecker. Этот инструмент статического анализа способен находить ошибки в коде Python. Кроме того, он также выдает предупреждения о любых проблемах со стилем. Есть и другие инструменты для поиска ошибок, например, pylint и pyflakes.
16. Что такое декоратор Python?
Декоратор Python – это механизм для обертывания функции Python и изменения ее поведения путем добавления к ней дополнительных функций. Для вызова функции декоратора в Python используется символ @
.
17. Что такое пространство имен в Python?
Пространство имен в Python – это сопоставление имени и объекта. В настоящее время оно реализуется в виде словарей.
Например, набор имен встроенных исключений, набор встроенных имен, локальные имена внутри функции.
В разные моменты в Python создаются разные пространства имен.
Более того, каждое пространство имен в Python может иметь разное время жизни. Для списка встроенных имен пространство имен создается при запуске интерпретатора Python. Когда интерпретатор Python читает определение модуля, он создает глобальное пространство имен для этого модуля. Когда интерпретатор Python вызывает функцию, он создает локальное пространство имен для этой функции.
18. В чем разница между docstring в Python и javadoc в Java?
docstring
в Python – это строка, используемая для добавления комментариев или резюмирования фрагмента кода в Python.
Основное различие между javadoc
и docstring
заключается в том, что docstring
также доступна во время выполнения. А вот javadoc
удаляется из байт-кода и отсутствует в файле .class
. Мы даже можем использовать docstring-комментарии в во время выполнения в качестве интерактивного справочного руководства.
В Python docstring нужно указывать в качестве первой инструкции объекта кода, сразу после оператора def
или dass
. Строку документации для объекта кода можно получить из атрибута __doc__
этого объекта.
19. Какие существуют методы копирования объекта в Python?
Есть два способа скопировать объекты в Python:
- Поверхностное копирование: функция
copy.copy()
. Поверхностное копирование создает отдельный новый объект или список, но вместо копирования дочерних элементов в новый объект, оно просто копирует ссылки на их адреса памяти. Следовательно, если вы сделаете изменение в исходном объекте, оно будет отражено в скопированном объекте, и наоборот. - Глубокое копирование: функция
copy.deepcopy()
. Глубокая копия создает новую и отдельную копию всего объекта или списка со своим уникальным адресом памяти. Это означает, что любые изменения, внесенные вами в новую копию объекта или списка, не будут отражаться в исходной. Этот процесс происходит следующим образом: сначала создается новый список или объект, а затем рекурсивно копируются все элементы из исходного в новый.
От редакции Pythonist. Подробнее тема копирования рассмотрена в статьях «Глубокое и поверхностное копирование» и «Копирование объектов в Python».
20. Что такое метакласс в Python?
Метакласс – это своего рода класс класса. То есть класс определяет, как ведет себя экземпляр класса (то есть объект), в то время как метакласс определяет, как ведет себя класс. Следовательно, класс – это экземпляр метакласса.
Один из наиболее распространенных метаклассов в Python – это Type
(тип). Метакласс чаще всего используется как фабрика классов.
21. Зачем нужен frozenset в Python?
Frozenset
– это множество уникальных значений. Это неизменяемая коллекция различных хешируемых объектов. То есть после того, как значения установлены, их нельзя изменить. Таким образом, frozenset
является неизменяемым и, следовательно, хешируемым, и может использоваться как ключ словаря или как элемент другого множества. Стоит также помнить, что методы множества не работают с frozenset
– он не может быть обновлен.
22. Как проверить, является ли класс подклассом другого класса?
Python предоставляет полезный метод issubclass(a, b)
, с помощью которого можно проверить, является ли класс a
подклассом b
.
Например, давайте узнаем, является ли int
подклассом long
issubclass(int,long) # False
А теперь проверим, является ли bool
подклассом int
issubclass(bool,int) # True
23. В чем разница между is и == в Python?
is
используется для проверки объекта на его идентичность, в то время как ==
используется для проверки равенства двух объектов.
lst=[10,20,20] lst==lst[:] # True lst is lst[:] # False
От редакции Pythonist. Подробнее о разнице этих двух операторов можно почитать в статье «Чем == отличается от is?».
Последний совет по прохождению собеседования
Обновив свои знания с помощью приведенных выше вопросов для собеседования по программированию на Python, вы непременно добьетесь успеха! Однако имейте в виду, что ваш опыт – это только часть собеседования, будьте самим собой, сохраняйте спокойствие и расслабленность и будьте уверены – всё будет потрясающе! Вы все знаете ?
Перевод второй части статьи «Python interview questions and answers to know before interviewing».