根据我从您的评论中了解到的情况,这应该是正确的。
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
,因为它的打印语句在递归调用之后。
此外,我替换了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