Пишем итератор

Сегодня проходил техническое интервью по python. Вообще с этим всё сложно :) Python люблю, условно 50% задач уровня medium на leetcode я успешно решаю в разумные сроки, но при этом есть ряд тем, в которых я вообще никак - например многопоточность и асинхронность. Ну и в теоретических вопросах, в правильной терминологии могу ошибаться - просто потому что дата инженеров спрашивают в основном SQL, а по python обычно дают какую нибудь простенькую задачу. Задачи и в этот раз были несложные, но вот вопрос про итераторы/генераторы поставил в тупик.

Услышав про генераторы, написал такую конструкцию - [x*x for x in range(10)] - мол, вот генератор списка для примера. А про итераторы сказал что это функции с оператором yield, которые при повторном вызове продолжают выполнение с этого места. Это было близко, но не то.

То что я написал - это list comprehension (генератор списка), а не generator. А iterator (итератор) - это объект, в котором реализованы методы iter() и next(), которые позволяют обойти все элементы коллекции. Generator (генератор) - это более простой способ создать iterator используя ключевое слов yield.

Дальше была задача написать бесконечный генератор чисел Фибоначи. Говорю - надо посмотреть синтаксис yield, вообще не помню как его использовать. Ответ понравился - просто пишешь, чтобы функция печатала эти числа, а потом все print(x) заменить на yield x. Всё, в таком варианте сразу запомнил синтаксис железно :)

Written on May 3, 2024