Ben*_*uch 0 python recursion generator
我编写了一个简单的生成器函数,该函数接受一个可能包含子列表的列表,并尝试展平该列表:
因此[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)
Run Code Online (Sandbox Code Playgroud)
并按预期打印出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)
Run Code Online (Sandbox Code Playgroud)
只是将打印转换为成品,程序仅打印出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)
Run Code Online (Sandbox Code Playgroud)
并打印出1,2,3,4,5,6,7,8
只是一点点背景,我就看完了这个视频:https : //www.youtube.com/watch?v=LelQTPiH3f4
在其中,他解释了在设计发生器时的方法,只需将打印件放到要打印的位置,然后查看是否获得正确的结果,然后将打印件切换为打印即可。所以我想他的建议在所有情况下都行不通,我只想了解原因。
一个简单的错误-
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)
Run Code Online (Sandbox Code Playgroud)
输出量
1
2
3
4
5
6
7
8
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
40 次 |
| 最近记录: |