這是我的樹,一個嵌套的字典
tree = {"root":
{"branch_a": {"branch_aa": 0, "branch_ab": 1},
"branch_b": 1,
"branch_c": {"branch_ca": {"branch_caa": 0}}}}
我設法撰寫了一個列印所有葉子的函式
def print_leaves(tree):
if not hasattr(tree, "__iter__"):
print(tree)
elif isinstance(tree, dict):
for branch in tree.values():
print_leaves(branch)
產生所需的輸出
0
1
1
0
在這一點上,我認為將操作(在本例中為列印)與對葉子的訪問分離會很好。所以我稍微修改了上面的函式,把它變成了一個生成器,并在一個for回圈中移動了列印部分。
def generate_leaves(tree):
if not hasattr(tree, "__iter__"):
yield tree
elif isinstance(tree, dict):
for branch in tree.values():
generate_leaves(branch)
for leaf in generate_leaves(tree):
print(leaf)
......不幸的是,這不起作用。
首先為什么,它不起作用?然后,當然,如何正確撰寫葉生成器?
uj5u.com熱心網友回復:
您沒有使用遞回呼叫的結果。對print_leaves沒有回傳值的有效,但對帶有returnor的函式無效yield。
這是長版:
def generate_leaves(tree):
if not hasattr(tree, "__iter__"):
yield tree
elif isinstance(tree, dict):
for branch in tree.values():
for leaf in generate_leaves(branch):
yield leaf
for leaf in generate_leaves(tree):
print(leaf)
幸運的是,我們可以通過以下方式縮短它yield from:
def generate_leaves(tree):
if not hasattr(tree, "__iter__"):
yield tree
elif isinstance(tree, dict):
for branch in tree.values():
yield from generate_leaves(branch)
for leaf in generate_leaves(tree):
print(leaf)
請注意,您只需要if / else一個條件;不需要if / elif有兩個冗余條件:
def generate_leaves(tree):
if not isinstance(tree, dict):
yield tree
else:
for branch in tree.values():
yield from generate_leaves(branch)
for leaf in generate_leaves(tree):
print(leaf)
資源關于yield from:
- PEP-0380 ;
- 在實踐中,Python 3.3 中新的“yield from”語法的主要用途是什么?
- 生成器可以遞回嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/380103.html
上一篇:如果大小寫等于某事,則減去日期
