1 回答

TA貢獻1864條經驗 獲得超2個贊
程序是對的, 給的例子也是對的, 我認為上面的程序不應當報錯.
這段程序設計flatten
函數的意義是將樹形結構按照深度優(yōu)先順序進行迭代. 可以實現將一個樹形結構"壓扁"成列表結構.
比如:
tree = [
['1', 2, [3]],
['4', 5]
]
list(flatten(tree)) # 得到 ['1', 2, 3, '4', 5]
而對于這段代碼
# 不迭代類似于字符串的對象
try:
nested + ''
except TypeError:
pass
else:
raise TypeError
注釋標明了是為了不迭代字符串對象. 如果缺少了這一段, 那么程序就會在遇到迭代對象中包含字符串的時候陷入一直迭代的無限循環(huán). 這是因為字符串也是可迭代對象.
比如輸入'abc'
, 那么原函數里層try語句就會raise TypeError
, 這個TypeError
被外層try語句except TypeError
捕捉到, 就直接將'abc'
作為迭代結果輸出去了.
如果輸入不可迭代對象, 比如123
, 那么在執(zhí)行nested + ''
的時候就會因為except TypeError
而pass
, 繼續(xù)執(zhí)行for sublist in nested
, 但是123
是int類型, 不是可迭代對象, 所以會拋出TypeError: 'int' object is not iterable
, 這個錯誤同樣被外層的try語句捕捉到, 123
就作為迭代結果輸出.
只有非字符串的可迭代對象才會進入for sublist in nested
中.
如果缺少了里面那個try語句, 那么就會執(zhí)行for sublist in nested:
, 這里的nested
就是'abc'
, 那么就會迭代'a', 'b', 'c'
, 迭代到'a'
的時候返回'a'
, 由于'a'
又是可迭代的, 于是又迭代返回'a'
, 這樣程序就會陷入一直迭代'a'
的無限循環(huán)過程, 最后會拋出RecursionError
.
所以flatten
這個函數的設計是沒問題的, 它完成了設計者期待它需要實現的功能.
添加回答
舉報