首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >巨蟒。功能中的功能

巨蟒。功能中的功能
EN

Stack Overflow用户
提问于 2012-08-05 09:22:45
回答 2查看 158关注 0票数 0

我是Python新手,我对这段代码有问题:

代码语言:javascript
复制
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声明中:

代码语言:javascript
复制
if direc == "--q":
    return something

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-05 12:22:48

根据我从你的评论中所理解的,这应该是正确的。

代码语言:javascript
复制
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

讨论由您提供的代码

请添加更多的信息到您的帖子,代码应该做什么。同时,在这里看到一个语义等价的函数,它和您的函数完全相同,但是我已经删除了一些不必要的东西。

代码语言:javascript
复制
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()替换了您的目录名处理逻辑,它可以跨所有平台工作。

在这里,当前的行为:

代码语言:javascript
复制
>>> 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

递归

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

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
>>> string_foo("Hello")
H
e
l
l
o

>>> string_bar("Hello")
o
l
l
e
H
票数 1
EN

Stack Overflow用户

发布于 2012-08-05 09:30:18

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11815296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档