Все слайды тут.
- В Питоне можно итерировать по объектам разных классов.
- Общее у этих разных классов то, что все они итерируемые (iterables).
- Чтобы сделать итерируемый класс, достаточно реализовать в нем «магический» метод
__iter__
, который будет возвращать итератор.
- Чтобы сделать итератор, нужно сделать класс с двумя «магическими» методами. Метод
__next__
будет возвращать объект, который нужно вернуть следующим, метод__iter__
будет возвращать итератор (то есть, например,self
). - Интересность заключается в том, что правило, по которому
__next__
возвращает следующий объект, можно задать произвольно. - Когда элементы закончились, нужно кинуть исключение
StopIteration
.
- Это пример итератора, который, начиная с конца, в качестве следующего элемента возвращает предыдущий по порядку.
- А это пример итерируемого класса. Когда мы его объект будем проходить с помощью
for in
, элементы будут возвращаться в обратном порядке (конечно, достичь той же цели можно и другими способами). - Стоит потренироваться писать свои итераторы. Сделать не трудно, а на собеседованиях спрашивают.
- Генераторы задумывались как синтаксический сахар, который позволяет не писать неудобные
__iter__
и__next__
.
- О генераторах полезно думать, как о функциях, которые запонимают свое состояние во время выхода.
- Так, функция с двумя идущими подряд операторами
yield
при первом выозове остановится на первом, а при втором — на втором.
- Generator expressions — это более короткий способ написать генератор.
- Еще существует
items()
. - Главная причина использовать dict views — это то, что они не копируют ни ключи, ни элементы словаря, когда вы их вызываете.
- То, что
sort()
сортирует «на месте» в том числе означает, что самаsort()
возвращаетNone
и при этом модифицирует список. - Алгоритм, который Питон использует для сортировки, называется Timsort. Он является производным от Mergesort.