Преобразовать доходность в списке - PullRequest
0 голосов
/ 30 марта 2020

У меня есть этот код:

def sumto(n, lst):
    if not n and not lst:  # base case 1: empty list = 0
        yield []
        return
    if n < 0 or not lst:  # base case 2: unsolvable
        return
    head, *tail = lst
    for sol in sumto(n-head, tail):  # recursion 1: use first element
        yield [head] + sol
    yield from sumto(n, tail)  # recursion 2: don't use first element

И я хотел бы преобразовать yield в список. Как я могу это сделать? Так что я просто хочу не использовать доходность, но, например, my_list.append

1 Ответ

3 голосов
/ 30 марта 2020

Это эквивалентно:

def sumto(n, lst):
    result = []
    if not n and not lst:
        result.append([])
        return result
    if n < 0 or not lst:
        return result
    head, *tail = lst
    for sol in sumto(n-head, tail):
        result.append([head] + sol)
    result.extend(sumto(n, tail))
    return result

Следующие правила могут применяться довольно широко для преобразования функции генератора в функцию, возвращающую list:

return
# =>
return result
# also think of an implicit "return" at the end of the generator function

yield x
# => 
result.append(x)

yield from x
# => 
result.extend(x)

Как правило, однако , вы должны стремиться изменить свой код наоборот. Генераторы - один из лучших Python. Они позволяют вам перебирать все элементы, не удерживая их все в памяти, они только выполняют работу по генерации, пока вы не найдете то, что ищете. А если вам нужен список, просто позвоните им list(...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...