Как проходить собеседование для python разработчика
Перейти к содержимому

Как проходить собеседование для python разработчика

  • автор:

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

Безусловно, от программирования нужно получать свой кайф. Если вам не интересно заниматься тем, что вы делаете, наверное, это дело лучше бросить. Однако, было бы неплохо конвертировать ваш кайф в какую-нибудь валюту. Даже желательно бы не в православный рубль, а басурманский доллар. Поэтому сегодня обсудим вопросы, которые задают на собеседованиях Python-разработчику и как в целом подготовиться к любому такому собеседованию. Текст написал автор YouTube-канала PyLounge Макс. Поехали!

Условно мы разделим сегодняшний разговор на 2 уровня. Первый уровень это junior/middle, а 2 уровень это senior. Почему так? Требования сильно варьируются от компании к компании. Одна фирма может предъявлять джуну требования крепкого мидла, а другую мидл со знаниями не шибко хорошего джуна вполне устроит. Поэтому ступень junior/middle объединяем. А вот о сениорах поговорим отдельно.

В принципе – раскрываю лайфхак, как подготовиться к абсолютно любому собеседованию на абсолютно любую сферу программирования, с любым языком. Записывайте.

Во-первых, не важно junior вы или middle. На любом собеседовании будут вопросы, касающиеся базовых основ языка и каких-то его фишек, которыми этот язык примечателен, какие сразу бросаются в глаза, либо вообще уникальные именно для этого языка. Например, в случае с Python практически на любом собеседовании спрашивают:

  • что такое итераторы и генераторы, и в чём их разница;
  • зачем нужны декораторы и как написать хотя бы простенький декоратор;
  • что такое аргс и кваргс (*args и **kwargs);
  • что такое менеджеры контекста;
  • какие типы данных есть в питоне, какие из них изменяемые и неизменяемые.
  • что такое метаклассы и магические методы.

Существуют и более тонкие вопросы, которые относятся к специфике языка на позиции постарше, например:

  • Method Resolution Order;
  • PEP;
  • Async и корутины;
  • Type annotation , GIL и т.д. Принцип вы поняли.

Естественно, вопросы могут варьироваться, какие-то будут мелькать чаще, какие-то реже. Однако вопрос про генераторы будет попадаться в 95% случаев. Потому что это – элемент языка за который цепляется глаз. То есть, чтобы подготовиться к вопросам непосредственно по языку, нужно обратить внимание именно на примечательные моменты. Ну и без базы, как, например, типы данных, естественно, тоже никуда.

Во-вторых, это общее знание Computer Science и всяких тем, связанных с программирование в целом, а не с конкретным языком.

Это, например, понимание того:

  • что такое ООП и классы;
  • наследование, множественное наследование;
  • алгоритмы и структуры данных (куда без них).

И чем выше уровень, тем возможно больше требования. Но раз на раз не приходится. Как минимум, про Большое О, список и 1-2 алгоритма сортировки знать стоит.

Так же не будет лишним знать:

  • парадигмы программирования;
  • основы баз данных, SQL;
  • что такое SOLID, DRY, KISS;
  • паттерны проектирования и тому подобное.

То, насколько подобные вопросы буду заводить в дебри зависит от требований работодателя. Иногда вопросы могут формулироваться так, что правильного ответа на него нет. Это своего рода открытый вопрос, нацеленный на то, чтобы послушать рассуждения и ход мыслей подсудимого. Например, вопрос о том, «Считаете ли вы, что распространение ООП – это круто? Если да, то почему?» И другие из этой оперы.

Отмечу, довольно важно, что на общие вопросы, что на вопросы по языку, отвечать в более простой, непринуждённой форме. Не надо учить определения наизусть. Вы не в школе. Интервьюеру достаточно показать, что вы понимаете, о чём говорите, пусть местами корявыми словами, зато понимание есть.

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

  • как устроен Web в целом, API;
  • что за звери такие HTTP, TCP, DNS, хост;
  • что такое REST API;
  • какие-то архитектурные решения по типу MVC, SOA;
  • про многопоточность, асинхронность;
  • базовые вещи из HTML, CSS, JS и т.д.

То есть всё связанно с тематикой или около того.

Вопросы, отражающие связь Python с выбранной областью (web в нашем случае) могут быть, например, такие:

  • вопросы по популярным веб фреймворкам Django, Flask, aiohttp;
  • что такое DjangoRESTFramework;
  • как отправить запрос GET/PUT и т.д.

Образно, если вы метите в Data Science стоит ожидать вопросов по sklearn и методам оптимизации и т.д. Думаю, тут понятно.

Четвёртая остановочка – это вопросы по технологиям, которыми пользуется компания или которыми, возможно, пользовались вы. И как это не странно, тут всё зависит от того, чем пользуется компания. Соответственно от этого и будет зависеть то, что придётся использовать вам. Если компания в качестве основной базы данных использует MongoDB, то ожидайте вопросов из этой области. Все сидят на Linux? – Значит и вы должны уметь хоть немного им пользоваться. Много кэшируют по вечерам? – Здравствуйте Redis! Если фирма жить не может без Jenkins – будьте добры хотя бы примерно представлять, что это. В общем, это вопрос очень открытый, нужно смотреть непосредственно в вакансиях. Если вы сами использовали те или иные технологии в своих проектах, о них тоже можно рассказать. Таким образом можно дать понять, что вы, оказывается, что-то умеете. Итак, с джуниор-мидлами закончили. Переходим к сеньорам.

На собеседованиях с сеньорами обычно мало говорят о теоретической стороне технологии, больше обсуждают конкретный опыт разработчика, стек технологий, которые он использовал. Поэтому формализованных вопросов здесь нет. Но это могут быть какие-то суперспецифичные вопросы из предметной области. Например, открытые вопросы из разряда «Какую архитектуру вы предпочли бы в таком случае, какие технологии и почему?». Да и вообще, если вы сеньор, вы ведь и так всё знаете, верно?

И напоследок пару советов. Не стоит приукрашивать своих способностей. Если вы в резюме написали, что знаете VueJS, то не будет неожиданностью налететь на вопрос по Vue. Старайтесь рассказать о том, чем вы занимались, возможно о каких-то домашних проектах. Что использовали, как и зачем, какие сложности были и как вы их решили. Ну и хорошо причёсанное портфолио на GitHub лишним не будет. И держитесь увереннее. Это важно.

На самом деле проходить собеседования — это навык, который тоже нарабатывается. Нет ничего смертельно в том, чтобы провалить пару-тройку интервью. Отрицательный результат — тоже результат. Заваленные собесы укажут на ваши слабые стороны и раскроют пробелы в знаниях. Это всё поправимо. Главное не бояться и уже начать собеседоваться, идеальный момент не наступит не когда. Дерзай!

  • python
  • собеседования
  • собеседования в it
  • собеседования python
  • pylounge

Вопросы на собеседовании для Junior Python-разработчика

Вы ищете работу на Python? В этой статье мы разберем основные вопросы на собеседовании на позицию Junior Python-разработчика. А чтобы вы могли быстрее подготовиться к собеседованию, ко всем вопросам мы добавили ответы.

Мы составили этот список, основываясь на десятках технических собеседований в ведущие технологические компании. Прочитав вопросы, отметьте те, на которые вы не смогли сразу дать ответ. Затем, при повторном прочтении, пройдите только те вопросы, которые вызвали у вас затруднения. Пройдя по этому списку два-три раза, вы будете хорошо подготовлены к техническому собеседованию по Python.

Заметим, что в этом посте мы разберем вопросы именно для младших разработчиков (джунов). Вопросы на более высокие позиции будут разобраны в отдельной статье.

Итак, давайте преступим! Какие же вопросы задают на собеседовании на позицию Python-разработчика уровня Junior?

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

Эффективность. Python очень хорошо справляется с управлением памятью. Если вы работаете с большими объемами данных, разработку лучше вести на Python.

Скорость. Хотя Python — интерпретируемый язык, все же он имеет очень высокую производительность.

Широта использования. Python используется самыми разными организациями и для разных типов проектов. Из-за такого широкого спектра применения нам доступны тысячи надстроек.

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

2. Что такое PEP 8 и зачем он нужен?

PEP 8 – это руководство по стилю кода Python.

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

Согласованность кода упрощает его чтение другими разработчиками. А чтобы обеспечить согласованность, мы придерживаемся PEP 8.

3. В чем разница между кортежем и списком в Python?

В Python кортежи и списки – это встроенные структуры данных. Вот несколько различий между списком (list) и кортежем (tuple):

  • Синтаксис. Кортеж заключается в круглые скобки, а список – в квадратные.
  • Изменяемость. Кортеж – это неизменяемая структура данных, а список – изменяемая.
  • Размер. Кортеж занимает гораздо меньше места, чем список в Python.
  • Производительность. Кортеж быстрее, чем список. Как следствие, это дает нам хорошую производительность.

4. В чем разница между списком и словарем в Python?

Это также встроенные структуры данных. Основные же различия между списком (list) и словарем (dictionary) в Python заключаются в следующем:

  • Синтаксис. В списке мы храним объекты в виде последовательности. В словаре объекты хранятся в виде пар «ключ-значение».
  • Обращение к элементу. К элементам списка мы обращаемся по индексу (помним, что индексация начинается с 0). К объектам, хранящимся в словаре, мы обращаемся по ключам, указанным при создании словаря.
  • Упорядоченность. Элементы списка хранятся в упорядоченной последовательности. В словаре объекты не упорядочены.
  • Хеширование. Ключи в словаре должны быть хешируемыми. В списке же нет необходимости в хешировании.

5. Какие встроенные типы доступны в Python?

В Python доступные следующие типы данных:

  • Числовые типы – это типы, используемые для представления чисел в Python.
    • int : используется для целых чисел.
    • long : предназначался для очень больших целых чисел неограниченной длины. В Python 3 не используется, поскольку в этой версии все int по умолчанию являются long.
    • float : используется для десятичных чисел.
    • complex : используется для представления комплексных чисел.
    • str : представляет собой последовательность символов, строку.
    • bytes : это последовательность целых чисел в диапазоне 0–255.
    • байтовый массив: работает как байты, но является изменяемым, доступен только в Python.
    • list (список): это последовательность объектов.
    • tuple (кортеж): неизменяемая последовательность объектов.
    • set : изменяемый набор уникальных объектов.
    • frozenset : неизменяемый набор уникальных объектов.

    6. Как объединить несколько строк в Python?

    Для объединения нескольких строк в Python можно использовать следующие способы:

    1. При помощи оператора + . Например:

    firstname = "John" lastname = "Ray" print(firstname+lastname) # Output: JohnRay

    2. При помощи функции join() . Например:

    ".join<['John','Ray']) # Output: 'JohnRay'

    7. Зачем использовать оператор pass в Python?

    Оператор pass используется в качестве заполнителя для будущего кода. При выполнении ничего не происходит, но вы избегаете ошибки, если пустой код не разрешен. Пустой код не допускается в циклах, определениях функций, определениях классов или в операторах if .

    8. Зачем нужны срезы в Python?

    Срезы – это строковая операция для получения подстроки или некоторой части списка.

    В Python строка (скажем, текст) начинается с индекса 0, а n-й символ сохраняется в позиции text[n-1] . Кроме того, Python также может выполнять обратную индексацию (в обратном направлении), с помощью отрицательных чисел.

    В Python есть специальная функция-конструктор, которая генерирует объект среза, — slice() . Результатом ее работы является набор индексов, заданных диапазоном ( start , stop , step ).

    Метод slice() принимает три параметра: start – номер для начала среза, stop — число, обозначающее конец среза, и step – шаг, с которым мы будем передвигаться по объекту. Шаг по умолчанию равен 1, то есть мы перебираем элементы по очереди, ничего не пропуская.

    От редакции Pythonist. Больше о срезах можно почитать в статье «Применение срезов списков без указания индексов в Python».

    9. В чем разница между итератором и итерируемым объектом в Python?

    Итераторы в Python – это объекты, похожие на массивы, которые позволяют переходить от одного элемента к другому. Мы используем их при обходе цикла, например, в цикле for .

    В библиотеке Python есть несколько итераторов. Например, список также является итератором, и мы можем запустить цикл for по нему.

    Коллекции, т.е. такие типы, как список, кортеж, словарь и множество, – являются итерируемыми объектами. Кроме того, они также являются итеративными контейнерами, которые возвращают итератор во время обхода цикла.

    10. Что такое лямбда-выражение в Python?

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

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

    11. Что такое None в Python?

    Ключевое слово None в Python представляет нулевые значения. Объект None имеет тип NoneType. С использованием таких объектов может быть выполнена операция логического равенства.

    12. Как используется оператор // в Python?

    Python предоставляет оператор // для выполнения целочисленного деления одного числа на другое. Результатом работы этого оператора является целое число, полученное в результате деления левого числа на правое.

    С той же целью можно использовать функцию floordiv(a, b) .

    13. Что такое модуль в Python?

    Модуль – это файл, написанный на Python и содержащий код с инструкциями импорта, классами, функциями и т.д.

    Модули можно импортировать в другой файл Python.

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

    Папка программы Python – это пакет модулей. Такой пакет может содержать модули или подпапки.

    14. Можно ли создать словарь с упорядоченным набором ключей в Python?

    В обычном словаре ключи не упорядочиваются. Чтобы решить эту проблему, можно использовать класс OrderDict . Класс доступен начиная с версии 2.7.

    15. Python – это объектно-ориентированный язык программирования или язык функционального программирования?

    Python – это объектно-ориентированный язык программирования. Однако его можно рассматривать как процедурный, а также как структурный язык.

    16. В чем разница между списковыми методами append() и extend() в Python?

    В Python методы append() и extend() используются для добавления элементов в конец списка. Однако между ними есть определенная разница.

    • append(элемент) : добавляет элемент, переданный в качестве аргумента, в конец списка.
    • extend(другой_список) : добавляет в конец списка элементы другого списка.

    17. Что такое ошибки и исключения в программах на Python?

    Ошибки – это проблемы с кодом в программе, которые могут привести к ее ненормальному завершению (получению не того результата, который мы хотели). Исключения возникают из-за возникновения внешнего события, которое прерывает нормальный ход программы.

    Пожалуй, это все основные вопросы, которые точно встретятся у вас на собеседовании, если вы претендуете на джуниорскую позицию разработчика на Python.

    Заключение

    Мы рассмотрели основные вопросы, которые могут задать на собеседовании начинающему разработчику.

    Надеемся, вы с легкостью смогли ответить на все. Если нет – ничего страшного, изучите тему, в которой вы не уверены и обязательно пройдитесь по этому списку несколько раз. Тогда вы точно будете уверены в своих знаниях перед собеседованием! Успехов!

    Топ 25 вопросов и ответов на собеседовании по Python

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

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

    Помимо этих вопросов, вам также вероятно предоставят фрагменты кода, прочитав которые вы должны будете определить результирующее значение (или его отсутствие). Такие задания невозможно предсказать, и успешность их прохождения будет зависеть от вашего опыта программирования. Давайте начнем с самых популярных вопросов и ответов на собеседовании по Python.

    Вопросы и ответы на собеседовании по Python 2021

    1) В чем разница между модулем и пакетом в Python?

    Каждый программный файл Python представляет собой модуль, который импортирует другие модули как объекты. Таким образом, модуль — это способ структурирования вашей программы. Папка с программой на Python называется пакетом модулей.

    2) Какие встроенные типы доступны в Python?

    Это один из наиболее распространенных вопросов на собеседовании. В Python есть изменяемые и неизменяемые встроенные типы.

    К изменяемым относятся:

    Представителями неизменяемых типов являются:

    3) Что такое лямбда-функция в Python?

    Лямбда часто используется как встраиваемая функция и представляет собой единственное анонимное функциональное выражение. Она применяется для создания нового объекта функции и его возврата во время выполнения.

    Лямбда — это анонимная функция в Python, которая может принимать неограниченное количество аргументов и может иметь любое число параметров. Однако лямбда-функция может иметь только одно выражение или инструкцию. Обычно она используется в ситуациях, когда требуется анонимная функция в течение короткого периода времени. Лямбда-функции можно использовать одним из двух способов:

     
     
    a = lambda x,y : x+y print(a(5, 6)) # Вывод: 11

    4) Что означает пространство имен?

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

    Ниже приведены три типа пространств имен в Python:

    • Локальное пространство имен — включает локальные имена внутри функции. Локальное пространство имен временно создается во время вызова функции и очищается при возврате из нее.
    • Глобальное пространство имен — состоит из имен различных импортированных пакетов/модулей, которые в настоящее время используются в проекте. Глобальное пространство имен создается при импорте пакета в скрипт, и оно доступно до тех пор, пока скрипт не закончит выполнение.
    • Встроенное пространство имен — оно включает встроенные функции Python и встроенные имена для различных типов исключений.

    5) Объясните разницу между списком и кортежем?

    Список изменяемый, а кортеж — нет. Кортежи можно хешировать, как в случае создания ключей для словарей.

    6) Чем отличается pickling от unpickling?

    Любое руководство по вопросам и ответам на собеседовании по Python не будет полным без этого вопроса. В Python модуль pickle принимает любой объект Python, преобразует его в строковое представление и выгружает его в файл с помощью функции dump. Такой процесс известен как pickling. Для этого процесса используется функция pickle.dump() .

    С другой стороны, процесс извлечения исходного объекта Python из сохраненного строкового представления называется unpickling. Для этого процесса используется функция pickle.load() .

    7) Что такое декораторы в Python?

    Декоратор Python — это некоторое обновление синтаксиса Python, сделанное для более простого изменения функций.

    8) Разница между генераторами и итераторами?

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

    9) Как преобразовать число в строку?

    Один из самых распространенных вопросов на собеседовании. Мы можем использовать встроенную функцию str() . Для восьмеричного или шестнадцатеричного представления числа мы можем использовать другие встроенные функции, такие как oct() или hex() .

    10) Как используется оператор // в Python?

    Использование оператора // между двумя числами дает частное при делении числителя на знаменатель. Он также называется оператором деления без остатка.

    11) Есть ли в Python инструкция Switch или Case, как в C?

    Нет. Однако мы можем создать нашу собственную функцию Switch и использовать ее.

    12) Что такое функция range() и каковы ее параметры?

    Функция range() используется для создания списка из чисел. Разрешены только целые числа, поэтому переданные аргументы могут быть как отрицательными, так и положительными. Допустимы следующие параметры:

     
     
    range(stop)

    Где «stop» — это количество целых чисел для генерации, начиная с 0. Пример: list(range(5)) == [0,1,2,3,4]

    Другие параметры: range([start], stop[, step]):

    • Start: устанавливает первое число в последовательности.
    • Stop: указывает верхний предел для последовательности.
    • Step: коэффициент приращения в последовательности.

    13) Как используется %s?

    %s — это спецификатор формата, который преобразует любое значение в строку.

    14) Обязательно ли функция Python должна возвращать значение?

    15) Есть ли в Python функция main()?

    Да, есть. Она выполняется автоматически всякий раз, когда мы запускаем скрипт. Если вы хотите изменить этот естественный порядок вещей, используйте оператор if.

    16) Что такое GIL?

    GIL или Global Interpreter Lock — это мьютекс, используемый для ограничения доступа к объектам Python. Он синхронизирует потоки и предотвращает их одновременное выполнение.

    17) Какой метод использовался до оператора «in» для проверки наличия ключа в словаре?

    18) Как изменить тип данных списка?

    Чтобы преобразовать список в кортеж, мы используем функцию tuple() .
    Чтобы превратить его в множество — функцию set() .
    Для преобразования в словарь — dict() .
    Для превращения в строку — join() .

    19) Каковы ключевые особенности Python?

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

    Некоторые из его ключевых особенностей:

    • Интерпретированный,
    • С динамической типизацией,
    • Объектно-ориентированный,
    • Англоязычный синтаксис.

    20) Объясните управление памятью в Python.

    В Python диспетчер памяти заботится об управлении памятью. Он выделяет ее в виде пространства в куче, в которой хранятся все объекты Python и структуры данных. В языке существуют 4 встроенных структуры данных. Данное пространство недоступно для программиста напрямую. Однако базовый API позволяет разработчику получить доступ к некоторым инструментам для написания кода.

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

    21) Что такое PYTHONPATH?

    PYTHONPATH — это переменная окружения, которая используется для включения дополнительных каталогов при импорте модуля/пакета. Каждый раз, когда модуль/пакет импортируется, PYTHONPATH используется для проверки наличия добавляемых модулей в существующих каталогах. Обычно интерпретатор использует PYTHONPATH, чтобы определить, какой модуль загрузить.

    22) Чувствителен ли Python к регистру?

    Язык программирования считается чувствительным к регистру, если он различает такие идентификаторы, как «myname» и «Myname». Проще говоря, он заботится, являются ли символы строчными или прописными.
    Давайте посмотрим на пример:

     
     
    >>> myname="John" >>> Myname Traceback (most recent call last): File "", line 1, in Myname NameError: name 'Myname' is not defined

    Возникновение ошибки NameError означает, что Python чувствителен к регистру.

    23) Объясните использование функций help() и dir() .

    В Python функция help() используется для отображения документации по модулям, классам, функциям, ключевым словам и так далее. Если help() не получает параметров, она запускает интерактивную справочную утилиту на консоли.

    Функция dir() возвращает допустимый список атрибутов и методов объекта, к которому она вызывается. Поскольку функция предназначена для получения наиболее релевантных данных (вместо отображения полной информации), она ведет себя по-разному с разными объектами:

    • Для модулей/библиотек функция dir() возвращает список всех атрибутов, содержащихся в этом модуле.
    • Для объектов класса dir() вернет список всех допустимых атрибутов и базовых атрибутов.
    • Когда ей не передаются никакие параметры, функция dir() возвращает список атрибутов в текущей области видимости.

    24) Что такое модули Python?
    Назовите некоторые наиболее часто используемые встроенные модули в Python?

    Модули Python — это файлы, содержащие код на Python, который представляет собой либо функциональные классы, либо переменные. Модули являются файлами Python с расширением .py. Они могут включать в себя набор функций, классов или переменных, которые определены и реализованы. Вы можете импортировать и инициализировать модуль с помощью инструкции import . Изучив руководство по Python, вы можете узнать больше о модулях в Python.

    Вот некоторые из наиболее часто используемых встроенных модулей в Python:
    Операционные системы

    25) Объясните, что означает «self» в Python.

    В Python «self» — это ключевое слово, применяемое для определения экземпляра или объекта класса. В отличие от Java, где self не является обязательным, в Python он используется как первый параметр. Self помогает отличать методы и атрибуты класса от его локальных переменных.

    Переменная self в методе __init__ ссылается к созданному объекту или экземпляру, тогда как в других методах она указывает на объект или экземпляр, метод которого был вызван.

    Хотите получить работу Python-разработчика?

    Тогда вам нужно выполнить следующий алгоритм:

    1. Записаться на курс от Skillbox «Профессия Python-разработчик»;
    2. Познакомиться с индивидуальным наставником, который поможет вам создать свою первую программу на Python и получить реальный опыт разработки;
    3. Пройти 7 блоков обучения с разным уровнем сложности, знание которых можно приравнять к году работы;
    4. Защитить диплом перед реальными заказчиками. Это не сложно, так как к концу обучения у вас будет 2 проекта на Github и глубокое понимание Python;
    5. Вместе с опытными HR-специалистами составить резюме и подготовится к собеседованию;
    6. Пройти собеседования на подобранные для вас вакансии Центром карьеры Skillbox.

    Переходите по ссылке и перенимайте знания у профи: Профессия Python-разработчик.

    Полный список вопросов с собеседований по Python для дата-сайентистов и инженеров

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

    Перевели статью разработчика, который не раз попадал в такую ситуацию и на основе своего опыта составил список из 53 вопросов и ответов для подготовки к собеседованию. Большинство исследователей данных пишут много кода, поэтому такой список пригодится и дата-сайентистам, и инженерам. Он будет полезен и для соискателей, и для тех, кто проводит собеседования, и для тех, кто просто изучает Python.

    Вопросы идут в случайном порядке. Поехали.

    1. В чем разница между списком и кортежем?

    Мне задавали этот вопрос буквально на каждом собеседовании по Python/data science. Выучите ответ как свои пять пальцев:

    1. Список можно изменить после создания.
    2. Кортеж нельзя изменить после создания.
    3. Список упорядочен. Он представляет собой упорядоченные последовательности объектов, как правило, одного и того же типа. Например, все имена пользователей упорядочены по дате создания: [“Seth”, “Ema”, “Eli”].
    4. У кортежа есть структура. В каждом индексе могут сосуществовать различные типы данных. Например, такая запись базы данных в памяти: (2, “Ema”, “2020–04–16”) # id, name, created_at.

    2. Как выполняется интерполяция строк?

    Без импорта класса Template есть три способа интерполяции строк:

    name = 'Chris' # 1. f strings print(f'Hello ') # 2. % operator print('Hey %s %s' % (name, name)) # 3. format print( "My name is <>".format((name)) )

    3. В чем разница между “is” и “==”?

    Когда я был начинающим разработчиком, то не видел разницы… привет, баги. Так что для протокола: is проверяет идентичность, а == проверяет равенство.

    Рассмотрим пример. Создайте несколько списков и назначьте им имена. Обратите внимание, что ниже b указывает на тот же объект, что и a:

    a = [1,2,3] b = a c = [1,2,3] 

    Проверьте равенство и обратите внимание, что все объекты равны:

    print(a == b) print(a == c) #=> True #=> True 

    Но являются ли все они идентичными? Нет:

    print(a is b) print(a is c) #=> True #=> False 

    Можем проверить это, распечатав их идентификаторы объектов:

    print(id(a)) print(id(b)) print(id(c)) #=> 4369567560 #=> 4369567560 #=> 4369567624 

    Идентификатор c отличается от идентификатора a и b.

    4. Что такое декоратор?

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

    Декоратор позволяет добавить новую функциональность к существующей функции. Это делается следующим образом. Функция передается декоратору, а он выполняет и существующий, и дополнительный код.

    Напишем декоратор, который записывает в журнал вызовы другой функции.

    Напишите функцию декоратора. В качестве аргумента он принимает функцию func. Декоратор определяет функцию log_function_called, которая вызывает func() и выполняет некоторый код print(f' called.’). Затем возвращает определенную им функцию:

    def logging(func): def log_function_called(): print(f' called.') func() return log_function_called 

    Напишем другие функции, к которым добавим декоратор (потом, не сейчас):

    def my_name(): print('chris') def friends_name(): print('naruto') my_name() friends_name() #=> chris #=> naruto 

    Теперь добавим декоратор к ним обоим.

    @logging def my_name(): print('chris') @logging def friends_name(): print('naruto') my_name() friends_name() #=> called. #=> chris #=> called. #=> naruto 

    Теперь легко добавить ведение журнала в любую функцию, которую мы пишем. Достаточно написать перед ней @logging.

    5. Объясните функцию range

    Range генерирует список целых чисел. Ее можно использовать тремя способами.

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

    range(stop): генерирует целые числа от 0 до целого числа stop:

    [i for i in range(10)] #=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

    range(start, stop): генерирует целые числа от start до stop:

    [i for i in range(2,10)] #=> [2, 3, 4, 5, 6, 7, 8, 9] 

    range(start, stop, step): генерирует целые числа от start до stop с интервалами step:

    [i for i in range(2,10,2)] #=> [2, 4, 6, 8] 

    Серж Боремчук предложил более подходящий способ:

    list(range(2,10,2)) #=> [2, 4, 6, 8] 

    6. Определите класс car с двумя атрибутами: color и speed. Затем создайте экземпляр и верните speed

    Вот как это сделать:

    class Car : def __init__(self, color, speed): self.color = color self.speed = speed car = Car('red','100mph') car.speed #=> '100mph' 

    7. В чем разница между методами экземпляра, класса и статическими методами в Python?

    Методы экземпляра: принимают параметр self и относятся к определенному экземпляру класса.

    Статические методы: используют декоратор @staticmethod, не связаны с конкретным экземпляром и являются автономными (атрибуты класса или экземпляра не изменяются).

    Методы класса: принимают параметр cls, можно изменить сам класс.

    Проиллюстрируем разницу на вымышленном классе CoffeeShop:

    class CoffeeShop: specialty = 'espresso' def __init__(self, coffee_price): self.coffee_price = coffee_price # instance method def make_coffee(self): print(f'Making for $') # static method @staticmethod def check_weather(): print('Its sunny') # class method @classmethod def change_specialty(cls, specialty): cls.specialty = specialty print(f'Specialty changed to ') 

    У класса CoffeeShop есть атрибут specialty (фирменный напиток), установленный по умолчанию в значение ‘espresso’. Каждый экземпляр CoffeeShop инициализируется с атрибутом coffee_price. У него также три метода: метод экземпляра, статический метод и метод класса.

    Давайте инициализируем экземпляр с атрибутом coffee_price, равным 5. Затем вызовем метод экземпляра make_coffee:

    coffee_shop = CoffeeShop('5') coffee_shop.make_coffee() #=> Making espresso for $5 

    Теперь вызовем статический метод. Статические методы не могут изменять состояние класса или экземпляра, поэтому обычно используются для служебных функций, например, сложения двух чисел. Наши проверяют погоду. Говорят, что солнечно. Отлично!

    coffee_shop.check_weather() #=> Its sunny 

    Теперь используем метод класса для изменения фирменного напитка (specialty), а затем сделаем кофе (make_coffee):

    coffee_shop.change_specialty('drip coffee') #=> Specialty changed to drip coffee coffee_shop.make_coffee() #=> Making drip coffee for $5 

    Обратите внимание, что make_coffee раньше делал эспрессо, а теперь заваривает капельную кофеварку (drip coffee).

    8. В чем разница между func и func()?

    Вопрос должен проверить ваше понимание, что все функции в Python также являются объектами:

    def func(): print('Im a function') func #=> function __main__.func> func() #=> Im a function

    func — это представляющий функцию объект, который можно назначить переменной или передать другой функции. Функция func() с круглыми скобками вызывает функцию и возвращает результат.

    9. Объясните, как работает функция map

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

    def add_three(x): return x + 3 li = [1,2,3] list(map(add_three, li)) #=> [4, 5, 6] 

    Здесь к каждому элементу в списке мы добавляем число 3.

    10. Объясните, как работает функция reduce

    Это может быть сложновато сразу понять, пока вы не используете ее несколько раз.

    reduce принимает функцию и последовательность — и проходит по этой последовательности. На каждой итерации в функцию передаются как текущий элемент, так и выходные данные предыдущего элемента. В конце концов, возвращается одно значение:

    from functools import reduce def add_three(x,y): return x + y li = [1,2,3,5] reduce(add_three, li) #=> 11 

    Возвращается 11, что является суммой 1+2+3+5.

    11. Объясните, как работает функция filter

    Функция делает буквально то, о чем говорит ее название: она фильтрует элементы в последовательности.

    Каждый элемент передается функции, которая включает его в последовательность, если по условию получает True, и отбрасывает в случае False:

    def add_three(x): if x % 2 == 0: return True else: return False li = [1,2,3,4,5,6,7,8] [i for i in filter(add_three, li)] #=> [2, 4, 6, 8] 

    Обратите внимание, как удалены все элементы, которые не делятся на 2.

    12. Переменные в Python передаются по ссылке или по значению?

    Будьте готовы спуститься в кроличью нору семантики, если загуглите этот вопрос и прочтете несколько первых страниц.

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

    name = 'object'

    Давайте посмотрим, как это работает со строками. Создадим экземпляр имени и объекта, на который указывают другие имена. Затем удалим первое:

    x = 'some text' y = x x is y #=> True del x # удаляем имя 'a' , но не объект в памяти z = y y is z #=> True 

    Мы видим, что все имена указывают на один и тот же объект в памяти, который остался нетронутым после операции удаления имени del x.

    Вот еще один интересный пример с функцией:

    name = 'text' def add_chars(str1): print( id(str1) ) #=> 4353702856 print( id(name) ) #=> 4353702856 # новое имя, тот же объект str2 = str1 # создаем новое имя (не отличается от предыдущего) и новый объект str1 += 's' print( id(str1) ) #=> 4387143328 # объект не изменился print( id(str2) ) #=> 4353702856 add_chars(name) print(name) #=>text 

    Обратите внимание, что добавление буквы s в строку внутри функции создает новое имя — и новый объект тоже. Даже если у нового объекта то же самое имя, что и у существующего.

    13. Как развернуть список?

    Обратите внимание, что reverse() вызывается в списке и изменяет его. Сама функция не возвращает измененный список:

    li = ['a','b','c'] print(li) li.reverse() print(li) #=> ['a', 'b', 'c'] #=> ['c', 'b', 'a'] 

    14. Как работает умножение строк?

    Посмотрим результат умножения строки ‘cat’ на 3:

    'cat' * 3 #=> 'catcatcat' 

    В результате содержимое строки повторяется трижды.

    15. Как работает умножение списка?

    Посмотрим на результат умножения списка [1,2,3] на 2:

    [1,2,3] * 2 #=> [1, 2, 3, 1, 2, 3] 

    16. Что означает self в классе?

    Self ссылается на экземпляр класса. Так метод может обновлять объект, к которому принадлежит.

    Ниже передача self в __init__() дает возможность установить цвет экземпляра при инициализации:

    class Shirt: def __init__(self, color): self.color = color s = Shirt('yellow') s.color #=> 'yellow' 

    17. Как объединить списки в Python?

    Списки объединяются при сложении. Обратите внимание, что с массивами так не получается:

    a = [1,2] b = [3,4,5] a + b #=> [1, 2, 3, 4, 5] 

    18. В чем разница между глубокой и мелкой копиями?

    Обсудим это в контексте изменяемого объекта — списка. Для неизменяемых объектов глубокое и мелкое (поверхностное) копирование обычно не отличаются.

    Рассмотрим три сценария.

    I) Поставьте ссылку на исходный объект. Она отсылает новое имя li2 к тому же месту в памяти, на которое указывает li1. Поэтому любое изменение в li1 также происходит с li2:

    li1 = [['a'],['b'],['c']] li2 = li1 li1.append(['d']) print(li2) #=> [['a'], ['b'], ['c'], ['d']] 

    II) Создайте мелкую копию оригинала. Ее можно создать с помощью конструктора list() или mylist.copy().

    Мелкая копия создает новый объект, но заполняет его ссылками на оригинал. Таким образом, добавление нового объекта в исходный список li3 не отразится в li4, а вот изменение объектов в li3 — отразится:

    li3 = [['a'],['b'],['c']] li4 = list(li3) li3.append([4]) print(li4) #=> [['a'], ['b'], ['c']] li3[0][0] = ['X'] print(li4) #=> [[['X']], ['b'], ['c']] 

    III) Создайте глубокую копию. Это делается с помощью copy.deepcopy(). Оригинал и копия полностью независимы, а изменения в одном не оказывают никакого влияния на другой:

    import copy li5 = [['a'],['b'],['c']] li6 = copy.deepcopy(li5) li5.append([4]) li5[0][0] = ['X'] print(li6) #=> [['a'], ['b'], ['c']] 

    19. В чем разница между списками и массивами?

    Примечание: в стандартной библиотеке Python есть объект array, но здесь мы специально обсуждаем массив из популярной библиотеки Numpy.

    Списки в каждом индексе можно заполнять разными типами данных. Массивы требуют однородных элементов.

    Арифметические действия в списках добавляют или удаляют элементы из списка. Арифметические действия на массивах соответствуют функциям линейной алгебры.

    Массивы используют меньше памяти и обладают значительно большей функциональностью.

    20. Как объединить два массива?

    Помните, что массивы — это не списки. Это библиотека Numpy и здесь работает линейная алгебра.

    Для объединения массивов нужно использовать соответствующую функцию Numpy:

    import numpy as np a = np.array([1,2,3]) b = np.array([4,5,6]) np.concatenate((a,b)) #=> array([1, 2, 3, 4, 5, 6]) 

    21. Что вам нравится в Python?

    Примечание: это очень субъективный вопрос, и логично адаптировать ответ в зависимости от того, на какую должность вы претендуете.

    Python очень удобочитаем, и есть так называемый «питоновский способ» решения почти любой задачи, то есть самый понятный, ясный и лаконичный код.

    Это мне кажется противоположностью Ruby, где часто много способов решить задачу без четких указаний, какой вариант предпочтительнее.

    22. Какая ваша любимая библиотека в Python?

    Примечание: это тоже субъективно, см. вопрос 21.

    При работе с большим количеством данных трудно найти что-то полезнее, чем pandas. С этой библиотекой обработка и визуализация данных становятся проще простого.

    23. Назовите изменяемые и неизменяемые объекты

    Неизменяемость означает, что состояние нельзя изменить после создания. Примеры: int, float, bool, string и tuple.

    Состояние изменяемых объектов можно изменить. Примеры: list, dict и set.

    24. Как округлить число до трех десятичных знаков?

    Используйте функцию round(value, decimal_places):

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *