zoukankan      html  css  js  c++  java
  • python递归函数下不能正常使用yield

    # -*- coding:utf-8  -*-
    import os
    import time
    file_list = []
    def findFile(path):
        listFile = os.listdir(path)
        for file in listFile:
            try:
                file =os.path.join(path,file)
                if os.path.isfile(file):
                    yield file               # test1
                    #file_list.append(file)  # test2
                    #print(file.decode('gb2312'))
                else:
                    findFile(file)
            except WindowsError,e:
                # 捕获系统不允许访问的文件夹导致的异常,会让程序无法进行下去
                # 将不允许访问的文件夹,直接跳过该文件夹
                print(e)
                continue
            except Exception,e:
                print(e)

    测试代码:

    start = time.time()
    print('start time : ' + str(start))
    t = findFile('H:\python')
    for i in t:
        try:
            print(str(i).decode('gb2312'))
        except UnicodeDecodeError:
            pass
    print('use time : ' + str(time.time() - start))

    然后运行就会只是将输入路径下的所有文件列举出来而已,但是没有将其下的目录下的文件列举出来,如图:

    但是在上述代码中,修改一下代码,将yield file这一句注释,改用下面那一句后,即使用一个列表将所有结果汇集在一起后,然后测试,测试代码如下:

    start = time.time()
    print('start time : ' + str(start))
    findFile('H:\python')
    for i in file_list:
        try:
            print(str(i).decode('gb2312'))
        except UnicodeDecodeError:
            pass
    print('use time : ' + str(time.time() - start))

    这次测试是可以正常显示所有文件夹下的所有文件的,如图:

    这证明不是函数编写出现的问题,也不是出现异常导致不能获取到其他文件夹下的文件,也将测试的代码放出吧,其实只是就是在函数体加异常,而且将异常显示出来,

    但是发现执行期间没有异常产生,如图:

    还以为是函数没有回调导致没有查找其他文件夹下的文件,但是使用软件的调试功能来调试该程序,发现并不是函数没有回调,而是listFile始终都是没有改变,

    都是H:python下的所有文件夹和文件的集合,每当判断到其他文件时这个值都不会改变,导致for循环不能判断来自新文件夹下的所有文件夹或文件,

    那就是说for循环始终判断H:python文件夹下的元素,仅此而已。如在调试时,跳到这个NoteFiles目录时,然后就按下一步,一直到for循环时:

    再按下一步:

    这时发现,它直接进入了下一个文件夹,而不是进入该目录下,也可以发现listFile还是没有改变,为了证明其是进入了H:python文件夹下的下一个文件夹,可以展开listFile就可以看到for循环直接是忽略了当前文件夹,并且进入了下个文件夹,如图:

    但是如果该文件夹没有文件,也可能将会忽略该文件夹,打开NotesFile文件夹,如图:

    所以并不是该文件夹下没有文件,所以是因为yield导致的原因。其实经过上述的已经可以判断是yield带来的效果,但是至于为什么会这样,恐怕我不能回答大家,

    因为我也不知道,哈哈哈哈哈,至于为社么发这个博客,我只是觉得这个很有探究的意义,但是我不知道是否有意义,因为本人才疏学浅,对python更是刚接触不久,

    但是我希望各位前辈可以指点一下,告诉我是不是不能在递归函数使用,还是要修改一下代码才可以使用,希望不吝指教,谢谢。2016-04-04

    http://www.cnblogs.com/GHost-Ma/
  • 相关阅读:
    Linux内核RPC请求过程
    二分图
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 文本加密
    Java实现 蓝桥杯 算法提高 文本加密
    Java蓝桥杯 算法提高 九宫格
    Java蓝桥杯 算法提高 九宫格
  • 原文地址:https://www.cnblogs.com/GHost-Ma/p/5353168.html
Copyright © 2011-2022 走看看