Кодирование сопрограммы в Python для отображения «нечетных» и «четных» чисел бесконечно - PullRequest
0 голосов
/ 29 июня 2009

У меня есть колючие идеи генераторов, итераторов и сопрограмм. (из ПКП и других учебных пособий). Я хочу реализовать сопрограмму, в которой рутина 1 будет печатать нечетные, а рутина 2 будет печатать четные числа бесконечно, например:

routine1:
    print odd
    yield to routine2

routune2:
    print even
    yield to routine1

Имеют некоторые грубые представления о коде, который должен это делать, но не в состоянии привести его в форму. Я не хочу код. Но я был бы признателен за указатели стиля псевдокода для того же. Спасибо.

Ответы [ 2 ]

2 голосов
/ 29 июня 2009

PEP 342 , «Сопрограммы с помощью улучшенных генераторов», приводит в качестве примера 3 «Простой планировщик сопрограмм или« батут », который позволяет сопрограммам« вызывать »другие сопрограммы, получая сопрограмму, которую они хотят ссылаться. - вам не нужно много общности (или какого-либо из аспектов общности, впервые введенных в PEP 342), для этой очень специфической задачи, учитывая, что сопрограммы ничего не сообщают друг другу, их всего два, их порядок последовательность абсолютно регулярна, нет завершения и т. д. и т. д. ... но небольшое подмножество этого кода все еще стоит реализовать, поскольку оно показывает вам больше о сопрограммах, чем этот чрезвычайно простой пример сам по себе.

Две сопрограммы, вероятно, должны быть двумя экземплярами одной и той же функции генератора, отличающейся только начальной точкой (нет смысла писать, что while True: повторяется дважды, учитывая простоту его тела ;-). Как вы увидите, интересной частью является батут, хотя вы можете и должны сделать его намного проще, чем общий в PEP 342.

1 голос
/ 29 июня 2009

Вы возвращаетесь к методу, который вызвал вас. Следовательно, вы не можете уступить рутине 1. Вы просто уступаете. Вы можете позволить подпрограмме 1 вызывать подпрограмму 2, а подпрограмма 2 может дать результат и, следовательно, вернуться к подпрограмме 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...