Python。函数中的函数

2024-10-01 11:24:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python新手,我对以下代码有问题:

def dirs(currentDir):
    exe = True
    allDirs = os.listdir(currentDir)
    print "Directories in %s:" % currentDir
    for files in allDirs:
        print files
    direc = raw_input("Directory name?:")

    if direc == "--q":
        exe = False
    elif currentDir == "/" and exe == True:
        theDir =  currentDir + direc
        dirs(theDir)
    elif currentDir != "/" and exe == True:
        theDir = currentDir + "/" + direc
        dirs(theDir)
    print "should return"

为什么,当我键入--q时,prints应该返回多次? 如果目录是/home/username/,它将打印三次;如果目录是/home/它将打印两次,依此类推。 我还试图在if语句中返回:

^{pr2}$

但后来什么也没发生。 有什么想法吗? 非常感谢!在


Tags: andin目录truehomeiffilesexe
2条回答

在我看来,这与函数的递归性有关。如果您在使用程序时输入两个目录,那么您将需要打印3个“should return”,因为有三个对dirs()的调用。在

从你的评论来看,这应该是正确的。在

def dirs(currentDir):
    allDirs = os.listdir(currentDir)
    print "Directories in %s:" % currentDir
    for files in allDirs:
        print files
    direc = raw_input("Directory name?:")

    if direc != " q":
        theDir =  os.path.join(currentDir, direc)
        return dirs(theDir)
    else:
        return currentDir

讨论您提供的代码

请在你的帖子中添加更多的信息代码应该做什么。同时,在这里看到一个语义等价的函数,它做的事情和你的函数完全一样,但是我去掉了一些不必要的东西。在

^{pr2}$

现在,只要不输入 q,它就永远不会打印“should return”。在

程序中的exe变量是什么?它什么也做不了。在

如果执行第一个if子句,则将执行其他子句中的,因为if/elif/.../else是互斥子句。一旦您设置了exe = Trueexe将不再被访问。因此,您可以将exe从代码中完全删除。但是,也许您希望它做一些不同于阻止这些elif子句的执行。在

至于should return

  • 您将始终看到至少一个should return。在
  • 每次您不输入 q,您将再次看到{}
  • 它们都在您输入 q之后打印,因为print语句在递归调用之后。在

此外,我用os.path.join()替换了目录名处理逻辑,该逻辑适用于所有平台。在

现在的行为是:

>>> dirs(r"C:\Python27")
Directories in C:\Python27:
DLLs
Doc
include
Lib
libs
LICENSE.txt
NEWS.txt
python.exe
pythonw.exe
README.txt
Removesetuptools.exe
Scripts
setuptools-wininst.log
tcl
Tools
w9xpopen.exe
Directory name?:Doc
Directories in C:\Python27\Doc:
python273.chm
Directory name?: q
should return
should return

递归

比较这两个函数,看看在递归调用前后处理输出的效果:

^{4}$

输出:

>>> string_foo("Hello")
H
e
l
l
o

>>> string_bar("Hello")
o
l
l
e
H

相关问题 更多 >