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

Генератор yield в Python: как работает и примеры использования

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

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

В этой статье мы рассмотрим, как использоватьyield в Python и как он работает.

Генераторы создаются с помощью ключевого слова yield. Это ключевое слово используется вместо return для возврата значения. Однако, в отличие от return, yield не завершает выполнение функции, а сохраняет состояние выполнения функции, чтобы она могла продолжать работать снова с того же места, где она была приостановлена.

Как работает yield в Python

Рассмотрим простой пример работы yield в Python. Генератор, который возвращает последовательность чисел:

def generate_numbers(n):
    for i in range(n):
        yield i

В этом примере функция generate_numbers() превращается в генератор, который производит числа от 0 до n-1. Каждый раз, когда генератор вызывается, он возвращает следующее значение из последовательности с помощью ключевого слова yield.

Вот как можно использовать этот генератор:

for num in generate_numbers(5):
    print(num)

Этот код напечатает:

0
1
2
3
4

Примеры использования yield

1) Генерация чисел Фибоначчи

1) Генерация чисел Фибоначчи

def fibonacci_sequence(n):
    a, b = 0, 1
    for i in range(n):
        yield a
        a, b = b, a + b

for num in fibonacci_sequence(10):
    print(num)

#0
#1
#1
#2
#3
#5
#8
#13
#21
#34

В этом примере функция fibonacci_sequence() определяет генератор, который генерирует последовательность чисел Фибоначчи до n. Каждый раз, когда вызывается yield, функция приостанавливает свою работу и возвращает значение. Этот генератор можно использовать в цикле for, чтобы распечатать числа в последовательности.

2) Фильтрация элементов списка генераторм

def filter_list(lst):
    for item in lst:
        if item % 2 == 0:
            yield item

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = list(filter_list(numbers))
print(even_numbers)

#[2, 4, 6, 8, 10]

Здесь функция filter_list() является генератором четных элементов списка. При каждом вызове yield, функция приостанавливает свою работу и возвращает значение. Этот генератор можно использовать для создания нового списка, содержащего только четные числа из оригинального списка.

3) Генератор строк

def string_generator(text):
    for word in text.split():
        yield word

text = "Python is a high-level programming language"
for word in string_generator(text):
    print(word)

#Python
#is
#a
#high-level
#programming
#language

Этот код создает генератор, который разбивает входной текст на слова и возвращает их по одному. Функция string_generator использует yield для возврата каждого слова в тексте.

4) Генератор случайных чисел

import random

def random_numbers(count):
    for i in range(count):
        yield random.randint(1, 10)

for num in random_numbers(5):
    print(num)

#6
#1
#9
#1
#2

В этом примере мы создали генератор случайных чисел от 1 до 10. Функция random_numbers использует yield для возврата случайного числа каждый раз, когда она вызывается.

Преимущества использования yield

Использование генераторов имеет несколько преимуществ:

  • Экономия памяти: генераторы позволяют постепенно создавать значения вместо того, чтобы хранить их все в памяти сразу. Это может быть полезно, если вы работаете с большими объемами данных.
  • Ленивая итерация: генераторы позволяют лениво производить значения по запросу, что может быть полезно, если вы работаете с дорогостоящими операциями, например, с сетевыми запросами.
  • Читабельность: использование генераторов может сделать код более читабельным, так как он может представлять последовательность значений в более естественной форме.

Содержание: