#你想将一個多層嵌套的序列展開成一個單層清單,可以寫一個yield from 語句的遞歸生成器來輕松解決這個問題
from collections import Iterable
def flatten(items,ignore_types=(str,bytes)):
for x in items:
if isinstance(x,Iterable) and not isinstance(x,ignore_types): #可疊代但是不是字元串和bytes對象
yield from flatten(x)
else:
yield x
items = [1,2,[3,4,[5,6],7],8]
for x in flatten(items):
print(x)
#上面代碼中,isinstance(x,Iterable)檢查某個元素是否是可疊代的。如果是,yield from就會傳回所有子例程的值。
#最終傳回結果就是一個沒有嵌套的簡單序列
#ignore_types和檢測語句isinstance(x,ignore_types)用來将字元串和位元組排除在可疊代對象外,防止将他們再展開成單個字元
items=['dave','paula',['thomas','lewis']] #這樣字元串數組也能滿足我們的要求
for x in flatten(items):
print(x)
#語句yield from 在你想在生成器中調用其他生成器作為子例程的時候非常有用。若不适用它,就必須寫額外for循環
def flatten(items,ignore_types=(str,bytes)):
for x in items:
if isinstance(x,Iterable) and not isinstance(x,ignore_types):
for i in flatten(x): #雖然改了一點點,但是yield from效果更好
yield i
else:
yield x