Зачем нам сопрограммы в питоне?
Я давно слышал о совместных процедурах, но никогда не использовал их. Как я знаю, сопрограммы похожи на генераторы.
Зачем нам нужны сопрограммы в 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()
,
Сопрограммы похожи на генераторы с некоторыми отличиями. Основными отличиями являются:
- генераторы являются производителями данных
- сопрограммы являются потребителями данных