Генератор Python для получения всего из другого вызова генератора

У меня есть генератор Python, который может вызывать сам себя, чтобы получить больше элементов, чтобы уступить. Это выглядит так:

def gen(list):
    # ...
    if list:
        for x in gen(list[1:]):
            yield x

Мой вопрос касается последних двух строк: есть ли более сжатый способ выразить это? Я надеюсь на что-то подобное (понимая, что это недействительный Python как есть):

def gen(list):
    # ...
    if list:
        yield each in gen(list[1:])
17
задан John Zwinck 6 June 2011 в 20:28
поделиться

2 ответа

В Python 3.3 добавлено ключевое слово yield from . Вот сравнение между тем, что у вас есть, и кодом, использующим новое ключевое слово:

yield_from_test.py:

def gen_for(a_list):
    if a_list:
        yield a_list[0]
        for x in gen_for(a_list[1:]):
            yield x

def gen_yield(a_list):
    if a_list:
        yield a_list[0]
        yield from gen_yield(a_list[1:])

if __name__ == '__main__':
    assert list(gen_for([1,2,3])) == list(gen_yield([1,2,3]))
    print(list(gen_yield([1,2,3])))

» python3 yield_from_test.py [1, 2, 3]

4
ответ дан 30 November 2019 в 12:05
поделиться

Ваш пример кода очень идиоматичен и лаконичен, нет необходимости и никакой реальной возможности для дальнейших улучшений, особенно когда речь идет о читабельности.

5
ответ дан 30 November 2019 в 12:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: