🐍 15 самых часто задаваемых вопросов на собеседовании про Python

Разбор 15 самых часто задаваемых вопросов для начинающих, а также для продвинутых Python-разработчиков.
🐍 15 самых часто задаваемых вопросов на собеседовании про Python

1. Что такое PEP 8?

PEP - расшифровывается как Python Enhancement Proposal. Это официальный проектный документ, предоставляющий информацию сообществу Python и описывающий новую функцию для Python или его процессов. PEP 8 важен, так как документирует руководящие принципы стиля для кода Python. То есть, для написания кода ввели определенные правила, которым рекомендуется следовать.

2. Scope в Python – какие бывают?

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

  • Local scope – относится к локальным объектам, доступным в текущей функции.
  • Global scope – относится к объектам, доступным во время выполнения кода с момента их создания.
  • Module-level scope - относится к глобальным объектам текущего модуля, доступным в программе.
  • Outermost – относится ко всем встроенным именам, вызываемым в программе. Объекты в этой области видимости ищутся в последнюю очередь, чтобы найти имя, на которое ссылаются.

3. List и Tuples – зачем нужны и какие отличия?

List и Tuples - это типы данных, которые хранят коллекцию объектов в Python. Объекты, хранящиеся в обеих последовательностях, имеют разные типы данных. List представлены квадратными скобками ['sara', 6, 0.19], а tuples - круглыми скобками ('max', 5, 0.97). Ключевое различие между ними заключается в том, что в то время как list является изменяемым, tuples, напротив, является неизменяемым объектом. Это означает, что данные в list могут быть изменены, добавлены или нарезаны на ходу, а в tuples остаются неизменными и не могут быть изменены никаким образом.

Пример использования:

Пример использования list и tuples в Python
        tuple_example = ('max', 6, 5, 0.97)
list_example = ['max', 6, 5, 0.97]
print(tuple_example [0])     # вывод => 'max'
print(list_example [0])     # вывод => 'max'
tuple_example [0] = 'andrey'    # изменение tuple => тут вызвется ошибка
list_example [0] = 'andrey'    # изменение list => list modified
print(tuple_example [0])     # вывод => 'max'
print(list_example [0])     # вывод => 'andrey'
    
Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека питониста»

4. Что такое pass в Python?

Pass - представляет собой нулевую операцию в Python. Обычно она используется для заполнения пустых блоков кода, который может выполняться во время исполнения. В примере, приведенном ниже, без оператора pass можно столкнуться с ошибкой как <<IndentationError>> во время выполнения кода.

Пример использования pass в Python
        def myEmptyFunc():
   #функция ничего не делает
   pass
myEmptyFunc()
# если же убрать pass будет вот такая ошибка
# File "<stdin>", line 3
# IndentationError: expected an indented block
    

5. Что такое модули и пакеты в Python?

Модули - это файлы Python с расширением <<.py>>, в которых определены и реализованы наборы функций, классов или переменных. Они могут быть импортированы и инициализированы один раз с помощью оператора import. Если требуется частичная функциональность, необходимые классы или функции импортируются с помощью оператора from foo import bar.

Пакеты позволяют иерархически структурировать пространство имен модуля с помощью точечной нотации. Как модули помогают избежать столкновений между именами глобальных переменных, так и пакеты помогают избежать столкновений между именами модулей. Создать пакет просто, поскольку он использует присущую системе файловую структуру. Пакет создается как папка в файловой системе и помещается необходимый модуль (файл python). Импорт модуля или его содержимого из пакета требует, чтобы имя пакета был префиксом к имени модуля, соединенным точкой. Подробнее на здесь.

пример импортирования пакета и модуля в Python
        from myclass import MyClass
from foo.bar.yourclass import YourClass
    

Пакеты и модули – это два механизма, позволяющие осуществлять модульное программирование в Python. Модульное программирование имеет несколько преимуществ:

  • Простота: Работа над одним модулем позволяет сосредоточиться на относительно небольшой части проблемы. Это делает разработку более простой и менее подверженной ошибкам.
  • Удобство обслуживания: Модули предназначены для обеспечения логических границ между различными проблемными областями. Если они написаны таким образом, что уменьшают взаимозависимость, то меньше вероятность того, что изменения в модуле могут повлиять на другие части программы.
  • Возможность повторного использования: Функции, определенные в модуле, могут быть легко использованы повторно в других частях приложения.
  • Разметка: Модули обычно определяют отдельное пространство имен, что помогает избежать путаницы между идентификаторами из других частей программы.

6. Какие отличия между массивом и списком в Python?

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

Списки содержат элементы разных типов данных, то есть тип данных списков может быть неоднородным. Их недостатком является потребление большого объема памяти.

Пример использования массива и списка:

Пример использования array и list в Python
        import array
array_example = array.array('i', [1, 2, 3])
for i in array_example:
    print(i, end=' ')    #вывод: 1 2 3
array_example = array.array('i', [1, 2, 'string'])    #вывод: TypeError: an integer is required (got type str)
list_example = [1, 2, 'string']
for i in list_example:
   print(i, end=' ')    #вывод: 1 2 string
    

7. Отрицательное значение индексов в Python

Отрицательное значение индексов в Python является популярным использованием slicing (вырезок) коллекций и массивов. То есть индексацией можно пользоваться для создания вырезок из коллекций.

Синтаксис – [start : stop : step]:

  • start – с какого индекса нужно начинать (может быть отрицательным)
  • stop – на каком месте остановится
  • step – количество шагов для перехода. По умолчанию 1.
Пример использования slicing в Python
        numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(numbers[1::2]) 
print(numbers[-1::2]) #начнет с последнего значения.
print(numbers[3:-2:2]) #начнет с индекса 3 и дойдет до 2 элемента, 
											 #то есть дойдет до последнего элемента и начнет сначало чтобы
											 #дойти до индекса 2
    

8. Как управляется память в Python?

В Python оператор присваивания (=) не копирует объекты. Вместо этого он создает связь между существующим объектом и именем целевой переменной. Чтобы создать копии объекта в Python, необходимо использовать модуль copy. Более того, существует два способа создания копий для данного объекта с помощью модуля copy.

  1. Shallow Copy – это побитовая копия объекта. Созданный скопированный объект имеет точную копию значений в исходном объекте. Если одно из значений является ссылкой на другие объекты, копируются только адреса ссылок на них.
  2. Deep Copy – рекурсивно копирует все значения от исходного объекта к целевому, т. е. дублирует даже объекты, на которые ссылается исходный объект.

Пример использования сopy и deepcopy:

Пример использования copy и deepcopy в Python
        from copy import copy, deepcopy
list_1 = [1, 2, [3, 5], 4]

## shallow copy
list_2 = copy(list_1) 
list_2[3] = 7
list_2[2].append(6)
list_2    # вывод => [1, 2, [3, 5, 6], 7]
list_1    # вывод => [1, 2, [3, 5, 6], 4]

## deep copy
list_3 = deepcopy(list_1)
list_3[3] = 8
list_3[2].append(7)
list_3    # вывод => [1, 2, [3, 5, 6, 7], 8]
list_1    # вывод => [1, 2, [3, 5, 6], 4]
    

10. Как делается перегрузка операторов в Python?

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

Пример использования:

Пример использования перегрузки оператора в Python
        class Vector: 
	def __init__(self, x, y):
		self.x = x
		self.y = y
	
	def __add__(self, vector): 
		return Vector(self.x + vector.x, self.y + vector.y)
	
	def __sub__(self, vector):
    return Vector(self.x - vector.x, self.y - vector.y)

v1 = Vector(1,2)
v2 = Vector(3,4)

print(v1+v2) #вывод => Vector(4, 6)
print(v1-v2) #вывод => Vector(-2, -2)
    

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

11. Как передаются аргументы – значения или ссылка?

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

По значению: Передается копия реального объекта. Изменение значения копии объекта не приведет к изменению значения исходного объекта.

По ссылке: Передается ссылка на реальный объект. Изменение значения нового объекта изменит значение исходного объекта.

Пример использования:

Пример использования передачи аргументов в Python
        def appendNumber(arr):
   arr.append(4)
arr = [1, 2, 3]
print(arr)  #вывод: => [1, 2, 3]
appendNumber(arr)
print(arr)  #вывод: => [1, 2, 3, 4]
    

12. Что такое *args и *kwargs?

*args – это специальный синтаксис, используемый в определении функции для передачи аргументов переменной длины.

* – означает переменную длину, а args – это название принятое в PEP 8, но можно использовать любое другое название

Пример использования:

Пример использования *args в Python
        def multiply(a, b, *argv):
   mul = a * b
   for num in argv:
       mul *= num
   return mul
print(multiply(1, 2, 3, 4, 5)) #вывод: 120
    

**kwargs – это специальный синтаксис, используемый в определении функции для передачи аргументов переменной длины с ключевыми словами. На самом деле, это dictionary который имеет key и value.

Пример использования:

Пример использования **kwargs в Python
        def tellArguments(**kwargs):
   for key, value in kwargs.items():
       print(key + ": " + value)
tellArguments(arg1 = "argument 1", arg2 = "argument 2", arg3 = "argument 3")
#вывод:
# arg1: argument 1
# arg2: argument 2
# arg3: argument 3
    

13. Пустой класс и как он используется?

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

Пример использования:

Пример использования пустого класса в Python
        class EmptyClassDemo:
   pass
obj=EmptyClassDemo()
obj.name="Proglib"
print("Name of class = ",obj.name)
    

14. Используются ли в python спецификаторы доступа?

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

Пример использования:

Пример использования спецификаторы доступов в Python
        class User:
   
    # protected - доступен только в классе или же те дочерним классам
    _emp_name = None
    _age = None
    
    # private - доступен только в самом классе
    __branch = None
    
    # конструктор
    def __init__(self, emp_name, age, branch): 
         self._emp_name = emp_name
         self._age = age
         self.__branch = branch
    
    # публичный метод - общедоступный метод
    def display():
        print(self._emp_name +" "+self._age+" "+self.__branch)
    

15. Написать алгоритм (несколько примеров)

  • Напишите программу для объединения двух разных словарей. При объединении, если вы найдете одинаковые ключи, вы можете добавить значения этих ключей. Выведите новый словарь
Реализация алгоритма на Python
        from collections import Counter
d1 = {'ключ1': 50, 'ключ2': 100, 'ключ3':200}
d2 = {'ключ1': 200, 'ключ2': 100, 'ключ4':300}
new_dict = Counter(d1) + Counter(d2)
print(new_dict)
    
  • Напишите программу для проверки и возврата пар заданного массива A, суммарное значение которых равно заданному значению N.
Реализация алгоритма на Python
        def print_pairs(arr, N):
   # hash set
   hash_set = set()
    
   for i in range(0, len(arr)):
       val = N-arr[i]
       if (val in hash_set):
           print("Пара: " + str(arr[i]) + ", " + str(val))
       hash_set.add(arr[i])

arr = [1, 2, 40, 3, 9, 4]
N = 3
print_pairs(arr, N)
    
***

Материалы по теме

Комментарии

ВАКАНСИИ

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

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