鱼C论坛

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

[已解决]python课后习题疑问

[复制链接]
发表于 2021-5-20 00:45:19 | 显示全部楼层 |阅读模式

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

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

x
课后习题疑问,实现搜索文件是否存在,疑问如代码中红色标记部分,请大神帮忙看看,谢谢!


import os

inidir = input('请输入待查找的初始目录:')

sfile = input('请输入需要查找的目标文件:')

# 定义一个递归函数

def searchf(inidir,sfile):

    i = 0
   
    a = os.listdir(inidir)

    while i <= (len(a)-1):
        
        if os.path.isdir(inidir+'\\'+a[i]) == True:
            
            searchf(inidir+'\\'+a[i],sfile)
            #os.chdir(os.pardir)   #参考答案里说这里切记要返回上一层目录,我一直没太看懂,为什么这里不返回上一层目录,结果也是正确的?

        if os.path.isfile(inidir+'\\'+a[i]) == True:

            if sfile == a[i]:
               
                print('找到了')

        i = i+1      
            
searchf(inidir,sfile)
最佳答案
2021-5-20 22:05:38
elecfan 发表于 2021-5-20 21:59
做了下面这个实验,是不是证明if语句内的迭代还是有作用域的,第一个if语句结束后,b又恢复到了迭代前的 ...




if 语句是没有专门的作用域的,这个是函数递归的作用域,不是 if 的作用域

你递归进入的函数有点相当于执行了函数的内嵌函数

此时这个外部函数相当于内嵌函数来说就是全局空间,而内嵌函数相对于全局作用域与外部函数都为局部空间

Python 中有作用域之分的一般是 类 与 函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-20 10:09:58 | 显示全部楼层
你的文件路径如果并不复杂的话一次就找到目标文件自然不需要返回,但实际上比如说从一个文件夹中又包含了几十个文件夹,当程序检索完第一个文件夹没有找到目标的时候,如果不能返回去上层目录,就无法进入另一个文件夹了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-20 12:11:21 | 显示全部楼层
#对于这个问题,做了下实验,是不是可以这么解释,if循环内部的迭代,不会影响外部,当if循环退出后,下一个for语句的循环,还是会带入迭代函数发生前的a的值和i的值,不知道这么解释对不对,所以这里“要返回上一层目录”不是必需的。

import os

inidir = input('请输入待查找的初始目录:')

sfile = input('请输入需要查找的目标文件:')

# 定义一个递归函数

def searchf(inidir,sfile):

    i = 0
   
    a = os.listdir(inidir)

    #print(inidir)

    for i in range(len(a)):
        
        
        if os.path.isdir(inidir+'\\'+a[i]) == True:
            #print(inidir+'\\'+a[i])            
            searchf(inidir+'\\'+a[i],sfile)
            #os.chdir(os.pardir)

        if os.path.isfile(inidir+'\\'+a[i]) == True:
            #print(inidir+'\\'+a[i])

            if sfile == a[i]:
               
                print('找到了')

        print(inidir,'\n',a,'\n',i)
        
        i = i+1      
            
searchf(inidir,sfile)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-20 12:12:31 | 显示全部楼层
希望各位大神帮忙看看,这么解释对不对。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-20 13:07:36 | 显示全部楼层
elecfan 发表于 2021-5-20 12:11
#对于这个问题,做了下实验,是不是可以这么解释,if循环内部的迭代,不会影响外部,当if循环退出后,下一 ...


if 下并没有什么作用域,不是函数,是都会影响全局的

这里返回上一层目录是需要的,如果你一个目录的子目录都只有一个文件夹,那么返回上层就没有意义

但是通常你一个目录中通常不止一个文件夹,那么若进入递归时,导致进入一个文件夹,搜索结束后没有返回上一层文件夹,那么此时你 进入这个文件夹同目录下的文件夹就不会遍历搜索,直接被忽略

简单来说,你的代码就会变成只进不出,不会检索同目录下除第一个进入文件夹以外的文件夹了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-20 21:09:13 | 显示全部楼层
Twilight6 发表于 2021-5-20 13:07
if 下并没有什么作用域,不是函数,是都会影响全局的

这里返回上一层目录是需要的,如果你一个目录 ...

下面是我运行的打印信息,目录中不止一个文件夹的,但是所有的结果都寻找出来了,这个怎么解释,麻烦再看下。


请输入待查找的初始目录:D:\视频教程\Python3零基础入门学习视频\习题\TEST29
请输入需要查找的目标文件:查找的文件.txt
找到了
D:\视频教程\Python3零基础入门学习视频\习题\TEST29
['查找的文件.txt', '第一个一级目录', '第二个一级目录']
0
找到了
D:\视频教程\Python3零基础入门学习视频\习题\TEST29\第一个一级目录
['查找的文件.txt', '第一个一级目录的子目录']
0
找到了
D:\视频教程\Python3零基础入门学习视频\习题\TEST29\第一个一级目录\第一个一级目录的子目录
['查找的文件.txt']
0
D:\视频教程\Python3零基础入门学习视频\习题\TEST29\第一个一级目录
['查找的文件.txt', '第一个一级目录的子目录']
1
D:\视频教程\Python3零基础入门学习视频\习题\TEST29
['查找的文件.txt', '第一个一级目录', '第二个一级目录']
1
找到了
D:\视频教程\Python3零基础入门学习视频\习题\TEST29\第二个一级目录
['查找的文件.txt', '第二个一级目录的子目录']
0
找到了
D:\视频教程\Python3零基础入门学习视频\习题\TEST29\第二个一级目录\第二个一级目录的子目录
['查找的文件.txt']
0
D:\视频教程\Python3零基础入门学习视频\习题\TEST29\第二个一级目录
['查找的文件.txt', '第二个一级目录的子目录']
1
D:\视频教程\Python3零基础入门学习视频\习题\TEST29
['查找的文件.txt', '第一个一级目录', '第二个一级目录']
2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-20 21:20:51 | 显示全部楼层
elecfan 发表于 2021-5-20 21:09
下面是我运行的打印信息,目录中不止一个文件夹的,但是所有的结果都寻找出来了,这个怎么解释,麻烦再看 ...




!非常抱歉!,确实没有必要使用 chdir,我之前阅题太快把 a 的函数看成了 chdir 改变到下一层工作目录了,和另一个课时的代码混了

而这个代码实际上来说用的是绝对路径,所以就算工作目录没有返回上一层也可以继续执行

若你递归过程是使用 chdir 、且不使用绝对路径,用的是工作目录,那么就需要返回上一层路径,否则就会只进不出

非常抱歉~

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

使用道具 举报

 楼主| 发表于 2021-5-20 21:59:35 | 显示全部楼层
Twilight6 发表于 2021-5-20 21:20
!非常抱歉!,确实没有必要使用 chdir,我之前阅题太快把 a 的函数看成了 chdir 改变到下一层工作 ...

做了下面这个实验,是不是证明if语句内的迭代还是有作用域的,第一个if语句结束后,b又恢复到了迭代前的值。所以上面我的那个解释应该是对的吧?

a = '一 二 三 四'
i = 0

def prtest(a,i):


    b = a.split(' ')
   
    if i <= 1:
        
        prtest('壹 贰 叁 肆',i +1)
        
        print(b[i],b)

    if ((i>1)and(i<=3)):

        print(b[i],b)

运行结果:
>>> prtest(a,i)
叁 ['壹', '贰', '叁', '肆']
贰 ['壹', '贰', '叁', '肆']
一 ['一', '二', '三', '四']
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-20 22:01:11 | 显示全部楼层
elecfan 发表于 2021-5-20 21:59
做了下面这个实验,是不是证明if语句内的迭代还是有作用域的,第一个if语句结束后,b又恢复到了迭代前的 ...

前面代码显示有点问题,[i]这个好像没显示出来。

a = '一 二 三 四'
i = 0

def prtest(a,i):


    b = a.split(' ')
   
    if i <= 1:
        
        prtest('壹 贰 叁 肆',i +1)
        
        print(b[i],b)

    if ((i>1)and(i<=3)):

        print(b[i],b)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-20 22:05:38 | 显示全部楼层    本楼为最佳答案   
elecfan 发表于 2021-5-20 21:59
做了下面这个实验,是不是证明if语句内的迭代还是有作用域的,第一个if语句结束后,b又恢复到了迭代前的 ...




if 语句是没有专门的作用域的,这个是函数递归的作用域,不是 if 的作用域

你递归进入的函数有点相当于执行了函数的内嵌函数

此时这个外部函数相当于内嵌函数来说就是全局空间,而内嵌函数相对于全局作用域与外部函数都为局部空间

Python 中有作用域之分的一般是 类 与 函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-20 22:07:29 | 显示全部楼层
Twilight6 发表于 2021-5-20 22:05
if 语句是没有专门的作用域的,这个是函数递归的作用域,不是 if 的作用域

你递归进入的函数有 ...

OK,那上面那个查找文件的题目就能解释通了,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-9 02:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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