10.25 Итераторы
Итераторы
Функция-генератор и yield
напишите генератор, выдающий очередное значение суммы ряда $$ \sum_(i=1)^n 1/i^2 $$, начиная с первого элемента
Циклический конструктор и его использование, зачем нужен
Посчитать однострочником сумму из предыдущего упражнения для N=10000
Параметрический генератор, .send()
Пример как из лекции
напишите генератор walk2d(), который "обходит координатную плоскость" с заданным приращением координат, а именно:
выдает последовательность пар x,y, начиная с 0,0 и продолжая прибавлением к предыдущей паре dx (к x) и dy (к y)
значение приращения получает через send((dx,dy))
Немного об itertools
Для последовательности из первого упражнения, выведите первые 10 элементов, превышающие 1.6 (использовать dropwhile())
- Комбинаторика
как работает
Вывести при помощи product() все названия клеток шахматной доски
yield from
пример filterfalse() с делимостью на n, а не на 2
Напишите генератор repeater(seq, n), который n раз повторяет каждый элемент последовательности seq (использовать repeat())
Д/З
Ещё раз посмотреть как оформляются тесты к заданию типа «написать функцию»
- Оформить решения и не менее трёх тестов для каждой задачи
Задача_1
Числа Фибоначчи - последовательность, начинающаяся с 1, 1, и продолжающаяся так, что очередной элемент равен сумме двух предшествующих элементов.
написать генератор-функцию fib(m, n), возвращающую итератор по n числам Фибоначчи, начинаю с m-го, в нумерации с 0
- Тест:
1 print(*fib(4, 5))
- Вывод:
5 8 13 21 34
Задача_2. Скользящее окно (на yield from)
написать генератор-функцию slide(seq, n), которая получает на вход последовательность A0, A1 … , An, …, а на выходе выдаёт итератор
A0, A1 … , An-1,
A1, A2 … An,
A2, A3 … An+1
- …
и т. д., т. е. выдаёт содержимое «окна» длины не более n, сдвигает его на одну позицию, и снова выдаёт. Итерация заканчивается, когда окно оказывается пустым
Нам помогут itertools.islice(), itertools.tee() и yield from!
- Тест:
1 print(*list(slide(range(5), 3)))
- Вывод:
0 1 2 1 2 3 2 3 4 3 4 4
Задача_3: Священные надписи (itertools; на комбинаторику, с естественной формулировкой):
поклонники бога Тора используют в своих надписях три буквы: T, O, R. Надпись считается священной, если имя бога (подстрока "TOR") входит в неё ровно два раза
- напишите программу-однострочник, которая при помощи itertools и filter формирует все священные надписи заданной длины, причём в алфавитном порядке
Input (1):
6
Output (1):
TORTOR
Input (2):
7
Output (2):
OTORTOR, RTORTOR, TOROTOR, TORRTOR, TORTORO, TORTORR, TORTORT, TORTTOR, TTORTOR