【问题标题】:python. function in functionPython。功能中的功能
【发布时间】:2012-08-05 09:22:45
【问题描述】:

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

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

然后什么都没有发生。 有任何想法吗? 非常感谢!

【问题讨论】:

  • 欢迎来到 Stack Overflow!你能在帖子中修复你的缩进吗?这对于阅读 Python 非常有用,谢谢。
  • 这段代码到底应该做什么?你能解释一下吗?可能会帮助我们帮助您...

标签: python function return


【解决方案1】:

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

【讨论】:

  • 我以为功能有问题。但是我需要如何重写该函数才能正常工作的代码呢?
  • @Taadas:问题是:你希望你的代码到底做什么?我发布的代码应该与您的代码完全相同,并且它确实有效。问题是,它做你想做的事吗?
【解决方案2】:

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

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子句被执行,其他non子句将被执行,因为if/elif/.../else是互斥子句。一旦你设置了exe = Trueexe永远被再次访问。因此,您可以完全从您的代码中删除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

【讨论】:

  • 感谢代码和提示!抱歉,我没有注意到print "should return",它仍然处于调试状态。而不是print "should return",应该是return currentDir。然后您可以浏览目录,如果您键入 --q (表示退出),函数将返回您所在的目录。所以如果我输入--q,我想返回我所在的目录。
  • @Taadas 所以你想上一个目录吗?
  • 这就像浏览目录,当我输入 --q 时返回我所在的当前目录退出函数。
  • 示例中,我从C:\Python27开始,然后进入Doc目录。然后我输入--q,你想让它回到C:\Python27吗?
  • @Taadas,忘了提及你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多