Что означает выражение "a = yield from f()"?
Итак, вот выражение Python:
a = yield from f()
Что это значит? Где это можно использовать? Какой объект должен f
быть? Какова будет ценность a
после выражения оценивается?
Здесь есть несколько вопросов о стекловом потоке о питоне yield
а также yield from
но я не нашел ответа на это.
Я понимаю смысл yield x
, y = yield
а также y = yield x
, Четное yield from f()
более или менее понятно. Но a = yield from f()
это что-то неожиданное для меня.
ОБНОВИТЬ:
Б. Барбьери дал правильный ответ. И все же мне нужно сформулировать это немного по-другому.
Семантика выражения a = yield from f()
очень похоже на вызов функции: значение a
будет что f()
возвращается. Но если f()
дает что угодно, полученное значение будет перенаправлено на "верхний уровень" (вы можете только написать a = yield from f()
внутри функции, и это заставит вас функционировать генератор). Если после этого "верхний уровень" отправляет значение обратно в ваш генератор, оно будет переадресовано f()
и f()
будет продолжать.
yield from
позволяет f()
и "верхний уровень" для общения во время работы вашей функции.
Я думаю, теперь я понимаю, что это yield from
все, и надеюсь, что это объяснение будет полезно для других.
2 ответа
Вот очень простой пример (yield from
может использоваться только внутри функции)
def f():
for i in range(2):
yield i
return 3
def g():
a = yield from f()
print('a = {}'.format(a))
for item in g():
print(item)
# output:
# 0
# 1
# a = 3
a
присваивается значение функции f()
return
s. генератор g
дает все промежуточные результаты.
f
должен быть генератором (то, чтоyield
с).a
будет просто задано возвращаемое значениеf()
Согласно документации:
f
должен быть генератор (что неудивительно)f
должен вернуться (и не только уступить)f
следует принять значение отsend
с помощьюsome_var = yield
a
получит значение, возвращаемоеf
Вот f
пример:
def f():
while 1:
x = yield
if next is None:
return "something"
do_something_with_recieved_value(x)
Учитывая генератор g
:
l = []
def g():
while True:
a = yield from f()
l.append(a)
- всякий раз, когда
f
возвращается, возвращенное значение помещается вl
- каждое значение отправить
g
с помощьюsend
будет перенаправленf
Примечание: вам нужно запустить генератор, прежде чем send
это что-то.
o = g()
next(o) # Ensure the accumulator is ready to accept values
Я не проверял все, не стесняйтесь комментировать, если что-то неясно.