Друзья, привожу краткие ответы на вопросы с вчерашнего Mock-собеседования.



Ответы на вопросы:



1) Стандартный интерпретатор Python использует два алгоритма сборки мусора: подсчет ссылок и поколенческий сборщик мусора (Garbage collector, GC).



Алгоритм подсчета ссылок очень простой и эффективный, но у него есть один недостаток: он не умеет определять циклические ссылки. Именно из-за этого в Python существует дополнительный поколенческий GC, который следит за объектами с потенциальными циклическими ссылками.



Алгоритм подсчета ссылок является фундаментальным и не может быть отключен, тогда как поколенческий GC опционален и может быть отключен. В отличие от алгоритма подсчета ссылок, поколенческий GC не работает в режиме реального времени и запускается периодически. За поколенческий GC в Python отвечает модуль gc. Почитать про модуль gc можно в официальной документации по ссылке.



2) Контекстный менеджер — это объект, определяющий контекст выполнения в операторе with.



Протокол контекстных менеджеров состоит из двух методов:

__enter__() — вводит контекст и при необходимости возвращает некоторый объект. Значение, возвращаемое этим методом, привязывается к переменной в предложении as оператора with.

__exit__()
— предоставляет выход из контекста и возвращает логический флаг (тип bool), указывающий на то, следует ли подавлять возбужденное исключение.



3) Тип int (целое число) является неизменяемым. Python кеширует небольшие целые числа в диапазоне от -5 до 256 и хранит их в единственном экземпляре. Поэтому для указанного диапазона чисел оператор is всегда возвращает значение True.



4) List (set, dict) comprehension — это упрощенный подход к созданию списка (множества, словаря), который задействует цикл for, а также инструкции if-else для определения того, что в итоге окажется в финальном списке.



5) Приведенный код покажет [[1], [1], [1]], поскольку в списке data трижды хранится ссылка на один и тот же список.



6) Приведенный код покажет True, False, 10, []. Обратите внимание, что в Python операторы or и and необязательно возвращают значение True/False, как в других языках программирования. Подробнее об этом по ссылке.



7) Приведенный код покажет True, True, False. Не забывайте, что итераторы являются однопроходными. Встроенная функция map() возвращает итератор.



8) Несмотря на то, что range — это ленивый объект, то есть он не хранит все свои значения в памяти, он не является итератором.



9) Приведенный код выведет 20 20. Чтобы понять, почему это происходит, нужно изучить механизм работы вложенных функций + замыкания.



10) Декоратор — это функция, которая принимает другую функцию, расширяет ее поведение, не изменяя ее явно, и возвращает новую функцию. Подробности в нашем прекрасном уроке из курса для профессионалов.



11) Если в теле функции нет оператора return, то она неявно вернет значение None. Исходя из определения декоратора (см. выше), получаем, что декоратор вернет None и функция, которую мы декорируем, превратится в None. При попытке вызвать ее после декорирования получим исключение TypeError: 'NoneType' object is not callable.



#собеседование #python #ответы