蟒蛇。功能上的功能

时间:2012-08-05 09:22:45

标签: python function return

我是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 /,它将打印三次,如果目录是/ home /它将打印两次,依此类推。 我也尝试在if语句中返回:

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

但是没有任何反应。 有任何想法吗? 非常感谢!

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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后,它们全部打印,因为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

递归

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

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