在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中的數字,
1、基線條件
基線條件很簡單,如果迭代的元素是數字,那么直接yield該元素,
2、迭代條件
如果迭代的元素不是數字,則繼續繼續迭代,
def flatten(nested):
for sublist in nested:
#基線條件
if isinstance(sublist,int):
yield sublist
#遞回條件
else:
for element in flatten(sublist):
yield element
此段代碼看起來更加簡潔明了、通俗易懂,將遞回生成器的原理展現的淋漓盡致,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/308770.html
標籤:python
下一篇:Python 3,一行代碼處理各種時間轉換,從此跟datetime,time模塊說拜拜 ~ ~ 不收藏算我輸!!!
