Python 3.3+Итераторы и генераторыпонятие
yield from
генераторы
Делегирует yield другому генератору или итерируемому. Упрощает вложенные генераторы.
Синтаксис
yield from iterable
Это не просто сокращение для цикла с yield: yield from пробрасывает во вложенный генератор send() и throw(), а значение из его return становится результатом самого выражения yield from. Ради обычного перебора экономия невелика, а вот для сопрограмм и рекурсивного обхода (дерево, вложенные списки) — именно то, ради чего конструкцию добавили в Python 3.3.
Примеры
def chain(*iterables):
for it in iterables:
yield from it
print(list(chain([1,2],[3,4],[5]))) # → [1,2,3,4,5]
def flatten(lst):
for item in lst:
if isinstance(item, list):
yield from flatten(item)
else:
yield item
print(list(flatten([1,[2,[3,4]],5]))) # → [1,2,3,4,5]
def gen_a():
yield 1; yield 2
def gen_b():
yield from gen_a()
yield 3
print(list(gen_b())) # → [1,2,3]
# yield from с range
def gen_range(n):
yield from range(n)
print(list(gen_range(5))) # → [0,1,2,3,4]
# yield from возвращает значение (return в под-генераторе)
def sub():
yield 1; yield 2
return 'done'
def main():
result = yield from sub()
print('sub returned:', result) # → done
list(main()) # → [1,2]
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности