使用生成器函数可以使你的示例更易于阅读,并可能提高性能。
Python 2
def flatten(l): for el in l: if isinstance(el, collections.Iterable) and not isinstance(el, basestring): for sub in flatten(el): yield sub else: yield el
我使用了2.6中添加的Iterable ABC。
Python 3
在Python 3中,basestring是没有更多的,但你可以使用一个元组str,并bytes得到同样的效果存在。
该yield from运营商从一时间产生一个返回的项目。这句法委派到子发生器在3.3加入
def flatten(l): for el in l: if isinstance(el, collections.Iterable) and not isinstance(el, (str, bytes)): yield from flatten(el) else: yield el



