python基础教程中(第2版 修订版)p155页有这样一段代码:
def flatten(nested):
try:
for sublist in nested:
for element in flatten(sublist):
yield element
except TypeError:
yield nested
list(flatten([[[1], 2], 3, 4, [5, [6, 7]], 8]))
输出:
[1, 2, 3, 4, 5, 6, 7, 8]
这是递归生成器的使用。其它递归生成器可参考 filter函数与无限生成器结合使用遇到的问题 。
调试代码:
def flatten(nested):
try:
print(nested)
for sublist in nested:
print('\n')
print(sublist)
for element in flatten(sublist):
print(element)
yield element
except TypeError:
yield nested
list(flatten([[[1], 2], 3, 4, [5, [6, 7]], 8]))
输出:
[[[1], 2], 3, 4, [5, [6, 7]], 8]
[[1], 2]
[[1], 2]
[1]
[1]
1
1
2
2
3
4
[5, [6, 7]]
[5, [6, 7]]
5
5
[6, 7]
[6, 7]
6
6
7
7
8
[1, 2, 3, 4, 5, 6, 7, 8]
可见,其中的yield nested
用于生成每个最终的输出值,而其中yield element
的作用是向上传递yield nested
的值,相当于接力器,所以每个值print(element)
输出的数量不一样,越多说明递归调用的越深,需要传递的层数越多。
搞明白了这些于是我有一个大胆的想法,用一个递归生成器来遍历文件夹文件,大家都知道python
中递归是很占用内存的,而且递归深度超过1000会报错,这样的话使用递归的生成器似乎就不用担心内存溢出:
以下是代码:
import os
def traverse(dir):
if os.path.isdir(dir):
files = os.listdir(dir)
for file in files[::-1]:
full_name = os.path.join(dir,file)
for i in traverse(full_name):
yield i
else:
yield dir
for i in traverse(r'c:\\'):
print(i)
试了一下,可以用,但是内存占用就没有去深究了,有兴趣的可以一起讨论
网友评论