Поздравляю с нашим профессиональным праздников - 256-м днём в году!
Пока вайбкодинг ещё не вытеснил программеров в Data Science, и пока Python играет одну из ключевых ролей, давайте освежим важные особенности языка, которые часто спрашивают даже у сеньоров на собеседованиях ✍️
1. Python со статической или динамической типизацией?
Напомним разновидности:
- Статическая типизация (C++, Java): тип переменной задаётся заранее и проверяется до запуска программы.
- Динамическая типизация (Python, JavaScript): тип переменной определяется во время выполнения программы - а именно, в момент присваивания. В Python это происходит при исполнении соответствующей строки кода (ведь он интерпретируемый), поэтому одна и та же переменная может в разные моменты хранить объекты разных типов.
2. Разница между генераторами и итераторами?
Вспомним, что итерируемый объект - это то, из чего можно последовательно доставать элементы (список, множество, строка).
Итератор - это «механизм перебора»: объект, который умеет по одному выдавать элементы итерируемого объекта. Для этого у него есть методы iter (возвращает сам итератор) и next возвращает следующий элемент)
Генератор — это удобный способ создать итератор. Его пишут через yield или в виде генераторного выражения. Главное отличие: генератор сам запоминает своё состояние между вызовами и продолжает работу с того места, где остановился.
3. В чем разница между yield и return?
return завершает функцию и возвращает одно значение.
yield приостанавливает функцию, возвращает значение, но сохраняет её состояние, чтобы можно было продолжить выполнение этой функции позже. Используется как раз для создания генераторов!
4. А что такое декораторы и зачем они нужны?
Декоратор - это вызываемый объект (функция или класс с call), который принимает другую функцию или класс и возвращает «обёрнутую» версию. То есть позволяет добавлять новое поведение к функциям/классам без изменения их кода (примеры: логирование, кеширование, измерение времени работы фунции).
5. Какие бывают пространства имен в Python?
Есть четыре уровня пространств имён:
- Local (локальное внутри функции)
- Enclosing (это локальное пространство переменных внешней функции, к которому может обращаться внутренняя функция, если она определена внутри этой внешней)
- Global (глобальное внутри модуля)
- Built-in (встроенные объекты Python).
Запоминается по правилу LEGB.
6. Как передаются аргументы в функции - по значениям или по ссылке?
В Python аргументы передаются по ссылке на объект, но сами ссылки копируются. Если объект изменяемый (список, словарь) - изменения видны и снаружи функции. Если неизменяемый (int, str, tuple) - создаётся новый объект.
7. Как происходит управление памятью в Python?
Python управляет памятью автоматически: у каждого объекта есть счётчик ссылок - когда на объект больше нет активных ссылок, память освобождается сразу. Для циклических ссылок (когда объекты ссылаются друг на друга) работает отдельный garbage collector, который периодически запускается в фоне.
8. Что такое GIL и разрешена ли многопоточность в Python?
GIL (Global Interpreter Lock) - это глобальная блокировка интерпретатора, которая не позволяет одновременно выполнять код в нескольких потоках. Поэтому для CPU-ограниченных задач многопоточность в Python не даёт прироста. Но она хорошо работает для задач ввода-вывода (I/O) и для вычислений внутри библиотек, реализованных на C/C++ (NumPy или Faiss), которые обходят GIL.
9. Что такое дескриптор?
Дескриптор - это объект с методами set/get/delete который управляет доступом к атрибуту другого класса. На дескрипторах реализованы property, методы класса, статические методы.
10. Как работает менеджер контекста with под капотом?
Менеджер контекста - это объект, у которого определены методы enter и exit. При входе в блок with вызывается enter, при выходе - exit, что гарантирует корректное освобождение ресурсов (например, закрытие файла).
Кто все и так знал - ставьте 🐳
#python@data_easy