0

我是 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时,打印应该返回多次?如果目录是/home/username/,打印3次,如果目录是/home/,打印2次,以此类推。我还尝试在 if 语句中返回:

if direc == "--q":
    return something

但随后什么也没有发生。有任何想法吗?非常感谢!

4

2 回答 2

2

在我看来,这与您的函数的递归性有关。如果您在使用程序时输入两个目录,您会期望打印 3 个“应该返回”,因为有 3 个对 dirs() 的调用。

于 2012-08-05T09:30:18.057 回答
1

根据我从您的评论中了解到的情况,这应该是正确的。

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

讨论您提供的代码

请在您的帖子中添加更多信息,代码该做什么。同时,请参阅此处以获取语义等效的函数,它与您的函数执行完全相同的操作,但我删除了某些不必要的内容。

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)
        dirs(theDir)
    print "should return"

现在,只要你不输入--q,它就永远不会打印“应该返回”。

你的程序中的exe变量是什么?它什么也没

如果执行第一个if子句,则不会执行其他子句,因为if/elif/.../else它们是互斥子句。设置exe = True后,exe不再访问。因此,您可以exe完全从您的代码中删除 - 就目前而言。不过,也许您希望它做一些不同于阻止这些elif子句执行的事情。

至于should return

  • 你总会看到至少一个should return
  • 每次你进入--q,你会should return再次看到
  • 它们都在您输入后打印--q,因为它的打印语句在递归调用之后。

此外,我替换了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

递归

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

def string_foo(text):
    first, rest = text[0], text[1:]
    print first
    if rest:
        string_foo(rest)




def string_bar(text):
    first, rest = text[0], text[1:]
    if rest:
        string_foo(rest)
    print first

输出:

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

>>> string_bar("Hello")
o
l
l
e
H
于 2012-08-05T12:22:48.990 回答