⇦
2020-08-21
yield
This post shows a simple python/js pattern for recursing through code that probably should get a bit more usage.
Say you have the following data:
tree = {
"a": 4,
"children": [
{
"a": 3,
"children": []
},
{
"a": 2,
"children": [
{
"a": 6,
"children": []
}
]
},
]
}
And you want to get all the a values greater than 2.
In python, the "classic" way would be to do:
def greater_than_2(t):
a, children = t["a"], t["children"]
accumulated = ()
if a > 2:
accumulated += (a, )
for child in children:
accumulated += greater_than_2(child)
return accumulated
greater_than_2(tree)
That will give you: (4, 3, 6).
I find it is often more natural to use yield:
def greater_than_2(t):
a, children = t["a"], t["children"]
if a > 2:
yield a
for child in children:
yield from greater_than_2(child)
tuple(greater_than_2(tree))
A near identical solution can be achieved with modern js (this may surprise any python devs that haven't seen the language for a while 😊 ):
function* greater_than_2(t){
const {a, children} = t
if (a > 2) yield a
for (const child of children) yield* greater_than_2(child)
}
[...greater_than_2(tree)]