Python Glossary English

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Сообщить о неточности