繁体   English   中英

蟒蛇。 功能中

[英]python. function in function

我是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 /,它将打印两次,依此类推。 我也试图返回if语句:

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

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

在我看来,这与您的函数的递归性有关。 如果在使用程序时输入两个目录,则由于要对dirs()进行三个调用,因此希望打印出3个“应该返回”。

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

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被执行条款,其他的将excuted,因为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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM