<p>从你的评论来看,这应该是正确的。在</p>
<pre><code>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
</code></pre>
<p><strong>讨论您提供的代码</strong></p>
<p>请在你的帖子中添加更多的信息代码应该做什么。同时,在这里看到一个语义等价的函数,它做的事情和你的函数完全一样,但是我去掉了一些不必要的东西。在</p>
^{pr2}$
<p>现在,只要不输入<code> q</code>,它就永远不会打印“should return”。在</p>
<p>程序中的<code>exe</code>变量是什么?它什么也做不了。在</p>
<p>如果执行第一个<code>if</code>子句,则将执行其他子句中的<em>非</em>,因为<code>if/elif/.../else</code>是互斥子句。一旦您设置了<code>exe = True</code>,<code>exe</code>将不再被访问。因此,您可以将<code>exe</code>从代码中完全删除。但是,也许您希望它做一些不同于阻止这些<code>elif</code>子句的执行。在</p>
<p>至于<code>should return</code></p>
<ul>
<li>您将始终看到至少一个<code>should return</code>。在</li>
<li>每次您不输入<code> q</code>,您将再次看到{<cd9>}</li>
<li>它们都在您输入<code> q</code>之后打印,因为print语句在递归调用之后。在</li>
</ul>
<p>此外,我用<code>os.path.join()</code>替换了目录名处理逻辑,该逻辑适用于所有平台。在</p>
<p>现在的行为是:</p>
<pre><code>>>> 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
</code></pre>
<h2>递归</h2>
<p>比较这两个函数,看看在递归调用前后处理输出的效果:</p>
^{4}$
<p>输出:</p>
<pre><code>>>> string_foo("Hello")
H
e
l
l
o
>>> string_bar("Hello")
o
l
l
e
H
</code></pre>