Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-递归不起作用_Python_Python 3.x_Dictionary_Recursion_Pycharm - Fatal编程技术网

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
键的字典项中。