对于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)
实际情况就是你分析的那样,print语句不能输出是因为字符串不能和数字相加产生TypeError异常
我把输出改了之后发现可以了,谢谢,不过那条语句就在yield i 前面,按理说这条输出语句执行那么yield i也应该执行,按照我的想法是不能进入内层循环,所以觉得还是不太对
@HHello_World: 因为异常了,所以yield没有执行
@Uteki: 我没太懂……print语句都可以执行,说明进了内层循环,为什么又异常了
@HHello_World:
print('i='+i+'!!') #不能输出内容
这里i与字符串相加可能会产生TypeError异常,然后直接跳到了yield nested
@Uteki: 我把这个改了,不会产生异常,可以正常输出,说明进了内层循环
try语句会把错误屏蔽掉。会带来困扰。不要乱用。
如果一定要用可以这样打印捕捉到的信息。
except as e:
print(e)