Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 1, 2012 19:57:43

vkopey
От:
Зарегистрирован: 2010-09-26
Сообщения: 116
Репутация: +  3  -
Профиль   Отправить e-mail  

Сопрограммы

Пожалуйста, прокомментируйте, как это работает (#1, #2)

def coroutine(): # сопрогамма
    while True:
        yield (yield)
corObj=coroutine()
corObj.next() #1
print corObj.send(1) #2
corObj.next()
print corObj.send(2) 
corObj.next()
print corObj.send(3)
corObj.close()



Офлайн

#2 Апрель 1, 2012 21:19:25

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Сопрограммы

Генератор каждый раз возвращает то, что ему передали. Странный код, к слову.



Офлайн

#3 Апрель 1, 2012 21:28:03

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Сопрограммы

Все подробно расписано в PEP 255 - Simple Generators
и в PEP 342 - Coroutines via Enhanced Generators
про send (в разделе Specification: Sending Values into Generators)

#1 - нужно чтобы иметь возможность начать отправлять генератору значения отличные от None
next() - тоже самое, что send(None)

#2 - Отправляет значение в генератор

Вот еще пример:

# -*- coding: utf-8 -*-
def coroutine():
    while True:
        a = (yield) or 12345
        b = (yield) or 54321
        yield (a + b) * 10
        
        
corObj=coroutine()
print 'next()', corObj.next()
print 'send(1)', corObj.send(1) # a = 1
print 'send(2)', corObj.send(2) # b = 2 и выведет результат 30
print 'next()', corObj.next() # None
print 'next()', corObj.next() # None
print 'next()', corObj.next() # 666660

Отредактировано reclosedev (Апрель 1, 2012 21:28:26)

Офлайн

#4 Апрель 1, 2012 21:29:04

vkopey
От:
Зарегистрирован: 2010-09-26
Сообщения: 116
Репутация: +  3  -
Профиль   Отправить e-mail  

Сопрограммы

Я просто эксперементирую с генераторами.
Меня интересует, как здесь работает метод corObj.next()

Сейчас понял. Спасибо!



Отредактировано vkopey (Апрель 1, 2012 21:32:43)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version