首页 新闻 会员 周边 捐助

这个生成器是怎么运行的

0
悬赏园豆:15 [待解决问题]

对于flatten函数中的递归,按照我的理解应该是列表中每一个都会分解到不能分解,然后进入到TypeError的异常处理,执行yield nested语句。我知道实际情况并不是这样,所以想请大神解答一下这个flatten函数到底是怎么执行的,怎么进入for循环中的yield i语句。还有一点疑问就是对于print('i='+i+'!!') 这一条语句为什么不能输出,去掉i变量之后就可以,是因为生成器的缘故吗?Python新人,望大神解答

代码如下

def flatten(nested):
    try:
        try:
            nested + ' '
        except TypeError:
            pass
        else:
            raise TypeError
        for sublist in nested:
            for i in flatten(sublist):
                #pass
                #print('i='+i+'!!') 不能输出内容
                print('!!')
                yield i
                

    except TypeError:
        yield nested



nested = [[1,2,3],[2,3],1,'abc']
for num in (flatten(nested)):
    print(num)
HHello_World的主页 HHello_World | 初学一级 | 园豆:191
提问于:2017-08-28 12:40
< >
分享
所有回答(2)
0

实际情况就是你分析的那样,print语句不能输出是因为字符串不能和数字相加产生TypeError异常

Uteki | 园豆:573 (小虾三级) | 2017-08-29 14:24

 我把输出改了之后发现可以了,谢谢,不过那条语句就在yield i 前面,按理说这条输出语句执行那么yield i也应该执行,按照我的想法是不能进入内层循环,所以觉得还是不太对

支持(0) 反对(0) HHello_World | 园豆:191 (初学一级) | 2017-08-29 20:17

@HHello_World: 因为异常了,所以yield没有执行

支持(0) 反对(0) Uteki | 园豆:573 (小虾三级) | 2017-08-30 10:04

@Uteki: 我没太懂……print语句都可以执行,说明进了内层循环,为什么又异常了

支持(0) 反对(0) HHello_World | 园豆:191 (初学一级) | 2017-08-30 15:37

@HHello_World: 

print('i='+i+'!!') #不能输出内容

这里i与字符串相加可能会产生TypeError异常,然后直接跳到了yield nested

支持(0) 反对(0) Uteki | 园豆:573 (小虾三级) | 2017-08-31 10:10

@Uteki: 我把这个改了,不会产生异常,可以正常输出,说明进了内层循环

支持(0) 反对(0) HHello_World | 园豆:191 (初学一级) | 2017-09-13 10:57
0

try语句会把错误屏蔽掉。会带来困扰。不要乱用。

如果一定要用可以这样打印捕捉到的信息。

except as e:
print(e)
墨镜带佬星 | 园豆:2310 (老鸟四级) | 2017-09-12 07:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册