__metaclass__ = type
def flatten(nested):
for sublist in nested:
for element in sublist:
yield element
这个函数首先迭代提供的嵌套列表中的所有子列表,然后按顺序迭代列表中的元素。yield语句是新知识,任何包含yield语句的函数都称为生成器。它不像return那样返回值,而是每次产生多个值。每次产生一个值,函数就会被冻结:即函数停在那点等待被激活,函数被激活后就从停止的那点开始执行。
接下来可以通过在生成器上迭代来使用所有的值:
>>> nested = [[1,2],[3,4],[5]]
>>> for num in flatten(nested):
print num
1
2
3
4
5
2.2 递归生成器
上面的例子中只能处理两层嵌套,如果不知道有多少层嵌套呢?我们就要求助于递归了:
__metaclass__ = type
def flatten(nested):
try:
for sublist in nested:
for element in sublist:
yield element
except TypeError:
yield nested
当flatten被调用时,有两种可能性:基本情况和需要递归的情况,在特殊情况中,展开的是一个列表,程序必须遍历所有的字列表,并对他们调用flatten。然后用另一个for循环来产生被展开的子列表中的所有元素。
>>> nested = [[1,2],[3,4],[5,[6,[7]]]]
>>> for num in flatten(nested):
print num
1
2
3
4
5
[6, [7]]
(上面的结果跟书《python基础教程(第二版)》中例子的结果不一样,我也搞不懂)