如何理解python中的嵌套生成器?
我有以下代码:如何理解python中的嵌套生成器?,python,generator,Python,Generator,我有以下代码: def flat_on_level1(it, d=-1, level=None): """ >>> list(flat_on_level1([[[['a']]]], level=3)) [['a']] """ if d==-1: return list(flat_on_level1(it, d=d+1, level=level)) if d==level: return (i
def flat_on_level1(it, d=-1, level=None):
"""
>>> list(flat_on_level1([[[['a']]]], level=3))
[['a']]
"""
if d==-1:
return list(flat_on_level1(it, d=d+1, level=level))
if d==level:
return (i for i in [it])
for x in it:
yield from flat_on_level1(x, d=d+1, level=level)
我的期望与这里相同:
def flat_on_level(it, d=-1, level=None):
"""
>>> list(flat_on_level([[[['a']]]], level=3))
[['a']]
"""
if d == -1:
return list(flatt_on_level(it, d=d + 1, level=level))
if d == level:
return (i for i in [it])
res = []
for x in it:
res.extend( flat_on_level(x, d=d+1, level=level))
return res
我得到一张空名单。这是怎么回事
谢谢期待像发电机一样。我不明白。我必须在这里写更多的文字,但我认为,通过这个例子,这个问题已经足够清楚了。阅读这个
基本上,您需要迭代第二个版本以获得与调用第一个版本(具有生成器)相同的效果。Yield一次只返回一个值。你需要调用的yield是你列表长度的两倍,所以好吧,没有我得到的提示的帮助。这似乎是个不错的发电机。我的问题更多的是关于重新制定函数的策略,即一个人可以屈服于一个简单的列表,而不是我在具体中犯了什么错误
def flat_on_level(it, d=-1, level=None):
"""
>>> list(flat_on_level([[[['a']]]], level=3))
['a']
"""
if isinstance(it, dict):
y = it.values()
else:
y = it
if not isinstance(y, collections.Iterable):
yield y
else:
for x in y:
if d == level:
yield x
else:
yield from flat_on_level(x, d=d + 1, level=level)
这两个版本的代码对我来说都没有多大意义。您很少希望在同一函数中将
return
语句与yield
语句混合使用,因为return
在生成器中不能正常工作。最后一行中的x
是什么,函数应该如何工作?这是非常荒谬的,因为现在你的第二个函数调用了flatt\u on\u level()
,这显然是一个打字错误。这都是关于在注释中打拳击和咬人?