2013-02-22 68 views
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 

当代码1和代码2来看,得到的结果相同,我想知道为什么吗? 为什么yield fprint f可以得到相同的效果?

as Vanesa Milagros Fernandez say:print f#----->你打印f但是不要管它。
让我们来进一步讨论。
CODE3

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 in for循环for f in walk_dir(path)print f将不会运行,为什么我不能通过检索?
考虑功能问题,修改代码2成码4,
码4

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目录”),我得到正确的输出。

让我们修改码4到代码4
代码4

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 

代码4不能得到正确的amswer。
我觉得有什么困惑我,你能让我清楚吗?

回答

2

在后一个程序中,所有yield都打印在循环结尾处。尝试更改最后一行到

print("Yielded: " + file) 

看看我的意思。

3

他们不这样做。 yield将值发回给调用者。 print写东西到sys.stdout

在这种情况下,然而,当主叫用户得到一个值从yield回来,它只是打印,所以最终的结果是一样的...

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