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不能得到正确答案?如果在 for 循环中添加 :print ffor f in walk_dir(path)并且print f不会运行,为什么我不能代入通过?
考虑函数问题,将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 ,在第二个代码中,您在最后一个循环中打印 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 回答