python 030讲 02题
import osdef 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)条件下的语句#如果这样怎么接下来的循环遍历呢? 问题一、程序的第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,因为还有一个文件夹和两个文件没有遍历呢……
只能说这么多了。不知道你能否理解。自己看着程序,在纸上画一画,或许就理解了 本帖最后由 昨非 于 2021-1-26 20:02 编辑
递归的返回条件不就是“下一层”的第10行代码部分运行完
也就是search_file函数层层递归到底,自然就会运行第11行返回“上一层”
问题二:
如果只有一层文件目录的话,自然就不会递归调用,也不需要返回
程序只会执行
for each_file in os.listdir(os.curdir) :这一for循环,而且,对于每次循环
都只会判断if each_file == target :成立与否而决定是否有结果打印出来 sunrise085 发表于 2021-1-26 19:56
问题一、程序的第6~11行是for循环,循环结束后就返回了,这就是递归的返回啊
比如,第一次调用search_file ...
照你说的第二次递归调用完之后,没有找到要找的文件,返回到第二次调用的地方,那么返回的是一个空对象么? 妙脆角 发表于 2021-1-26 20:21
照你说的第二次递归调用完之后,没有找到要找的文件,返回到第二次调用的地方,那么返回的是一个空对象么 ...
无返回值啊
页:
[1]