Зачем нам сопрограммы в питоне?

Я давно слышал о совместных процедурах, но никогда не использовал их. Как я знаю, сопрограммы похожи на генераторы.

Зачем нам нужны сопрограммы в Python?

2 ответа

Решение

Генератор использует yield для возврата значений. Функции генератора Python могут также потреблять значения, используя (yield) заявление. Кроме того, два новых метода на объектах генератора, send() а также close()создать структуру для объектов, которые потребляют и производят значения. Функции генератора, которые определяют эти объекты, называются сопрограммами.

Сопрограммы потребляют значения, используя (yield) утверждение следующее:

value = (yield)

С этим синтаксисом выполнение приостанавливается в этом операторе, пока метод send объекта не будет вызван с аргументом:

coroutine.send(data)

Затем выполнение возобновляется, причем значение присваивается значению данных. Чтобы сообщить об окончании вычисления, мы закрыли сопрограмму, используя close() метод. Это вызывает исключение GeneratorExit внутри сопрограммы, которое мы можем отловить с помощью выражения try/ исключением.

Пример ниже иллюстрирует эти понятия. Это сопрограмма, которая печатает строки, соответствующие заданному шаблону.

def match(pattern):
    print('Looking for ' + pattern)
    try:
        while True:
            s = (yield)
            if pattern in s:
                print(s)
    except GeneratorExit:
        print("=== Done ===")

Мы инициализируем его шаблоном и вызываем __next__() начать выполнение:

m = match("Jabberwock")
m.__next__()
Looking for Jabberwock

Призыв к __next__() вызывает выполнение тела функции, поэтому выводится строка "Looking for jabberwock". Выполнение продолжается до утверждения line = (yield) встречается. Затем выполнение приостанавливается и ожидает отправки значения в m. Мы можем отправить значения с помощью send(),

Сопрограммы похожи на генераторы с некоторыми отличиями. Основными отличиями являются:

  1. генераторы являются производителями данных
  2. сопрограммы являются потребителями данных

Вы можете посмотреть здесь для деталей

Другие вопросы по тегам