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
Использование генераторов имеет несколько преимуществ:
- Экономия памяти: генераторы позволяют постепенно создавать значения вместо того, чтобы хранить их все в памяти сразу. Это может быть полезно, если вы работаете с большими объемами данных.
- Ленивая итерация: генераторы позволяют лениво производить значения по запросу, что может быть полезно, если вы работаете с дорогостоящими операциями, например, с сетевыми запросами.
- Читабельность: использование генераторов может сделать код более читабельным, так как он может представлять последовательность значений в более естественной форме.