
- •Теоретические вопросы
- •1. Какая реализация интерпретатора python является стандартной? Назовите популярные реализации других интерпретаторов и их особенности.
- •2. Какие парадигмы программирования поддерживает python. Кратко объясните их?
- •3/4. Что такое мутабельные и иммутабельные типы данных? Чем они отличаются? Приведите примеры мутабельных/иммутабельных типов.
- •5. Приведение стандартных типов данных к логическому. На основе чего оно работает и где принято применять?
- •6. Необходимо реализовать функцию, которая принимает переменное число аргументов. Какой инструмент python вы для этого используете? Объяснить его принцип работы.
- •7. Как использовать дефолтные аргументы функции и как их изменять? Возможные проблемы, связанные с ними.
- •8. Что такое оператор упаковки и распаковки, их сходства и отличия? Приведите примеры использования.
- •9. Как в python работает области видимости (локальный и глобальный контекст, видимость функций, тело операторов)?
- •10. Что такое lambda выражение, как оно работает и из чего строится? Напишите простейшее lambda выражение и приведите примеры, где его принято применять.
- •11. Перечислите набор встроенных в python функций, взятых из функционального программирования. Как они работают (принимаемые аргументы и результат работы), где их можно применять?
- •12. Что такое list comprehension? Реализуйте его и объясните, какие преимущества у него есть.
- •13. Что такое декоратор? На основе каких принципов python он устроен? Реализуйте простейший декоратор.
- •15. В чем отличие bound method от function? Синтаксический сахар при вызове методов у объекта класса.
- •16. Геттеры и сеттеры в python. Реализуйте класс, в котором будет одно поле и для работы с ним геттер и сеттер.
- •17. Работа со __slots__ в python. Зачем нужен данный инструмент, какие задачи выполняет, какие ограничения накладывает на объект класса и какие преимущества дает.
- •18. Реализация сокрытия полей и методов в python. Общепринятые соглашение о наименовании. Преимущества и недостатки такого подхода.
- •19. Функция super. Объяснить принцип ее работы.
- •20. Что такое “магические методы” в python? Их отличительная особенность в именовании. Какие задачи выполняют? Назвать пять штук с объяснением их работы.
- •21. Как работают getattr, setattr, hasattr и т.Д.? Как переопределить их стандартную реализацию для конкретного класса?
- •22. Множественное наследование в python. Выбор вызываемого метода. Привести пример.
- •23. Как работают функции isinstance и issubclass? При решении каких задач они могут пригодиться.
- •24. Что такое иерархия исключений в python? Объяснить принцип ее построения. Как правильно перехватить любое исключение?
- •25. Что такое иерархия исключений в python? Объяснить принцип ее построения. Реализация собственных исключений в python.
- •26. У вас есть блок try/except, который перехватывает все исключения. Как правильно вывести трейсбек, но чтобы при этом программа продолжила функционировать?
- •27. Обработка множественных исключений в python и ее корректная реализация. Как функционирует блок else в таком случае?
- •28. Что такое менеджер контекста в python? Какие задачи он выполняет при работе с различными файлами? Можно ли дублировать его работу через try/except/finally?
- •29. Что такое итератор в python? Какие два метода позволяют реализовать протокол итерации для объекта класса и что они должны возвращать?
- •30. Что такое генератор в python? Какое главное преимущество? Реализуйте простейший генератор.
- •1. Дан список из n элементов строчного типа. Удалить все элементы, состоящие из пустых строк.
19. Функция super. Объяснить принцип ее работы.
Функция super() возвращает специальный объект, который делегирует («передаёт») вызовы методов от производного класса к базовому. Эту функцию можно вызывать в любом методе класса — в частности, в конструкторе.
Фактически фраза super().__init__(size, size) звучит так: вызови метод __init__ у моего базового (родительского) класса.
20. Что такое “магические методы” в python? Их отличительная особенность в именовании. Какие задачи выполняют? Назвать пять штук с объяснением их работы.
Специальные методы (или “магические” методы) - это методы, позволяющие определить поведение класса в отношении оператора языка. Они определяют как класс будет реагировать на то или иное действие.
Примеры таких методов:
Метод |
Описание работы |
__init__(self, other) |
Инициализация объектов класса |
__add__(self, other) |
Сложение (x + y) |
__sub__(self, other) |
Вычитание (x - y) |
__mul__(self, other) |
Умножение (x * y) |
__truediv__(self, other) |
Деление (x / y) |
__len__(self) |
Возвращение длины объекта |
__repr__(self) |
Полная информация об объекте |
21. Как работают getattr, setattr, hasattr и т.Д.? Как переопределить их стандартную реализацию для конкретного класса?
Метод __getattr__ выполняет операцию получения ссылки на атрибут. Он вызывается с именем атрибута в виде строки всякий раз, когда обнаруживается попытка получить ссылку на неопределенный атрибут.
Этот метод не вызывается, если интерпретатор может обнаружить атрибут посредством выполнения процедуры поиска в дереве наследования. Вследствие этого метод __getattr__ удобно использовать для обобщенной обработки запросов к атрибутам. Например:
class A: def __getattr__(self, attrname): if attrname == "age": return 20 else: raise AttributeError
x = A() print(x.age) print(x.name) |
20 Traceback (most recent call last): … AttributeError |
В этом примере класс A и его экземпляр x не имеют своих собственных атрибутов, поэтому при обращении к атрибуту X.age вызывается метод __getattr__ — в аргументе self передается экземпляр(X), а в аргументе attrname — строка с именем неопределенного атрибута («age»).
Родственник метода __getattr__ является метод перезагрузки __setattr__ который перехватывает все попытки присваивания значений атрибутам.
class A: def __setattr__(self, key, value): if key =='age': self.__dict__[key] = value else: raise AttributeError x = A() x.age = 40 print(x.age) x.name = 'Bob' |
40 Traceback (most recent call last): … AttributeError |
Эти два метода перезагрузки операций доступа к атрибутам позволяют контролировать или специализировать доступ к атрибутам в ваших объектах. Они могу играть весьма специфические роли.
Функция hasattr проверяет существование атрибута с именем в объекте. Возвращает True, если атрибут с именем существует, иначе False.
Пример:
class MyObj: name = 'Chuck Norris' phone = '+666111000' country = 'Norway'
# Проверим наличие атрибутов в объекте MyObj: x = hasattr(MyObj, 'phone') y = hasattr(MyObj, 'age') print(x, y) |
True, False |