Генераторы в Python


Начальное замечание

Прежде чем читать этот блог, я хочу четко заявить, что этот блог написан полностью на основе моего понимания того, как работают генераторы в python. Чтобы двигаться дальше, вы должны быть промежуточным специалистом в python.

Итераторы

Объект, содержащий счетное количество значений. Доступ к следующему значению можно получить с помощью параметра next(имя_объекта).

Подробнее об итераторах вы можете узнать здесь: Итераторы от W3 Schools

Кейс

Допустим, вы работаете в компании, и ваша компания дает вам задание написать программу для нахождения ряда чисел. Каждое число отличается от предыдущего на 12. Таким образом, серия имеет вид: [12,24,36,48…..]

Вы должны найти серию до числа, заданного пользователем, и сохранить результаты где-то, чтобы другие могли получить эти значения с помощью цикла.

Так, если пользователь введет 10, программа вернет серию, например: 12,24,36,……..,120

Вы будете как: Хорошо, это просто.

def gen_series():
    n = int(input("What's n? "))
    a = []
    d = 11
    for i in range(1, n+1):
        a.append(i + d)
        d += 11
    return a

if __name__ == "__main__":
    print(gen_series())
Вход в полноэкранный режим Выйти из полноэкранного режима

Теперь ваша программа работает хорошо, если пользователь вводит такие числа, как 12, 23, 89, 74.

Если вы сами протестируете этот код и введете число типа 10000000000000000000, что произойдет?
Ваш код начнет зависать, программа не будет работать плавно. Таким образом, это не лучший подход для получения серии чисел.

Давайте немного рефакторим этот код

def gen_series():
    n = int(input("What's n? "))
    a = series(n)
    print(a)

def series(n):
    a = []
    d = 11
    for i in range(1, n+1):
        a.append(i + d)
        d += 11
    return a

if __name__ == "__main__":
    gen_series()
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь программа работает так же, но наша проблема еще не решена. Мы хотим сгенерировать серию чисел, каждое из которых отличается от предыдущего на 12, и мы хотим, чтобы наша программа генерировала столько чисел, сколько нам нужно.

Попробуйте запустить этот код:

def gen_series():
    n = int(input("What's n? "))
    a = series(n)
    print(a)


def series(n):
    d = 11
    for i in range(1, n+1):
        yield i + d
        d += 11


if __name__ == "__main__":
    gen_series()
Войти в полноэкранный режим Выйти из полноэкранного режима

Если вы запустите этот код и введете число 20, вы увидите результат <generator object series at 0x0000020B20684350>. Теперь, если вы запустите программу снова и введете большое число, например 100000000000000000, вы заметите, что ваша программа не отстает. Она работает совершенно нормально, и вы получаете результат.

Ключевое слово yield отвечает за то, чтобы сделать эту функцию генератором.

Функция series теперь является функцией-генератором, которая генерирует итератор. Если вы читали статью W3 Schools, то наверняка знаете, что мы можем легко получить доступ к значениям из итератора с помощью цикла.

Итак, вот определение генераторов

Генераторы

Генераторы — это такие функции, которые возвращают итератор.

Возвращаемся к программе

Теперь для печати значений ряда мы можем использовать другую функцию

def print_series():
    a = gen_series()
    for i in a:
        print(i)
Вход в полноэкранный режим Выйти из полноэкранного режима

Полный код:

def gen_series():
    n = int(input("What's n? "))
    a = series(n)
    print(a)
    return a


def print_series():
    a = gen_series()
    for i in a:
        print(i)


def series(n):
    d = 11
    for i in range(1, n+1):
        yield i + d
        d += 11


if __name__ == "__main__":
    print_series()
Вход в полноэкранный режим Выход из полноэкранного режима

Заключение

  • Генераторы — это функции, которые возвращают итератор
  • Мы можем превратить обычную функцию в генератор с помощью ключевого слова yield.

Если вы не поняли, то не забудьте покритиковать меня в комментариях. Это поможет мне придумать лучшее объяснение. Не стоит критиковать меня, если я зря потратил ваше время. Также если у вас есть вопросы, пожалуйста, задавайте их в комментариях.

Оцените статью
devanswers.ru
Добавить комментарий