0

私は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 /の場合、3回印刷され、ディレクトリが/ home /の場合、2回印刷されます。また、ifステートメントを返そうとしました。

if direc == "--q":
    return something

しかし、その後は何も起こりません。何か案は?どうもありがとう!

4

2 に答える 2

2

これは、関数の再帰性に関連しているように思われます。プログラムの使用中に2つのディレクトリを入力すると、dirs()が3回呼び出されるため、3つの「戻る必要がある」が出力されると予想されます。

于 2012-08-05T09:30:18.057 に答える
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二度とアクセスされることはありません。したがって、コードから(現状では)完全に削除できます。おそらく、しかし、あなたはそれらの句が実行されるのを防ぐこととは違う何かをしたかったのでしょう。exeexeelif

はどうかと言うとshould return

  • 常に少なくとも1つは表示されshould returnます。
  • 入力しないたびに--qshould returnもう一度表示されます
  • --qprintステートメントは再帰呼び出しの後にあるため、これらはすべて、入力後に印刷されます。

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
于 2012-08-05T12:22:48.990 に答える