swe*_*wex 0 python recursion json yield nested-loops
我有嵌套的json对象它包含列表和dicts ..我想在里面搜索所有'foo'键.我正在尝试做递归生成器,但是在解析dunno的第二次调用时函数失败,为什么,我甚至只看到'in'输出一次.看起来翻译不会第二次进入解析等等.帮我理解哪里错了?
def parse(d,key):
print('in')
if type(d)==type({}):
if key in d:
yield d[key]
for k in d:
parse(d[k],key)
if type(d)==type([]):
for i in d:
parse(i,key)
Run Code Online (Sandbox Code Playgroud)
生成器不像协同程序那样工作.如果生成器函数以递归方式调用自身,则递归调用将生成另一个生成器对象.Control不会像Lua那样重新输入生成器代码,并且yield不会立即暂停整堆生成器调用.您必须迭代返回的生成器对象并生成其元素:
def parse(d,key):
print('in')
if type(d)==type({}):
if key in d:
yield d[key]
for k in d:
for item in parse(d[k],key):
yield item
if type(d)==type([]):
for i in d:
for item in parse(i,key):
yield item
Run Code Online (Sandbox Code Playgroud)
在Python 3.3中,yield from添加了委托给子生成器的语法,因此代码将减少到以下内容:
def parse(d,key):
print('in')
if type(d)==type({}):
if key in d:
yield d[key]
for k in d:
yield from parse(d[k],key)
if type(d)==type([]):
for i in d:
yield from parse(i,key)
Run Code Online (Sandbox Code Playgroud)
这具有自动处理的优势send,throw和一帮边缘的情况下,明确遍历子发生器不处理.