for循环中的类型(Python)

2011-08-29 22:36:12 +08:00
 codeplay
最近在看《可爱的Python》
里面有这样一个脚本:
#-*- coding: utf-8 -*-
import os
for root,dirs,files in os.walk('/media/cdrom0')
print root,dirs,files
意思很简单,是遍历光盘文件系统,打印光盘上所有的目录和文件夹,这里有一个问题:root,dirs,files这三个变量是什么类型的呢?
4648 次点击
所在节点    问与答
4 条回复
bhuztez
2011-08-29 22:39:08 +08:00
是不是 print type(root), type(dirs), type(files) 就可以看类型了?
codeplay
2011-08-29 22:54:53 +08:00
这个倒是,我的意思怎么怎么突然冒出来root(字符串类型),dirs(List类型),files(List类型),python是怎么把它对应到当前根目录、子目录、文件的?

开始猜想是某种固定的全局变量,但我在python命令行中倒入os,然后敲type(root),提示root未定义

另外,怎么代码粘进去缩进没了?
CoX
2011-08-29 23:15:41 +08:00
>help(os.walk)
keakon
2011-08-29 23:33:36 +08:00
@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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/17487

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX