Синтаксис назначения (выражение «yield») позволяет обрабатывать генератор как рудиментарный сопроцесс.
Сначала предлагается в PEP 342 и задокументирован здесь: https : //docs.python.org/2/reference/expressions.html#yield-expressions
Клиентский код, который работает с генератором, может передавать данные обратно в генератор, используя его send()
. Эти данные доступны через синтаксис присваивания.
send()
также будет выполнять итерацию - поэтому он фактически включает вызов next()
.
Используя ваш пример, это то, что было бы например, использовать функциональность couputine:
>>> def test1(x):
... for i in x:
... _ = yield i
... yield _
...
>>> l = [1,2,3]
>>> gen_instance = test1(l)
>>> #First send has to be a None
>>> print gen_instance.send(None)
1
>>> print gen_instance.send("A")
A
>>> print gen_instance.send("B")
2
>>> print gen_instance.send("C")
C
>>> print gen_instance.send("D")
3
>>> print gen_instance.send("E")
E
>>> print gen_instance.send("F")
Traceback (most recent call last):
File "", line 1, in
StopIteration
Обратите внимание, что некоторые из них теряются из-за второго yield
в каждой итерации цикла, которая не фиксирует отправленные данные.
EDIT: Забыл объяснить None
s, приведенные в вашем примере.
Из https://docs.python.org/2/reference/expressions.html#generator.next :
Когда функция генератора возобновляется с помощью метода next (), текущее выражение yield всегда принимает значение None.
blockquote>
next()
используется при использовании синтаксиса итерации.
Википедия дает хорошее объяснение логики букв дисков:
За исключением CP / M и более ранних версий MS-DOS, операционные системы назначают буквы дисков в соответствии со следующим алгоритм:
Это - перенесенный от исходных проектов ПК. Первоначально ПК только имели до 2 дисководов для гибких дисков, маркировал A и B. Некоторое время спустя жесткие диски были добавлены и стали диском C.
Буква жесткого диска - C, потому что исторически диски A и B были для дискет. Это не имеет ничего общего с языком, на котором написана операционная система.
Потому что A и B раньше были дисководами для гибких дисков назад в дни, когда дисководы для гибких дисков были нормой и не было никаких жестких дисков. Буква C была дана любому жесткому диску, который установил пользователь. Диски A и B были с тех пор зарезервированы для дисководов для гибких дисков. Это не имеет никакого отношения к языкам программирования.
А, гибкие диски, помните те?
Вы могли бы потратить целый день на написание своего последнего приложения-убийцы, а потом обнаружить, что не смогли сохранить его, потому что оно было слишком большим, чтобы поместиться на 5,25-дюймовом Плотность диска.
Это было тогда, когда дискеты действительно были гибкими. Тонкие и хрупкие, обычно размером 5,25 или 8 дюймов, хотя первые внутренние накопители в ПК были 5,25 дюйма. Как упоминалось ранее, ранние версии MS Dos использовались для автоматического назначения диска A: первому дисководу гибких дисков и B: второму. Жесткие диски даже тогда не вписывались в ПК. Вы можете купить винчестерский жесткий диск емкостью 5 МБ, который весит около 30 кг и поставляется в большом внешнем корпусе размером почти с современный мини-компьютер с башней.
Если на вашем ПК установлены двойные дискеты, вы можете набрать команду типа «копировать a: b:», чтобы скопировать содержимое диска A: на диск B:
Но тогда все это вернулось во времени когда Билл Гейтс стоил около 10000 долларов!
Я сказал бы, что это потому что A: и B: диски были традиционно дисководами для гибких дисков, и ранние компьютеры потребовали, чтобы Вы загрузили использование диска загрузочного диска.
я сильно сомневаюсь, имеет ли надпись какое-либо отношение к языкам программирования.
Думайте, что DOS работал от дисковода для гибких дисков, и окна основывались на DOS, продолжал ту же конвенцию буквы диска...
Я думаю, что это своего рода наследие от старых версий операционных систем Microsoft, где буквы A и B были назначены для дисковода гибких дисков.
*But why the letter "C"? Why not "A" or "B"? Why not "Z?"*
Неудивительно, ответ заключается в старых корнях DOS Microsoft. Задолго до того, как Windows существовал, самые совместимые с ПК компьютерные системы имели только один дисковод в нем - дисковод для гибких дисков. В то время пользователи вставили бы свой гибкий диск DOS в компьютер непосредственно перед тем, как они включили его, и компьютер запустится или "загрузится" с помощью программного обеспечения на дискете. Как первое и часто только дисковод, установленный в компьютере, гибкому диску присвоили первая буква алфавита.