Підготовка до співбесіди з Python: Питання та відповіді
Чи ви готуєтеся до співбесіди на посаду розробника Python, або просто бажаєте перевірити свій рівень знань? Не турбуйтеся! У цій статті ми розглянемо типові питання, які можуть виникнути на співбесіді, а також надамо відповіді на них.
Мета цієї статті – допомогти вам зрозуміти, які питання можуть бути поставлені під час інтерв’ю, та оцінити ваші навички програмування на Python. Перш ніж переглядати відповіді, радимо спробувати відповісти на питання самостійно, щоб об’єктивно оцінити свої знання. Давайте ж розпочнемо!
Питання розділені на тематичні розділи для зручності. Кожен розділ містить запитання та пропоновані відповіді. Ви можете формулювати відповіді своїми словами, зберігаючи основний зміст, щоб на співбесіді ви виглядали впевнено та природно.
Основи мови Python
#1. Що таке Python?
Python – це інтерпретована, високорівнева мова програмування загального призначення. Завдяки широкому спектру сторонніх бібліотек і фреймворків, Python дозволяє створювати різноманітні програми. Він є однією з провідних мов у таких передових сферах, як штучний інтелект та аналіз даних.
#2. Яка ключова різниця між інтерпретатором та компілятором?
Інтерпретатор перекладає код на машинний код рядок за рядком під час виконання, тоді як компілятор перетворює весь код на машинний код одноразово перед запуском програми.
#3. Python – це мова зі статичною чи динамічною типізацією?
Python – це мова з динамічною типізацією.
#4. Що означає “динамічна типізація”?
Динамічно типізовані мови перевіряють типи змінних під час виконання програми. Прикладами таких мов є Python, JavaScript та Ruby.
Додаткова інформація: Мови зі статичною типізацією, такі як C++, C, та Java, перевіряють типи змінних на етапі компіляції.
#5. Які сфери застосування Python?
Python має простий та інтуїтивно зрозумілий синтаксис, що робить його легким для вивчення. Велика спільнота розробників Python забезпечує наявність різноманітних пакетів та бібліотек для розробки. Python застосовується для створення веб-додатків, програм із графічним інтерфейсом, утиліт командного рядка тощо.
Однією з популярних сфер застосування Python є автоматизація. За допомогою Python можна легко створювати скрипти для автоматизації таких завдань, як очищення диска, відправка електронних листів, отримання даних про ціни на товари тощо. Python є також провідною мовою в області науки про дані.
#6. Які проекти ви реалізовували за допомогою Python?
Я розробив декілька скриптів для автоматизації рутинних завдань, а також скрипти для збору інформації про ціни товарів та їх наявність.
Крім того, я працював з фреймворками Django та Flask для створення веб-додатків, розробивши декілька проектів на їх основі.
Примітка: Наведена відповідь є лише прикладом. Ваша відповідь може відрізнятися. Спробуйте розповісти про різні сфери, де ви використовували Python, та показати свої проекти, якщо є така можливість.
Типи даних
#7. Які вбудовані типи даних існують в Python?
Python має такі вбудовані типи даних: `int`, `float`, `complex`, `bool`, `list`, `tuple`, `set`, `dict`, `str`.
Примітка: Необов’язково називати всі типи даних Python. Згадайте ті, з якими ви найчастіше працюєте. Інтерв’юер може задати додаткові питання на основі вашої відповіді.
#8. Яка різниця між списком (list) і кортежем (tuple)?
І списки, і кортежі використовуються для зберігання колекцій об’єктів. Основна відмінність полягає в тому, що список є змінюваним (mutable) об’єктом, тоді як кортеж – незмінним (immutable).
#9. Що означають змінювані (mutable) та незмінні (immutable) типи даних?
Змінювані типи даних можна змінювати після їх створення. До них належать `list`, `set` та `dict`.
Незмінні типи даних не можуть бути змінені після створення. До таких типів належать `str` та `tuple`.
#10. Опишіть деякі методи списків (list).
1. `append()` – додає елемент в кінець списку.
>>> a = [1, 2] >>> a.append(3) >>> a [1, 2, 3]
2. `pop()` – видаляє елемент зі списку. Видаляє останній елемент, якщо не вказано індекс, або елемент за вказаним індексом.
>>> a = [1, 2, 3, 4, 5] >>> a.pop() 5 >>> a [1, 2, 3, 4] >>> a.pop(1) 2 >>> a [1, 3, 4]
3. `remove()` – видаляє перше входження вказаного елемента зі списку.
>>> a = [1, 2, 2, 3, 4] >>> a.remove(1) >>> a [2, 2, 3, 4] >>> a.remove(2) >>> a [2, 3, 4]
4. `sort()` – сортує список за зростанням або спаданням.
>>> a = [3, 2, 4, 1] >>> a.sort() >>> a [1, 2, 3, 4] >>> a.sort(reverse=True) >>> a [4, 3, 2, 1]
5. `reverse()` – змінює порядок елементів у списку на зворотний.
>>> a = [3, 2, 4, 1] >>> a.reverse() >>> a [1, 4, 2, 3]
Примітка: Існують інші методи, такі як `clear`, `insert`, `count` тощо. Необов’язково пояснювати всі методи. Достатньо розповісти про 2-3, які ви використовуєте найчастіше.
#11. Опишіть деякі методи рядків (str).
1. `split()` – розбиває рядок на список підрядків за заданим роздільником. За замовчуванням роздільником є пробіл.
>>> a = "Це приклад рядка" >>> a.split() ['Це', 'приклад', 'рядка'] >>> a = "1, 2, 3, 4, 5, 6" >>> a.split(", ") ['1', '2', '3', '4', '5', '6']
2. `join()` – об’єднує елементи списку рядків в один рядок з використанням заданого роздільника.
>>> a = ['Це', 'приклад', 'рядка'] >>> ' '.join(a) 'Це приклад рядка' >>> ', '.join(a) 'Це, приклад, рядка'
Примітка: Інші методи рядків: `capitalize`, `isalnum`, `isalpha`, `isdigit`, `lower`, `upper`, `center` тощо.
#12. Що таке негативна індексація в списках?
Індекси використовуються для доступу до елементів у списках. Звичайна індексація починається з 0.
Негативна індексація також використовується для доступу до елементів, але вона дозволяє отримувати доступ до елементів з кінця списку. Останній елемент має індекс -1, передостанній -2 і так далі.
>>> a = [1, 2, 3, 4, 5] >>> a[-1] 5 >>> a[-3] 3 >>> a[-5] 1
#13. Опишіть деякі методи словників (dict).
1. `items()` – повертає пари ключ-значення словника у вигляді списку кортежів.
>>> a = {1: 'Один', 2: 'Два', 3: 'Три'} >>> a.items() dict_items([(1, 'Один'), (2, 'Два'), (3, 'Три')])
2. `pop()` – видаляє пару ключ-значення зі словника за вказаним ключем.
>>> a = {1: 2, 2: 3} >>> a.pop(2) 3 >>> a {1: 2}
Примітка: Інші методи словників: `get`, `keys`, `values`, `clear` тощо.
#14. Що таке зрізи (slicing) в Python?
Зрізи використовуються для отримання підпослідовності з послідовного типу даних. Зріз повертає новий об’єкт того ж типу даних, що і вихідний.
Зрізи приймають три аргументи: початковий індекс, кінцевий індекс та крок. Синтаксис зрізу: `змінна[start:end:step]`. Всі аргументи є необов’язковими. Якщо вказати порожній зріз (:), буде повернуто всю послідовність.
>>> a = [1, 2, 3, 4, 5] >>> a[:] [1, 2, 3, 4, 5] >>> a[:3] [1, 2, 3] >>> a[3:] [4, 5] >>> a[0:5:2] [1, 3, 5]
#15. Які типи даних підтримують зрізи (slicing)?
Зрізи можна використовувати з типами даних `list`, `tuple` та `str`.
#16. Що таке оператори розпакування (unpacking) в Python? Як їх використовувати?
Оператори `*` і `**` є операторами розпакування в Python.
Оператор `*` використовується для одночасного присвоєння декількох значень з послідовних типів даних різним змінним.
>>> items = [1, 2, 3] >>> a, b, c = items >>> a 1 >>> b 2 >>> c 3 >>> a, *b = items >>> a 1 >>> b [2, 3]
Оператор `**` використовується з типами даних `dict`. Розпакування словників працює дещо інакше, ніж розпакування послідовних типів даних.
Розпакування словників найчастіше використовується для копіювання елементів з одного словника в інший.
>>> a = {1:2, 3:4} >>> b = {**a} >>> b {1: 2, 3: 4} >>> c = {3:5, 5:6} >>> b = {**a, **c} >>> b {1: 2, 3: 5, 5: 6}
Примітка: Ви можете знайти більше інформації про ці оператори в окремих статтях.
Умови та цикли
#17. Чи є в Python оператор `switch`?
Ні, в Python немає оператора `switch`.
#18. Як можна реалізувати функціональність оператора `switch` в Python?
Функціональність оператора `switch` можна реалізувати за допомогою операторів `if` та `elif`.
>>> if a == 1: ... print("...") ... elif a == 2: ... print("....")
#19. Що таке оператори `break` і `continue`?
`break` – оператор `break` завершує виконання поточного циклу, і виконання програми переходить до наступної інструкції після циклу.
>>> for i in range(5): ... if i == 3: ... break ... print(i) ... 0 1 2
`continue` – оператор `continue` пропускає залишок коду в поточній ітерації циклу і переходить до наступної ітерації.
>>> for i in range(5): ... if i == 3: ... continue ... print(i) ... 0 1 2 4
#20. Коли виконується блок `else` в циклах `while` та `for`?
Блок `else` в циклах `while` та `for` виконується після того, як цикл завершує всі свої ітерації. Він не виконується, якщо цикл переривається оператором `break`.
#21. Що таке генератори списків (list comprehension) та генератори словників (dict comprehension)?
Генератори списків та словників – це компактний синтаксис для створення нових списків та словників на основі існуючих ітерабельних об’єктів.
>>> a = [i for i in range(10)] >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> a = {i: i + 1 for i in range(10)} >>> a {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10} >>>
#22. Як працює функція `range`?
Функція `range` створює послідовність чисел у заданому діапазоні. Синтаксис функції `range` наступний: `range(start, stop[, step])`.
Аргумент `stop` є обов’язковим, а `start` та `step` є необов’язковими. Значення за замовчуванням для `start` та `step` дорівнюють 0 та 1 відповідно.
>>> list(range(10)) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> list(range(1, 10)) [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> list(range(1, 10, 2)) [1, 3, 5, 7, 9] >>>
Функції
#23. Що таке параметри та аргументи?
Параметри – це імена змінних, які перераховані в оголошенні функції.
Аргументи – це фактичні значення, які передаються функції під час її виклику.
#24. Які типи аргументів існують в Python?
В Python існують чотири основні типи аргументів: позиційні, за замовчуванням, ключові слова та довільні.
Позиційні аргументи: Це звичайні аргументи, які ми визначаємо в функціях. Під час виклику функції необхідно надати всі позиційні аргументи.
>>> def add(a, b): ... return a + b ... >>> add(1, 2) 3 >>> add(1) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: add() missing 1 required positional argument: 'b' >>>
Аргументи за замовчуванням: Можна задати значення аргументам у самому визначенні функції як значення за замовчуванням. Якщо користувач не передасть значення, функція використовуватиме значення за замовчуванням.
>>> def add(a, b=3): ... return a + b ... >>> add(1, 2) 3 >>> add(1) 4
Аргументи ключових слів: Можна вказувати імена аргументів під час виклику функції та присвоювати їм значення. Це дозволяє не дотримуватися порядку, який є обов’язковим для позиційних аргументів.
>>> def add(a, b): ... print("a ", a) ... print("b ", b) ... return a + b ... >>> add(b=4, a=2) a 2 b 4 6
Довільні аргументи: використовуються для збору невизначеної кількості аргументів. Оператори `*` і `**` використовуються для збору аргументів.
>>> def add(*args): ... return sum(args) ... >>> add(1, 2, 3, 4, 5) 15 >>> def dict_args(**kwargs): ... print(kwargs) ... >>> dict_args(a="Значення A", b='Значення B', c="Значення C") {'a': 'Значення A', 'b': 'Значення B', 'c': 'Значення C'}
#25. Що таке лямбда-функція?
Лямбда-функції – це невеликі анонімні функції в Python. Вони можуть мати один вираз і приймати декілька аргументів.
>>> add = lambda a, b: a + b >>> add(1, 3) 4
#26. Яка різниця між звичайною функцією та лямбда-функцією?
Звичайні функції та лямбда-функції мають подібну функціональність, але лямбда-функції мають більш лаконічний синтаксис. Лямбда-функції зручні, коли потрібно виразити невелику функціональність в одному рядку.
#27. Для чого використовується ключове слово `pass`?
Ключове слово `pass` використовується для позначення порожнього блоку коду. Python не дозволяє залишати блоки без коду, тому `pass` дозволяє нам визначити порожні блоки (які можна заповнити пізніше).
>>> def add(*args): ... ... File "<stdin>", line 3 ^ IndentationError: expected an indented block >>> def add(*args): ... pass ... >>>
#28. Що таке рекурсивна функція?
Функція, яка викликає саму себе, називається рекурсивною функцією.
#29. Що таке оператори пакування (packing) в Python? Як їх використовувати?
Оператори пакування використовуються для збору декількох аргументів у функціях. Вони також відомі як довільні аргументи.
Примітка: Ви можете знайти більше інформації про оператори пакування в окремих статтях.
ООП в Python
#30. Яке ключове слово використовується для створення класів в Python?
Ключове слово `class` використовується для створення класів в Python. Рекомендується використовувати стандарт PascalCase для іменування класів.
>>> class Car: ... pass ...
#31. Як створити екземпляр класу в Python?
Екземпляр класу можна створити, викликавши клас як функцію. При створенні об’єкта класу можна передавати необхідні атрибути.
>>> class Car: ... def __init__(self, color): ... self.color = color ... >>> red_car = Car('red') >>> red_car.color 'red' >>> green_car = Car('green') >>> green_car.color 'green' >>>
#32. Що таке `self` в Python?
`self` представляє екземпляр класу. Він використовується для доступу до атрибутів та методів об’єкта всередині класу.
#33. Що таке метод `__init__`?
`__init__` – це метод конструктора класу. Він автоматично виконується під час створення об’єкта класу і використовується для ініціалізації його початкових даних.
#34. Що таке docstring в Python?
Docstring (рядок документації) використовується для документування блоку коду. Його також можна використовувати як багаторядковий коментар.
Docstring в методах класу пояснює, що робить цей метод. Документацію методу можна переглянути за допомогою функції `help()`.
>>> class Car: ... def __init__(self, color): ... self.color = color ... ... def change_color(self, updated_color): ... """Цей метод змінює колір автомобіля""" ... self.color = updated_color ... >>> car = Car('red') >>> help(car.change_color) Help on method change_color in module __main__: change_color(updated_color) method of __main__.Car instance Цей метод змінює колір автомобіля >>>
#35. Що таке dunder (або магічні) методи?
Методи, що мають подвійне підкреслення на початку і в кінці назви, називаються dunder або магічними методами. Вони зазвичай використовуються для перевизначення стандартної поведінки методів. Наприклад, можна перевизначити методи `__str__`, `__len__`, `__setitem__`, `__getitem__` і т.д.
>>> class Car: ... def __str__(self): ... return "Це клас Car" ... >>> car = Car() >>> print(car) Це клас Car >>>
Примітка: Існує багато інших методів, які можна перевизначити для детального налаштування коду. Перегляньте документацію для отримання додаткової інформації.
#36. Як реалізувати наслідування в Python?
Наслідування реалізується шляхом передачі батьківського класу в якості аргумента дочірньому класу. В методі `__init__` дочірнього класу можна викликати метод `__init__` батьківського класу.
>>> class Animal: ... def __init__(self, name): ... self.name = name ... >>> class Dog(Animal): ... def __init__(self, name): ... super().__init__(name) ... >>> doggy = Dog('Tommy') >>> doggy.display() Tommy >>>
#37. Як отримати доступ до батьківського класу всередині дочірнього класу в Python?
Для доступу до батьківського класу всередині дочірнього класу використовується функція `super()`. Вона дозволяє отримувати доступ до атрибутів та методів батьківського класу.
Інше
#38. Як використовувати однорядкові та багаторядкові коментарі в Python?
Для однорядкових коментарів використовується символ `#`. Для багаторядкових коментарів використовуються потрійні одинарні (`”’коментар”’`) або потрійні подвійні лапки (`”””коментар”””`).
#39. Що таке об’єкт в Python?
В Python все є об’єктом. Усі типи даних, функції та класи є об’єктами.
#40. Яка різниця між `is` та `==`?
Оператор `==` використовується для перевірки того, чи мають два об’єкти однакові значення. Оператор `is` перевіряє, чи посилаються два об’єкти на одне й те саме місце в пам’яті.
>>> a = [] >>> b = [] >>> c = a >>> a == b True >>> a is b False >>> a is c True >>>
#41. Що таке поверхнева (shallow) та глибока (deep) копія?
Поверхнева копія створює копію оригіналу без копіювання посилань на вкладені об’єкти. В результаті, і копія, і оригінал посилаються на ті самі вкладені об’єкти, тому зміна в одному об’єкті вплине на інший.
Для поверхневого копіювання використовується метод `copy` з модуля `copy`.
>>> from copy import copy >>> a = [1, [2, 3]] >>> b = copy(a) >>> a[1].append(4) >>> a [1, [2, 3, 4]] >>> b [1, [2, 3, 4]]
Глибока копія створює копію всіх об’єктів рекурсивно, включаючи вкладені об’єкти, створюючи незалежну копію. Для глибокого копіювання використовується функція `deepcopy` з модуля `copy`.
>>> from copy import deepcopy >>> a = [1, [2, 3]] >>> b = deepcopy(a) >>> a[1].append(4) >>> a [1, [2, 3, 4]] >>> b [1, [2, 3]] >>> b[1].append(5) >>> a [1, [2, 3, 4]] >>> b [1, [2, 3, 5]] >>>
#42. Що таке ітератори?
Ітератори – це об’єкти в Python, які зберігають свій стан під час ітерації. Вони ініціалізують дані за допомогою методу `__iter__` та повертають наступний елемент за допомогою методу `__next__`.
Для отримання наступного елемента ітератора необхідно викликати `next(iterator)`. Тип даних послідовності можна перетворити в ітератор за допомогою вбудованого методу `iter`.
>>> a = [1, 2] >>> iterator = iter(a) >>> next(iterator) 1 >>> next(iterator) 2 >>> next(iterator) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration >>>
#43. Що таке генератори?
Генератори – це функції, які повертають ітератор, а саме об’єкт-генератор. Вони використовують оператор `yield` для генерації даних.
>>> def numbers(n): ... for i in range(1, n + 1): ... yield i ... >>> _10 = numbers(10) >>> next(_10) 1 >>> next(_10) 2 >>> next(_10) 3 >>> next(_10) 4
Висновок 👨💻
Як бачите, перелік питань не обмежується тим, що ми розглянули в цій статті. Ми продемонстрували типові питання, які можуть ставитися з різних тем. Пам’ятайте, що цей список не вичерпний.
Для ефективної підготовки важливо задавати собі питання на різні теми. Намагайтеся сформулювати різні типи питань з кожної концепції і самостійно давати на них відповіді. Це допоможе вам почувати себе впевнено під час співбесіди. Також, використовуйте онлайн-компілятори Python для практики кодування.
Бажаємо вам успіхів у майбутній співбесіді з Python! 👍