Python Core

Основы и типы данных

4 вопросов

'==' проверяет равенство значений (вызывает __eq__), а 'is' — идентичность объектов (проверяет, что id(a) == id(b)).

Изменяемые (mutable): list, dict, set, bytearray. Неизменяемые (immutable): int, float, str, tuple, frozenset, bytes.

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

Shallow copy создает новый объект, но вкладывает ссылки на оригинальные вложенные объекты. Deep copy рекурсивно копирует всё содержимое.

import copy
shallow = copy.copy(obj)
deep = copy.deepcopy(obj)

Функции и замыкания

3 вопросов

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

def repeat(n):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(n): func(*args, **kwargs)
        return wrapper
    return decorator

Он копирует метаданные оригинальной функции (имя, docstring) в обертку декоратора, чтобы отладка и помощь в IDE работали корректно.

Итератор — это объект с методом __next__. Генератор — это частный случай итератора, создаваемый функцией с yield или выражением.

Объектно-ориентированное программирование

4 вопросов

MRO определяет порядок поиска методов при множественном наследовании. В Python используется алгоритм C3, доступен через Class.mro().

classmethod принимает ссылку на класс (cls) первым аргументом, а staticmethod не получает специальных аргументов и ведет себя как обычная функция внутри пространства имен класса.

Он жестко ограничивает набор атрибутов экземпляра, предотвращая создание __dict__. Это значительно экономит память при создании миллионов объектов.

class Point:
    __slots__ = ('x', 'y')

Метаклассы — это 'классы для классов'. Они определяют, как создаются сами объекты-классы (по умолчанию это type).

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

2 вопросов

Основной механизм — подсчет ссылок. Дополнительный — generational GC (три поколения), который ищет циклические ссылки.

Global Interpreter Lock предотвращает выполнение нескольких потоков байт-кода одновременно для защиты управления памятью (счетчиков ссылок).

Асинхронность и многопоточность

3 вопросов

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

Это бесконечный цикл, который следит за состоянием задач (Future/Task). Когда задача ожидает ввода-вывода, цикл переключается на другую готовую задачу.

gather используется для одновременного запуска и ожидания результатов, wait дает более гибкий контроль (например, возврат после первого завершения).

Навигация