我是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
但是没有任何反应。 有任何想法吗? 非常感谢!
答案 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