← Назад к курсу

Материалы для собеседования: Python скрининг

Цель: Проверить базовые знания Python, понимание ООП и способность решать простые алгоритмические задачи

Целевая аудитория: Junior/Middle Python разработчики

Дата подготовки: 03.12.2025

Структура собеседования (60 минут)

0-5 мин
Введение и знакомство
5-20 мин
Базовые теоретические вопросы
20-35 мин
ООП и функции
35-50 мин
Практическая задача
50-60 мин
Вопросы кандидата

Базовые понятия Python (5 ключевых вопросов)

1. Что такое Python? Каковы его основные особенности?
Интерпретируемый, динамически типизированный язык высокого уровня. Основные особенности: простота синтаксиса, автоматическое управление памятью, большая стандартная библиотека.
2. Разница между списком (list) и кортежем (tuple)?
Список - изменяемый (mutable), кортеж - неизменяемый (immutable). Списки используют квадратные скобки [], кортежи - круглые ().
3. Что такое изменяемые и неизменяемые типы данных?
Изменяемые: list, dict, set. Неизменяемые: int, float, str, tuple, frozenset. Разница в возможности изменения объекта после создания.
4. Разница между `is` и `==`?
`is` проверяет идентичность объектов (один и тот же объект в памяти), `==` проверяет равенство значений.
5. Что такое list comprehension?
Синтаксический сахар для создания списков. Пример: `[x**2 for x in range(10)]` создает список квадратов чисел от 0 до 9.

Типы данных в Python

# Список (list) - изменяемый, упорядоченный
my_list = [1, 2, 3]
my_list.append(4) # Можно изменить

# Кортеж (tuple) - неизменяемый, упорядоченный
my_tuple = (1, 2, 3)
# my_tuple[0] = 4 # Ошибка! Нельзя изменить

# Множество (set) - изменяемый, неупорядоченный, уникальные элементы
my_set = {1, 2, 3, 3} # {1, 2, 3}

# Словарь (dict) - изменяемый, неупорядоченный (Python 3.7+ сохраняет порядок)
my_dict = {'a': 1, 'b': 2}

ООП в Python (5 ключевых вопросов)

1. Что такое класс, объект, экземпляр?
Класс - шаблон для создания объектов. Объект/экземпляр - конкретная реализация класса.
2. Разница между методом класса и статическим методом?
@classmethod получает класс как первый аргумент (cls), @staticmethod не получает неявных аргументов.
3. Наследование в Python
Поддерживает одиночное и множественное наследование. Использует MRO (Method Resolution Order) для разрешения методов.
4. Что такое MRO?
Method Resolution Order - порядок, в котором Python ищет методы в иерархии наследования.
5. Абстрактные классы
Классы, которые нельзя инстанцировать напрямую. Содержат абстрактные методы, которые должны быть реализованы в дочерних классах.

Функции и области видимости

1. Что такое `*args` и `**kwargs`?
`*args` - для передачи неименованных аргументов (кортеж), `**kwargs` - для передачи именованных аргументов (словарь).
2. Правило LEGB
Local → Enclosing → Global → Built-in. Порядок поиска переменных при их использовании.
3. Что такое декораторы?
Функции, которые изменяют поведение других функций. Принимают функцию как аргумент и возвращают новую функцию.
# Пример простого декоратора 
def my_decorator(func): 
    def wrapper(): 
        print("До вызова функции") 
        func() 
        print("После вызова функции") 
    return wrapper 

@my_decorator 
def say_hello(): 
    print("Привет!") say_hello()

Пример задачи: Палиндром

Задание: Напишите функцию, которая проверяет, является ли строка палиндромом (читается одинаково слева направо и справа налево).
def is_palindrome(s): 
    # Убираем пробелы и приводим к нижнему регистру 
    s = s.replace(" ", "").lower() 
    # Сравниваем строку с её перевернутой версией 
    return s == s[::-1] 

# Примеры использования 
print(is_palindrome("А роза упала на лапу Азора")) # True print(is_palindrome("Python")) # False 
print(is_palindrome("racecar")) # True
Что проверить у кандидата:
- Знание срезов строк (`[::-1]`)
- Обработка регистра и пробелов
- Эффективность решения
- Тестовые случаи (пустая строка, один символ)

Пример задачи: FizzBuzz

Задание: Напишите программу, которая выводит числа от 1 до 100. Но для кратных трём выводит «Fizz» вместо числа, для кратных пяти — «Buzz», а для кратных и трём, и пяти — «FizzBuzz».
def fizzbuzz(n=100): 
    for i in range(1, n+1): 
        if i % 3 == 0 and i % 5 == 0: 
            print("FizzBuzz") 
        elif i % 3 == 0: 
            print("Fizz") 
        elif i % 5 == 0: 
            print("Buzz") 
        else: 
            print(i) 

# Альтернативное решение 
def fizzbuzz_alt(n=100): 
    for i in range(1, n+1): 
        output = "" 
        if i % 3 == 0: 
            output += "Fizz" 
        if i % 5 == 0: 
            output += "Buzz" 
    print(output or i)
Что проверить у кандидата:
- Понимание оператора % (остаток от деления)
- Порядок условий (важно проверять "FizzBuzz" первым)
- Читаемость кода
- Возможные оптимизации

Критерии оценки кандидата

✅ Знание базовых конструкций
Типы данных, операторы, циклы, условия
✅ Понимание ООП
Классы, наследование, полиморфизм, инкапсуляция
✅ Решение алгоритмических задач
Логическое мышление, подход к решению
✅ Объяснение кода
Способность объяснить свои решения
✅ Чистота кода
Именование переменных, структура кода, комментарии
✅ Работа с ошибками
Обработка edge cases, отладка

Ресурсы для подготовки

Дополнительные материалы:

  • Рекомендуемая литература: "Python. Карманный справочник" М. Лутц
  • Видео: "Собеседование Python. Разбор вопросов" (YouTube)

Дополнительный материал

Вопросы учеников к ИИ-помощнику и ответы по теме урока

Вопрос: alexis@ts-group.ru · 2025-12-03 20:50
2. Правило LEGB Local → Enclosing → Global → Built-in. Порядок поиска переменных при их использовании. Расскажи подробнее
Ответ ИИ:

Отлично, давай разберем правило LEGB подробнее. Это фундаментальный механизм, который определяет, как Python ищет значение переменной, когда ты на нее ссылаешься.

Основная мысль: LEGB — это порядок (scope), в котором Python ищет переменные: сначала в локальной области видимости, затем во внешних функциях, потом в глобальной и, наконец, во встроенных именах. Это предотвращает конфликты и позволяет управлять доступом к данным.

Ключевые пункты:

  1. L — Local (Локальная):

    • Область внутри функции (или метода, или lambda-выражения).
    • Python сначала проверяет, не объявлена ли переменная здесь.
    • Пример: Переменные, созданные внутри функции с помощью = или как параметры.
  2. E — Enclosing (Охватывающая / nonlocal):

    • Область видимости внешних функций, если мы имеем дело с вложенными функциями.
    • Ищет переменные в объемлющих (enclosing) функциях, начиная с ближайшей.
    • Пример: Полезно для замыканий (closures).
  3. G — Global (Глобальная):

    • Область видимости на уровне модуля (файла с кодом).
    • Сюда попадают переменные, объявленные вне всех функций.
    • Чтобы изменить глобальную переменную внутри функции, нужно использовать ключевое слово global.
  4. B — Built-in (Встроенная):

    • Самый верхний уровень. Сюда входят встроенные функции и исключения Python (print, len, list, ValueError и т.д.).
    • Python обращается сюда, если не нашел имя во всех предыдущих областях.

Пример для наглядности:
```python
x = "глобальная" # G - Global

def outer():
x = "охватывающая" # E - Enclosing (для функции inner)

def inner():
    x = "локальная"  # L - Local
    print(x)  # Выведет "локальная" (нашло в L)

inner()
print(x)  # Выведет "охватывающая" (нашло в E для outer)

outer()
print(x) # Выведет "глобальная" (нашло в G)
print(len([1,2,3])) # 'len' найден в B -