python递归调用返回上一层目录不理解
import osdef search_file(initial_dir,target_file):
os.chdir(initial_dir) #改变工作目录到初始目录
all_file = os.listdir(os.curdir)
for each_file in all_file:
if each_file == target_file:
print(os.getcwd()+os.sep()+each_file) #打印当前工作目录+路径分隔符+文件名
if os.path.isdir(each_file): #判断指定路径是否是一个目录(返回条件)
search_file(each_file,target_file)#递归调用
os.chdir(os.pardir) # 递归调用后切记返回上一层目录(切记)
initial_dir = input("请输入待查找的初始目录:")
target_file = input("请输入需要查找的目标文件:")
search_file(initial_dir,target_file)
麻烦大佬把递归调用后返回上一层目录的作用具体解释一下
论坛里搜到解释:(*:这里为何要返回上一级的目的一是为了防止文件夹是个空文件夹,没有目标文件,二是为了防止例如三级和四级目录下有相同目标文件的情况。
跳出递归的关键是,递归到each_file是文件的时候,就不会调用递归(当前目录下只有一个文件,没有文件夹)。
这个时候肯定要返回上一级目录,进行下一次文件和文件夹的判断。)也不理解
害求助 简单点说 你递归打开一个文件夹后 执行os.chdir(initial_dir) 改变工作目录到这个文件夹了
但是你只扫描且进入这个文件夹内了 如果外面还有文件夹需要遍历查找 你就要返回上一层目录
否则你进去之后不返回会漏掉部分文件夹没有进行遍历查找 Twilight6 发表于 2020-5-25 18:46
简单点说 你递归打开一个文件夹后 执行os.chdir(initial_dir) 改变工作目录到这个文件夹了
但是你只 ...
请输入待查找的初始目录:C:\Users\admin\Desktop
请输入需要查找的目标文件:something.txt
Traceback (most recent call last):
File "C:/Users/admin/Desktop/课后练习/4.py", line 17, in <module>
search_file(initial_dir,target_file)
File "C:/Users/admin/Desktop/课后练习/4.py", line 12, in search_file
search_file(each_file,target_file)#递归调用
File "C:/Users/admin/Desktop/课后练习/4.py", line 10, in search_file
print(os.getcwd()+os.sep()+each_file) #打印当前工作目录+路径分隔符+文件名
TypeError: 'str' object is not callable
大佬,哪里错了看了半天没看出来 Twilight6 发表于 2020-5-25 18:46
简单点说 你递归打开一个文件夹后 执行os.chdir(initial_dir) 改变工作目录到这个文件夹了
但是你只 ...
def get_digits(n):
result = []
if n < 10:
result.append(n)
return result
else:
result=get_digits(n//10)
result.append(n%10)
return result
print(get_digits(243657))
print(get_digits(0))
再多问你一个问题这段代码递归后result列表为啥没被清空呢 莫待无花空折枝 发表于 2020-5-25 19:12
大佬,哪里错了看了半天没看出来
sep不能要括号
print(os.getcwd() + os.sep+ each_file) Twilight6 发表于 2020-5-25 19:25
sep不能要括号
好的{:5_104:} 莫待无花空折枝 发表于 2020-5-25 19:25
再多问你一个问题这段代码递归后result列表为啥没被清空呢
因为最后从递归完成:
result=get_digits(n//10)会返回if n < 10:
result.append(n)
return result的结果,后面的都进行了
result.append(n%10) Twilight6 发表于 2020-5-25 20:14
因为最后从递归完成:
会返回的结果,后面的都进行了
我理解的是,递归调用自身函数的第一步
def get_digits(n):
result = []
这不就清空列表了?
按你那么理解
result = []
在函数外面和里面不是没有区别嘛(不考虑局部变量与全局变量) 莫待无花空折枝 发表于 2020-5-25 21:38
我理解的是,递归调用自身函数的第一步
这不就清空列表了?
递归过程和 result = [] 没关系
只有最后递归出来 才用到了这个
因为递归进去每次 result = [] 都是局部变量 不影响之前的列表 Twilight6 发表于 2020-5-25 21:42
递归过程和 result = [] 没关系
只有最后递归出来 才用到了这个
因为递归进去每次 result = [] 都是局 ...
因为递归进去每次 result = [] 都是局部变量 不影响之前的列表
问题是不影响之前的列表的话,那怎么往列表里面添加值呢
result.append(n%10) 莫待无花空折枝 发表于 2020-5-25 22:15
因为递归进去每次 result = [] 都是局部变量 不影响之前的列表
问题是不影响之前的列表的话,那怎么往 ...
你用的是什么IDLE? 用个有调试的 编译器 然后拿去调试 很清晰的显示每次的步骤~ Twilight6 发表于 2020-5-25 22:19
你用的是什么IDLE? 用个有调试的 编译器 然后拿去调试 很清晰的显示每次的步骤~
我初学者 20来天就用的IDLE我学到后面在回来理解一下这个吧
谢谢大佬
{:5_108:} 莫待无花空折枝 发表于 2020-5-25 22:27
我初学者 20来天就用的IDLE我学到后面在回来理解一下这个吧
谢谢大佬
递归这课确实比较麻烦,加油吧~ Twilight6 发表于 2020-5-25 22:29
递归这课确实比较麻烦,加油吧~
奥利给!{:5_109:} {:10_256:} 莫待无花空折枝 发表于 2020-5-25 22:30
奥利给!
嘿嘿 对吧看的很舒服的 每一步骤都看得见 Twilight6 发表于 2020-6-2 20:38
嘿嘿 对吧看的很舒服的 每一步骤都看得见
昨天也是看的你的帖子把pycharm安装上的感谢大佬 莫待无花空折枝 发表于 2020-6-2 20:43
昨天也是看的你的帖子把pycharm安装上的感谢大佬
{:10_297:}嘿嘿 能帮助到你就好啦
页:
[1]