以下是書中一道例程:
def flatten(nested):
try:
# 不迭代類似于字符串的對象
try:
nested + ''
except TypeError:
pass
else:
raise TypeError
for sublist in nested:
for element in flatten(sublist):
yield element
except TypeError:
yield nested
a = list(flatten([[[1], 'abc'], 3, 4, [5, [6, 7]], [[[8, 9, 10], 11], 12], 13, 14]))
print(a)
按照如書上所說,上面的程序應當報錯,可是實際我在pycharm中運行卻是成功的,方法定義部分和書中一樣,我只是在后面添加了輸出語句。實在不明白其中的原理,尤其是raise TypeError,講其換作raise SyntaxError后,程序就能報錯了,我在想是不是兩個TypeError會有什么相互作用嗎?求解...程序是對的, 給的例子也是對的, 我認為上面的程序不應當報錯.
這段程序設計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這個函數的設計是沒問題的, 它完成了設計者期待它需要實現的功能.
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數據專業(yè)的國家
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產業(yè)為響應國家深化產教融合/校企合作的政策,積極推進“中國制造2025”,實現中華民族偉大復興的升級產業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯想擔任系統開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經理從事移動互聯網管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經理職務負責iOS教學及管理工作。
浪潮集團項目經理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網頁制作和網頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經驗。曾經歷任德國Software AG 技術顧問,美國Dachieve 系統架構師,美國AngelEngineers Inc. 系統架構師。