@
codeplay 要说明它的原理有点复杂,总的来说是这样的:os.walk()生成了一个generator对象,for循环会调用这个对象的next()方法,这个next方法返回了一个含3个元素的tuple,分别对应到root,dirs,files变量。
我的感觉是你似乎不太清楚for的这种用法,举个例子来说吧:
for x, y in [(1, 2), (3, 4)]:...
它实际上是这样的缩写:
for (x, y) in [(1, 2), (3, 4)]:...
于是第一次循环中,(x, y)就被带入了(1, 2),即
(x, y) = (1, 2)
而它又相当于
x = 1
y = 2
至于generator嘛,我就拿个简单的例子来说:
def f():
yield 1, 2
yield 3, 4
g = f()
print g.next()
print g.next()
print g.next()
输出结果是:
(1, 2)
(3, 4)
Traceback (most recent call last):
print g.next()
StopIteration
可以看到,每次next()方法都会返回yield表达式的结果,当没有更多的yield时,就会抛出StopIteration异常。
而用在for循环里的时候,Python runtime会自动捕捉StopIteration异常,并停止当前循环:
for x, y in f(): print x, y