鱼C论坛

 找回密码
 立即注册
查看: 1795|回复: 4

[已解决]python 030讲 02题

[复制链接]
发表于 2021-1-26 18:59:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import os

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

start_dir = input('请输入待查找的初始目录:')
target = input('请输入需要查找的目标文件:')
search_file(start_dir, target)
问题1:里面用到了递归,递归都是要有返回条件的,这里面的返回条件是什么?
问题2:如果each_file是文件夹的话,会开始递归调用,并且os.chdir(os.pardir)返回上级目录,如果进入到一个文件后,里面全是文件,没有文件夹,并且没有要找的文件,那么就不调用os.chdir(os.pardir)返回上级目录了么?#因为os.chdir(os.pardir)是 if os.path.isdir(each_file)条件下的语句#如果这样怎么接下来的循环遍历呢?
最佳答案
2021-1-26 19:56:33
问题一、程序的第6~11行是for循环,循环结束后就返回了,这就是递归的返回啊
比如,第一次调用search_file,早for循环中进入的第二个if,在第10行递归调用;
第二次调用search_file,又一次进入for循环,循环结束后,就返回到调用的地方了,即上面的第10行。

问题二、你的提问前后是矛盾的哟~~若是一个文件夹中都是文件,那么这就是最底层文件夹了,遍历完就完了,不会再遍历了啊。
这个可能有点不太好理解,需要自己多琢磨。
举个小例子,你要查找的目录(我们称之为目录A)下有三个文件夹,四个文件,第一次查找,进入for之后,先看到两个文件(都是执行的第7行的if),都不是要找的文件,然后遇到一个文件夹(执行第9行的if),进入这个文件夹(执行的是第10行,我们称之为目录B),第二次递归调用,这个文件夹中只有5个文件,遍历完这个文件夹中的五个文件之后,第二次递归结束,返回到第二次调用的位置,即第10行,继续执行第11行,返回上一层文件夹(即目录A),这时候继续遍历目录A,因为还有一个文件夹和两个文件没有遍历呢……

只能说这么多了。不知道你能否理解。自己看着程序,在纸上画一画,或许就理解了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-26 19:56:33 | 显示全部楼层    本楼为最佳答案   
问题一、程序的第6~11行是for循环,循环结束后就返回了,这就是递归的返回啊
比如,第一次调用search_file,早for循环中进入的第二个if,在第10行递归调用;
第二次调用search_file,又一次进入for循环,循环结束后,就返回到调用的地方了,即上面的第10行。

问题二、你的提问前后是矛盾的哟~~若是一个文件夹中都是文件,那么这就是最底层文件夹了,遍历完就完了,不会再遍历了啊。
这个可能有点不太好理解,需要自己多琢磨。
举个小例子,你要查找的目录(我们称之为目录A)下有三个文件夹,四个文件,第一次查找,进入for之后,先看到两个文件(都是执行的第7行的if),都不是要找的文件,然后遇到一个文件夹(执行第9行的if),进入这个文件夹(执行的是第10行,我们称之为目录B),第二次递归调用,这个文件夹中只有5个文件,遍历完这个文件夹中的五个文件之后,第二次递归结束,返回到第二次调用的位置,即第10行,继续执行第11行,返回上一层文件夹(即目录A),这时候继续遍历目录A,因为还有一个文件夹和两个文件没有遍历呢……

只能说这么多了。不知道你能否理解。自己看着程序,在纸上画一画,或许就理解了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-26 20:00:06 | 显示全部楼层
本帖最后由 昨非 于 2021-1-26 20:02 编辑

递归的返回条件不就是“下一层”的第10行代码部分运行完
也就是search_file函数层层递归到底,自然就会运行第11行返回“上一层”

问题二:
如果只有一层文件目录的话,自然就不会递归调用,也不需要返回
程序只会执行
 for each_file in os.listdir(os.curdir) :
这一for循环,而且,对于每次循环
都只会判断
if each_file == target :
成立与否而决定是否有结果打印出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-26 20:21:55 | 显示全部楼层
sunrise085 发表于 2021-1-26 19:56
问题一、程序的第6~11行是for循环,循环结束后就返回了,这就是递归的返回啊
比如,第一次调用search_file ...

照你说的第二次递归调用完之后,没有找到要找的文件,返回到第二次调用的地方,那么返回的是一个空对象么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-26 20:25:46 | 显示全部楼层
妙脆角 发表于 2021-1-26 20:21
照你说的第二次递归调用完之后,没有找到要找的文件,返回到第二次调用的地方,那么返回的是一个空对象么 ...

无返回值啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 17:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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