摘要:在所寫的暢銷書籍基礎教程中講到了遞歸生成器的用法。二易懂的程序其實,遞歸生成器非常簡單,主要分為兩部分基線條件和遞歸條件。我們以易懂通俗的方式來解釋遞歸生成器的用法,并且依次打印列表中的數字。
? ? ? ? 在Magnus Lie Hetland所寫的暢銷書籍《Python基礎教程》中講到了遞歸生成器的用法。其中,作者舉了一個例子,假設有一個列表nested:
nested = [[[1],2],3,4,[5,[6,7]]]
????????如果我們想要依次打印列表中的數字,需要用到遞歸生成器,作者Magnus Lie Hetland給出的程序如下:?
def flatten(nested): try: for sublist in nested: for element in flatten(sublist): yield element except TypeError: yield nested
? ? ? ? 輸出得到的結果:
list(flatten(nested))
? ? ? ? 毫無疑問,上述程序得到的結果是正確。但是,作者所寫的程序讓人不敢恭維。我剛開始看的時候是一頭霧水,等看了很多遍后,才理解了程序想要表達的意思。可以這么說,作者的這段代碼并不適合用來教學,因為這段代碼晦澀難懂。
????????其實,遞歸生成器非常簡單,主要分為兩部分:基線條件和遞歸條件。Magnus Lie Hetland直接將try..except...語句的來作為基線條件和遞歸條件,實在有點讓人難以理解。
? ? ? ? 我們以易懂通俗的方式來解釋遞歸生成器的用法,并且依次打印列表nested中的數字。
? ? ? ? 基線條件很簡單,如果迭代的元素是數字,那么直接yield該元素。
? ? ? ? 如果迭代的元素不是數字,則繼續繼續迭代。
def flatten(nested): for sublist in nested: #基線條件 if isinstance(sublist,int): yield sublist #遞歸條件 else: for element in flatten(sublist): yield element
? ? ? ? ?此段代碼看起來更加簡潔明了、通俗易懂,將遞歸生成器的原理展現的淋漓盡致。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/122202.html
摘要:與子生成器是開始引入的新特性。我們把這種一個生成器中調用的另一個生成器叫做子生成器,而這個子生成器由關鍵字生成。由于子生成器很常用,所以引入了新的語法來簡化這個代碼。下次,會繼續對之前的結果進行乘方,直到結果超過為止。 Python高級語法中,由一個yield關鍵詞生成的generator生成器,是精髓中的精髓。它雖然比裝飾器、魔法方法更難懂,但是它強大到我們難以想象的地步:小到簡單的...
摘要:第四種選擇是在不同的線程中運行生產者和消費者。包含語句的函數被稱為生成器函數。然后引發一個異常,表明迭代器已經耗盡。換句話說,未捕獲的異常終結了生成器的使用壽命。 showImg(https://segmentfault.com/img/bVbntUq?w=4272&h=2848);我正打算寫寫 Python 的生成器,然而查資料時發現,引入生成器的 PEP 沒人翻譯過,因此就花了點時...
摘要:下例實現了一個數組的迭代器在中,可迭代數據結構比如數組都必須實現一個名為的方法,該方法返回一個該結構元素的迭代器。原話是還可以傳遞返回值。 前記 按照規劃,明年年中,ECMAScript 6(ES6)就要正式發布了。 最近抽空看了Dr. Axel Rauschmayer的幾篇文章和演講PPT,對新特性有了些了解。 趁沒忘,抓緊記錄下,夾雜自己的感受。 計劃分三部分: 新語法...
閱讀 1412·2021-10-11 10:59
閱讀 3112·2019-08-30 15:54
閱讀 2732·2019-08-30 13:19
閱讀 2461·2019-08-30 13:02
閱讀 2374·2019-08-30 10:57
閱讀 3355·2019-08-29 15:40
閱讀 985·2019-08-29 15:39
閱讀 2308·2019-08-29 12:40