鱼C论坛

 找回密码
 立即注册
查看: 2622|回复: 10

请教 可否把这个程序的执行流程解释一遍?

[复制链接]
发表于 2016-1-16 20:27:56 | 显示全部楼层 |阅读模式
50鱼币
本帖最后由 碗碗的泡菜坛 于 2016-1-17 10:36 编辑

程序:
用户输入文件名以及开始搜索的路径,搜索该文件是否存在。如遇到文件夹,则进入文件夹继续搜索

具体代码:

  1. import os

  2. def search_file(start_dir, target) :
  3.     os.chdir(start_dir)
  4.    
  5.     for each_file in os.listdir(os.curdir) :
  6.         if each_file == target :
  7.             print(os.getcwd() + os.sep + each_file) # 使用os.sep是程序更标准
  8.         if os.path.isdir(each_file) :
  9.             search_file(each_file, target) # 递归调用
  10.             os.chdir(os.pardir) # 递归调用后切记返回上一层目录

  11. start_dir = input('请输入待查找的初始目录:')
  12. target = input('请输入需要查找的目标文件:')
  13. search_file(start_dir, target)
复制代码


如果实际情况是这样:(文件夹1是我指定的搜索路径,文件夹1里的11.txt是我要搜索的目标文件,文件夹2~5都为空文件夹)

难解之谜.png


这个程序的实际运行流程是怎样的呢??求指点呀

最佳答案

查看完整内容

代码是这行执行玩了 才执行下一行 执行到search_file(each_file, target)时 就会进到search_file函数的开头在执行 后面的那个os.chdir(os.pardir)暂时没执行 从文件夹1到文件夹4都是这这样 到文件夹5时什么没有这个时候就没有递归调用自己了 文件夹5就开始退出了 就到文件夹4后面的 os.chdir(os.pardir)开始执行了 接着就是文件夹3 2 1
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-16 20:27:57 | 显示全部楼层
本帖最后由 kunaiai 于 2016-1-17 13:32 编辑
碗碗的泡菜坛 发表于 2016-1-16 23:04
请问返回文件夹4之后 是紧接着执行for eachfile in 文件夹4吗?如果是的话 这个时候eachfile为空(因为ea ...


代码是这行执行玩了 才执行下一行
执行到search_file(each_file, target)时 就会进到search_file函数的开头在执行  后面的那个os.chdir(os.pardir)暂时没执行
从文件夹1到文件夹4都是这这样   到文件夹5时什么没有这个时候就没有递归调用自己了  文件夹5就开始退出了  
就到文件夹4后面的 os.chdir(os.pardir)开始执行了  接着就是文件夹3   2    1  
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-16 21:04:02 | 显示全部楼层
第一次调用:找到11.txt,打印,发现文件夹2.isdir递归调用
第二次调用:发现文件夹3.isdir递归调用
第三次调用:发现文件夹4.isdir递归调用
第四次调用:发现文件夹5.isdir递归调用
第五次调用:为空
返回第四次调用
返回第三次调用
返回第二次调用
返回第一次调用
返回主程序
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-16 23:04:46 From FishC Mobile | 显示全部楼层
冬雪雪冬 发表于 2016-1-16 21:04
第一次调用:找到11.txt,打印,发现文件夹2.isdir递归调用
第二次调用:发现文件夹3.isdir递归调用
第三 ...

请问返回文件夹4之后 是紧接着执行for eachfile in 文件夹4吗?如果是的话 这个时候eachfile为空(因为eachfile =文件夹5已经执行过) 不是应该就退出for循环了吗 怎么接下来又直接返回到文件夹3了呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-16 23:36:03 | 显示全部楼层
因为没递归一次就有一个for循环。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-17 10:45:44 | 显示全部楼层
本帖最后由 碗碗的泡菜坛 于 2016-1-17 10:47 编辑
冬雪雪冬 发表于 2016-1-16 23:36
因为没递归一次就有一个for循环。


还是不太明白 请问第一次执行os.chdir(os.pardir)之后接下来是执行哪一行??
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-17 10:51:38 | 显示全部楼层
本帖最后由 碗碗的泡菜坛 于 2016-1-17 11:36 编辑

@小甲鱼 @kunaiai
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-17 12:19:06 | 显示全部楼层
递归是自己调用自己  先调用 后出来

你的例子是攻调用5次

第一次调用 搜索文件夹1里的文件和目录  111.txt(打印) 文件夹2
进入第2次调用 搜索文件2的的文件和目录  文件夹3
进入第3次调用 搜索文件3的的文件和目录  文件夹4
进入第4次调用 搜索文件4的的文件和目录  文件夹5
进入第5次调用 搜索文件5的的文件和目录  没有 开始退出
退出第5次调用
退出第4次调用
退出第3次调用
退出第2次调用
退出第1次调用

加了2个print 看下程序怎么调用的
  1. import os

  2. def search_file(start_dir, target) :
  3.     os.chdir(start_dir)
  4.     print('进入文件夹%s' % start_dir)
  5.     for each_file in os.listdir(os.curdir) :
  6.         if each_file == target :
  7.             print(os.getcwd() + os.sep + each_file) # 使用os.sep是程序更标准
  8.         if os.path.isdir(each_file) :
  9.             search_file(each_file, target) # 递归调用
  10.             os.chdir(os.pardir) # 递归调用后切记返回上一层目录
  11.    
  12.     print('退出文件夹%s' % start_dir)
  13.    
  14. start_dir = input('请输入待查找的初始目录:')
  15. target = input('请输入需要查找的目标文件:')
  16. search_file(start_dir, target)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-17 13:55:22 | 显示全部楼层
kunaiai 发表于 2016-1-17 12:19
递归是自己调用自己  先调用 后出来

你的例子是攻调用5次

终于有点头绪了 我理解的是这样 兄台帮忙看下对不对:
程序一直到进入了文件夹5 发现文件夹5什么也没有的时候,此轮递归结束,执行递归后面一个操作:回到上一层文件夹,其实也就是回到了上一轮递归。上一轮递归因为文件夹4里只有一个文件夹5 文件夹5已经判断过,所以上一轮递归也结束,然后就执行了上一轮递归结束后的下一个操作:回到上一层。。。直到回到初始文件夹
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-17 14:25:31 | 显示全部楼层
是的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-23 14:49:55 | 显示全部楼层
我就是想来问一下如何拿鱼币
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-19 07:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表