首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

纯新手请问python基础教程中一段代码的有关问题

2013-09-06 
纯新手请教python基础教程中一段代码的问题菜鸟学习python中,研读Hetland写的python基础教程,其中有一段这

纯新手请教python基础教程中一段代码的问题
菜鸟学习python中,研读Hetland写的python基础教程,其中有一段这个代码

def flat(nested):
    try:
        try: 
            nested+""
        except TypeError:
            pass
        else:
            raise TypeError
        
        for sublist in nested:
            for i in flat(sublist):
                yield i
    except:
        yield nested

nested=["foo",["var",["vazx"]]]


print list(flat(nested))

输出结果为['foo', 'var', 'vazx'],如果不用内部的那个try,也就是说。如果代码这样写:
def flat(nested):
    try:
        
        
        for sublist in nested:
            for i in flat(sublist):
                yield i
    except:
        yield nested

nested=["foo",["var",["vazx"]]]


print list(flat(nested))

那么输出的结果就为['f', 'o', 'o', 'v', 'a', 'r', 'v', 'a', 'z', 'x']
这里小弟的问题就是,删掉的那段try代码,也就是这段
try: 
            nested+""
        except TypeError:
            pass
        else:
            raise TypeError

它是如何做到在迭代的过程中把字符串看成整体而不是一个列表呢?原理是什么呢?书里没有写的很详细,小弟百思不得其解,望大牛赐教!!!


[解决办法]
这段代码是在用try...except实现goto。详细解释见注释。

def flat(nested):
    try:
        try: 
            nested+""        # 检测nested是否字符串(只有字符串才能和字符串相加,是则转到mark2,否则到mark1
        except TypeError:
            pass                # mark1:是列表,顺序执行到mark3
        else:
            raise TypeError     # mark2:字符串,转到mark4
        
        for sublist in nested:     # mark3
            for i in flat(sublist):
                yield i
    except:
        yield nested         # mark4

nested=["foo",["var",["vazx"]]]


print list(flat(nested))


不知道作者给出这个例子的环境是什么,我觉得这是个非常糟糕的例子。
[解决办法]
补充一下,try...except本来就是一种goto,例子中代码的问题是在用try..except代替类型检测。

In [22]: def flat(nested):
    ...:     if type(nested) == str:
    ...:         yield nested
    ...:     else:
    ...:         for sublist in nested:
    ...:             for item in flat(sublist):
    ...:                 yield item

In [23]: list(flat(["foo",["var",["vazx"]]]))
Out[23]: ['foo', 'var', 'vazx']

热点排行