美文网首页
递归生成器

递归生成器

作者: 忘了呼吸的那只猫 | 来源:发表于2019-02-21 11:29 被阅读0次

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)

试了一下,可以用,但是内存占用就没有去深究了,有兴趣的可以一起讨论

相关文章

网友评论

      本文标题:递归生成器

      本文链接:https://www.haomeiwen.com/subject/xsfryqtx.html