Метод send()
управляет тем, что будет иметь значение слева от выражения yield.
Чтобы понять, как отличается выход и какое значение оно имеет, давайте сначала быстро обновить код заказа python оценивается.
Python оценивает выражения слева направо. Обратите внимание, что при оценке присваивания правая часть оценивается перед левой стороной.
blockquote>Итак, сначала оценивается правая часть
a = b
.Как показано ниже,
a[p('left')] = p('right')
сначала оценивается правая сторона.>>> def p(side): ... print(side) ... return 0 ... >>> a[p('left')] = p('right') right left >>> >>> >>> [p('left'), p('right')] left right [0, 0]
Что дает выход ?, выход, приостановка выполнения функции и возврат к вызывающей стороне, а также возобновление исполнение в том же месте, которое оно остановило до приостановки.
Где именно приостановлено исполнение? Возможно, вы уже догадались, что выполнение приостановлено между правой и левой стороной выражения yield. Таким образом,
new_val = yield old_val
выполнение останавливается на знаке=
, а значение справа (которое перед приостановкой, а также значение, возвращаемое вызывающему абоненту) может быть чем-то иным, чем значение слева (которое значение, назначенное после возобновления выполнения).
yield
дает 2 значения, один направо и другой влево.Как вы управляете значением в левой части выражения yield? с помощью метода
.send()
.Значение выражения yield после возобновления зависит от метода, который возобновил выполнение. Если используется
blockquote>__next__()
(как правило, с помощью встроенного в for илиnext()
), результатом является None. В противном случае, если используетсяsend()
, результатом будет значение, переданное этому методу.