Генераторы великолепны. Мы все это знаем. Они спасают нас все списки памяти, которые еще не дают нам те же результаты и многое другое. Ну, почти.
Единственный улов с генераторами состоит в том, что они генерируют значения только один раз. Давайте посмотрим на пример.
def generate_numbers(num): while num > 0: yield num num -= 1
Функция выше дает нам генератор. Требуется номер как аргумент и производит все номера оттуда до 1.
generate5 = generate_numbers(5)
Если мы распечатаем Generate5
Это покажет нам, что он проводит генератор.
print(generate5) >>>
Теперь мы можем сделать что-то вроде следующего для создания чисел:
for number in generate5: print(number)
И это будет печать:
5 4 3 2 1
Но Если вы запустите его снова
for number in generate5: print(number)
Вы не увидите никакого вывода.
Ну, это то, что генераторы делают. Они генерируют значения на лету, а затем остановитесь. Вы не можете запустить их снова и снова, если вы не запустите Generate5 (5)
каждый раз. Вообще люди скажут вам в таких случаях, как это необходимо использовать список.
Но есть способ, если вы настаиваете на использовании генераторов, но хотите повторные выходы. Давайте посмотрим, как.
class NumberGenerator: def __init__(self, num): self.num = num def __iter__(self): count = self.num while count > 0: yield count count -= 1
Код из generate_numbers
Функция копируется над (ну почти с небольшим классом, связанным с модификациями) к __er____
Метод для Numbrenerator
класс. Всякий раз, когда мы зацикливаемся через объект, он смотрит на __er____
метод. Если он там, Python будет использовать его для возврата итератора.
Итак, теперь вы можете сделать что-то подобное, чтобы создать внимание класса:
generate5 = NumberGenerator(5)
А затем зацикливаться на нем столько раз, сколько вы хотите использовать:
for number in generate5: print(number)
Обратите внимание, что это не может быть оптимальной вещью, чтобы сделать все время Но это интересный тидбит, чтобы узнать, что вы можете взломать генератор таким способом работать более одного раза.
Счастливый взлом!
Этот пост был изначально опубликован здесь
Оригинал: “https://dev.to/billah_tishad/generate-generators-repeatedly-2jd8”