Python-递归不起作用
我有以下代码:Python-递归不起作用,python,python-3.x,dictionary,recursion,pycharm,Python,Python 3.x,Dictionary,Recursion,Pycharm,我有以下代码: d = {'init': [{'solve': [{'subsolve': [{'vals': [{'Blade summary': 'asdf'}, {'Blade summary': 'fdsa'}]}]}, {'subsolve':
d = {'init':
[{'solve':
[{'subsolve':
[{'vals': [{'Blade summary': 'asdf'},
{'Blade summary': 'fdsa'}]}]},
{'subsolve':
[{'vals': [{'Blade summary': 'ffff'}]}]}]},
{'solve':
[{'subsolve':
[{'vals': 'bbbb'}]}]}]}
def parseDics(lst, mainReg):
print('call')
for dic in lst:
for key, vals in dic.items():
if key == mainReg:
if mainReg == 'vals':
yield vals
parseDics(vals, 'vals')
else:
parseDics(vals, mainReg)
if __name__=='__main__':
pp.pprint(list(parseDics(d['init'], 'solve')))
函数本身并不完整,但目前这不是问题。问题是,递归调用似乎不起作用
如果我现在尝试运行它,我将只获得以下输出:
call
[]
所以这个函数只被调用了一次。当我尝试单步执行嵌套函数调用(我使用的是PyCharm)时,我根本无法执行,并且函数调用是“过度的”
我做错了什么?为什么不递归调用我的函数?您需要实际处理递归调用的结果。因为您使用的是
yield
值,所以您可能也需要在那里使用它。您需要实际处理递归调用的结果。由于您使用的是带值的yield
,因此可能也需要在那里使用它。在Python 3.4中,您可以使用parseDics的yield(vals,'vals')
,对于Python 2:
for val in parseDics(vals, 'vals'):
yield val
在Python3.4中,您可以使用Python2的
yield from parseDics(vals,'vals')
:
for val in parseDics(vals, 'vals'):
yield val
parseDics
不是一个常规函数,它是一个生成器。因此,您需要像调用生成器一样调用它,而不是调用常规函数,否则它将无法工作。第一个调用之所以有效,是因为当您调用list(parseDicts(…)
时,列表构造函数将parseDicts
作为生成器调用。但是在parseDicts
中,您尝试将parseDicts
作为一个函数递归调用,但这不起作用
如果您使用的是Python 3.3+,请将递归调用更改为使用yield from
:
def parseDics(lst, mainReg):
print('call')
for dic in lst:
for key, vals in dic.items():
if key == mainReg:
if mainReg == 'vals':
yield vals
yield from parseDics(vals, 'vals')
else:
yield from parseDics(vals, mainReg)
对于较旧版本的Python,您需要迭代这些递归调用并生成生成以下值的每个值:
def parseDics(lst, mainReg):
print('call')
for dic in lst:
for key, vals in dic.items():
if key == mainReg:
if mainReg == 'vals':
yield vals
for val in parseDics(vals, 'vals'):
yield val
else:
for val in parseDics(vals, mainReg):
yield val
将生成器作为函数调用只会创建生成器,而不会运行它。例如:
>>> def my_gen():
print("my_gen()")
for i in range(5):
print(i)
yield i
>>> my_gen()
<generator object my_gen at 0x00000000045B6B48>
>>> list(my_gen())
my_gen()
0
1
2
3
4
[0, 1, 2, 3, 4]
>>定义my_gen():
打印(“my_gen()”)
对于范围(5)中的i:
印刷品(一)
产量一
>>>我的_根()
>>>列表(my_gen())
我的_根()
0
1.
2.
3.
4.
[0, 1, 2, 3, 4]
parseDics
不是一个常规函数,它是一个生成器。因此,您需要像调用生成器一样调用它,而不是调用常规函数,否则它将无法工作。第一个调用之所以有效,是因为当您调用list(parseDicts(…)
时,列表构造函数将parseDicts
作为生成器调用。但是在parseDicts
中,您尝试将parseDicts
作为一个函数递归调用,但这不起作用
如果您使用的是Python 3.3+,请将递归调用更改为使用yield from
:
def parseDics(lst, mainReg):
print('call')
for dic in lst:
for key, vals in dic.items():
if key == mainReg:
if mainReg == 'vals':
yield vals
yield from parseDics(vals, 'vals')
else:
yield from parseDics(vals, mainReg)
对于较旧版本的Python,您需要迭代这些递归调用并生成生成以下值的每个值:
def parseDics(lst, mainReg):
print('call')
for dic in lst:
for key, vals in dic.items():
if key == mainReg:
if mainReg == 'vals':
yield vals
for val in parseDics(vals, 'vals'):
yield val
else:
for val in parseDics(vals, mainReg):
yield val
将生成器作为函数调用只会创建生成器,而不会运行它。例如:
>>> def my_gen():
print("my_gen()")
for i in range(5):
print(i)
yield i
>>> my_gen()
<generator object my_gen at 0x00000000045B6B48>
>>> list(my_gen())
my_gen()
0
1
2
3
4
[0, 1, 2, 3, 4]
>>定义my_gen():
打印(“my_gen()”)
对于范围(5)中的i:
印刷品(一)
产量一
>>>我的_根()
>>>列表(my_gen())
我的_根()
0
1.
2.
3.
4.
[0, 1, 2, 3, 4]
从parseDics(vals,'vals')中获得收益。
您的代码只检查键是solve
还是vals
,它永远不会递归到具有子solve
作为键的字典项。从parseDics(vals,'vals')
?您的代码只检查键是solve
还是vals
,它永远不会递归到具有subsolve
键的字典项中。