为什么这个生成器(使用递归)不能产生直观的结果

问题描述 投票:0回答:1

我编写了一个简单的生成器函数,它接受一个可能包含子列表的列表并尝试展平列表:

所以[1,[2,3],4,[5,[6,7],8]]应该产生1,2,3,4,5,6,7,8

如果我只想打印出值(不是生成器),它看起来像这样,这有效:

#  Code A
def flatten_list_of_lists(my_list):
    for element in my_list:
        if isinstance(element, list):
            flatten_list_of_lists(element)
        else:
            print(element)

my_list = [1, [2, 3], 4, [5, [6, 7], 8]]
flatten_list_of_lists(my_list)

并按预期打印出1,2,3,4,5,6,7,8

但是,当我将代码更改为:

#  Code B
def flatten_list_of_lists(my_list):
    for element in my_list:
        if isinstance(element, list):
            flatten_list_of_lists(element)
        else:
            yield element

for i in flatten_list_of_lists(my_list):
    print(i)

这只是将打印切换到产量,程序只打印出1,4。

我会在下面粘贴实际可行的代码。但我想知道为什么以前的代码不起作用?如果代码A'正确打印'数字,为什么代码B'没有正确地'产生'数字?

好像我对生成器如何处理递归有一个基本的误解。

这段代码实际上有效:

#  Code C
def flatten_list_of_lists_v2(my_list):
    for element in my_list:
        if isinstance(element, list):
            for sub_element in flatten_list_of_lists_v2(element):
                yield sub_element
        else:
            yield element

l = []
for element in flatten_list_of_lists_v2(my_list):
    print(element)

打印出1,2,3,4,5,6,7,8

只是一点点背景,我刚看完这个视频:https://www.youtube.com/watch?v=LelQTPiH3f4

在那里,他解释了当你设计你的发电机时,只需要打印一个你想要产生的印刷品,看看你是否得到了正确的结果,然后只需将印刷品切换到产量。所以我猜他的建议并不适用于所有情况,我只想了解原因。

python recursion generator
1个回答
6
投票

一个简单的错误 -

def flatten_list_of_lists(my_list):
    for element in my_list:
        if isinstance(element, list):
            # add yield from
            yield from flatten_list_of_lists(element)
        else:
            # yield, not print
            yield element

my_list =  [1, [2, 3], 4, [5, [6, 7], 8]]

for e in flatten_list_of_lists(my_list):
  print(e)

产量

1
2
3
4
5
6
7
8
© www.soinside.com 2019 - 2024. All rights reserved.