あなたのコメントから私が理解したことから、これは正しいことをするはずです。
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
- 常に少なくとも1つは表示され
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
再帰
これらの2つの関数を比較して、再帰呼び出しの前後の出力を処理する効果を確認してください。
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