Interview Questions

Python

Редактировать на GitHub

Теоретические вопросы

Что такое хеш-таблица? Пример использования.

Хеш-таблица (hash table) — это структура данных, которая хранит пары ключ–значение и обеспечивает быстрый доступ к элементам по ключу за амортизированное O(1) время.

В Python хеш-таблицы реализованы в таких структурах, как dict и set.
При добавлении элемента ключ преобразуется в хеш (число), и на основе этого значения выбирается место в памяти.

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

# Создание хеш-таблицы (словаря)
users = {
    "alice": 25,
    "bob": 30,
    "charlie": 22
}

# Быстрый доступ по ключу
print(users["bob"])  # 30

# Добавление нового элемента
users["david"] = 28

# Проверка существования ключа
if "alice" in users:
    print("Alice найдена!")

# Удаление элемента
del users["charlie"]

Ключевые особенности:

  • Ключи должны быть хешируемыми (immutable: str, int, tuple, и т.п.).
  • Вставка, поиск и удаление работают в среднем за O(1).
  • При коллизиях (одинаковый хеш для разных ключей) Python использует open addressing (открытую адресацию).

Что такое генератор, что такое итератор?

Итератор

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

Генератор

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

  • Генератор не вычисляет все значения сразу при создании. Значения генерируются по мере необходимости.
  • В памяти хранится только последнее вычисленное значение, а также правило перехода к следующему элементу и условие остановки генерации.
  • Вычисление следующего значения происходит при вызове метода next(). Предыдущее значение при этом теряется.

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

  1. Изменяемость (Mutable vs Immutable):

    • Список можно изменять после создания. Элементы можно добавлять, удалять или изменять.
    • Кортеж является неизменяемым объектом. После создания кортежа его содержимое нельзя изменить.
  2. Производительность:

    • Кортеж работает быстрее, чем список, при итерации и доступе к элементам, так как из-за своей неизменяемости он оптимизирован лучше. Это делает его предпочтительным выбором для данных, которые не изменяются.
    • Список медленнее, так как его структура предусматривает возможность модификации данных.
  3. Использование памяти:

    • Кортежи занимают меньше памяти по сравнению со списками за счёт своей неизменяемости.
    • Списки требуют больше памяти, так как резервируют пространство для возможных изменений.
  4. Функциональность:

    • Списки поддерживают множество методов, таких как append(), remove(), extend(), и другие, позволяющие изменять его содержимое.
    • Кортежи не поддерживают методы изменения, так как они неизменяемы, но могут быть использованы методы, такие как count() и index().
  5. Использование:

    • Список используется, когда данные могут изменяться, например, список задач, товаров или пользователей.
    • Кортеж обычно используется для хранения данных, которые не должны изменяться, например, координаты точки (x, y), дата или параметры конфигурации.
  6. Хешируемость:

    • Кортеж хешируем (если все его элементы также хешируемы), что позволяет использовать его в качестве ключа в словарях или элемента в множестве.
    • Список не является хешируемым и не может быть ключом в словарях или элементом в множестве.
  7. Безопасность:

    • Кортеж благодаря своей неизменяемости является более безопасным для данных, которые не должны изменяться. Это предотвращает случайные или преднамеренные изменения данных.
    • Список, наоборот, можно случайно изменить, что может привести к нежелательным последствиям.
  8. Синтаксические различия:

    • Список создаётся с помощью квадратных скобок: my_list = [1, 2, 3]
    • Кортеж создаётся с помощью круглых скобок: my_tuple = (1, 2, 3)
      Примечание: если кортеж содержит один элемент, необходимо указать запятую: single_element_tuple = (1,)

Вывод:

  • Если вам нужна структура данных, которую можно изменять, используйте список.
  • Если ваши данные неизменяемы, и вам важна оптимизация памяти и производительности, выбирайте кортеж.

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

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

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

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

def my_name():
    print('chris')

def friends_name():
    print('naruto')

my_name()
friends_name()
# => chris
# => naruto

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

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


def my_name():
    print('chris')


@logging
def friends_name():
    print('naruto')


my_name()
friends_name()

# => chris
# => <function friends_name at 0x10fca5f28> called.
# => naruto

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

Какое значение принимает переменная в Python, которая не имеет значения?

Будет иметь значение None

Последнее обновление: 14 окт. 2025 г., 12:08:27