1

コード1

import os
def walk_dir(dirname):
        for d in os.listdir(dirname):
                path = os.path.join(dirname, d)
                if os.path.isdir(path):
                        for f in walk_dir(path):
                           print f
                else:
                        yield path

for file in walk_dir("/tmp"):
  print  file 

コード2

import os
def walk_dir(dirname):
        for d in os.listdir(dirname):
                path = os.path.join(dirname, d)
                if os.path.isdir(path):
                        for f in walk_dir(path):
                           yield f
                else:
                        yield path

for file in walk_dir("/tmp"):
  print  file 

code1 と code2 を実行すると、同じ出力が得られますが、その理由を知りたいですか? なぜ 同じ効果が得られるのですかyield fprint f

Vanesa Milagros Fernandez が言うように:print f # -----> f を印刷しますが、それを実行しません。
もっと議論しましょう。
コード3

import os
def walk_dir(dirname):
        for d in os.listdir(dirname):
                path = os.path.join(dirname, d)
                if os.path.isdir(path):
                        for f in walk_dir(path):
                           pass
                else:
                        yield path

for file in walk_dir("/tmp"):
  print  file

なぜcode3は正しい答えを得られないのですか? :print f を for ループに追加するfor f in walk_dir(path)print f実行されないのに、なぜ pass を代用できないのですか?
関数の問題を考慮し、code2 を code4 に修正し、
code4

import os
def walk_dir(dirname):
        for d in os.listdir(dirname):
                path = os.path.join(dirname, d)
                if os.path.isdir(path):
                        walk_dir(path)                      
                else:
                        print  path

walk_dir("/tmp") を実行すると、適切な出力が得られます。


code4 を code5 code5に修正しましょう

import os
def walk_dir(dirname):
        for d in os.listdir(dirname):
                path = os.path.join(dirname, d)
                if os.path.isdir(path):
                        walk_dir(path)                      
                else:
                        yield  path

for file in walk_dir("/tmp"):
  print  file

code5 は正しく答えられません。
何か混乱しているように感じますが、はっきりさせてもらえますか?

4

3 に答える 3

3

彼らは同じことをしません。 yield呼び出し元に値を返します。 printに何かを書き込みますsys.stdout

ただし、この場合、呼び出し元がから値を取得するとyield、それを出力するだけなので、最終結果は同じです...

于 2013-02-22T14:35:08.090 に答える
2

yield後者のプログラムでは、最後のループですべてが出力されます。最後の行を次のように変更してみてください

print("Yielded: " + file)

私が何を意味するかを見るために。

于 2013-02-22T14:34:21.420 に答える
0

両方のコードで、f を印刷しています。最初のコードでは関数内で f を出力し、2 番目のコードでは最後のループで f を出力します。

コメントを見る...

コード 1

import os
def walk_dir(dirname):
        for d in os.listdir(dirname):
                path = os.path.join(dirname, d)
                if os.path.isdir(path):
                        for f in walk_dir(path):
                           print f # -----> You print f but don't runed it
                else:
                        yield path

for file in walk_dir("/tmp"):
  print  file

コード 2

import os
def walk_dir(dirname):
        for d in os.listdir(dirname):
                path = os.path.join(dirname, d)
                if os.path.isdir(path):
                        for f in walk_dir(path):
                           yield f # --> You don't print f but return f to the loop
                else:
                        yield path

for file in walk_dir("/tmp"):
  print  file
于 2013-02-22T14:40:14.570 に答える