Рубрики
Без рубрики

Генерировать генераторы несколько раз

Взломать генератор для производства результатов многократно. Помечено Python, генераторы, взломать.

Генераторы великолепны. Мы все это знаем. Они спасают нас все списки памяти, которые еще не дают нам те же результаты и многое другое. Ну, почти.

Единственный улов с генераторами состоит в том, что они генерируют значения только один раз. Давайте посмотрим на пример.

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”