V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
codeplay
V2EX  ›  问与答

for循环中的类型(Python)

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

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

    另外,怎么代码粘进去缩进没了?
    CoX
        3
    CoX  
       2011-08-29 23:15:41 +08:00
    >help(os.walk)
    keakon
        4
    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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1527 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 16:52 · PVG 00:52 · LAX 09:52 · JFK 12:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.