第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

《Python基礎教程》里P121有關生成器處理多層嵌套列表的問題

《Python基礎教程》里P121有關生成器處理多層嵌套列表的問題

拉風的咖菲貓 2019-02-26 02:29:36
以下是書中一道例程: 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會有什么相互作用嗎?求解...
查看完整描述

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 TypeErrorpass, 繼續(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這個函數的設計是沒問題的, 它完成了設計者期待它需要實現的功能.

查看完整回答
反對 回復 2019-03-01
  • 1 回答
  • 0 關注
  • 517 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號