2016-09-06 2 views
0

작동하지 I 후속 코드를 가지고 :파이썬 - 재귀

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을 사용하고 있습니다.)을 시도 할 때 단순히 호출 할 수 없으며 함수 호출이 "과도한 실행"입니다.

내가 뭘 잘못하고 있니? 왜 함수가 재귀 적으로 호출되지 않습니까?

+0

'yield from parseDics (vals,'vals ')'? –

+0

당신의 코드는 키가'solve' 또는'vals'인지 검사 만합니다.'subsolve'를 키로 사용하는 사전 항목으로 결코 회귀하지 않습니다. – Dunes

답변

1

실제로 재귀 호출의 결과로 무언가를 수행해야합니다. 값과 함께 yield을 사용하고 있으므로이 값을 사용해야 할 수도 있습니다.

1

파이썬 3.4에서 파이썬 2, yield from parseDics(vals, 'vals')를 사용할 수 있습니다

for val in parseDics(vals, 'vals'): 
    yield val 
2

parseDics 그것은 발전기의 정규 함수가 아닙니다. 따라서 일반 함수가 아닌 발전기처럼 호출해야합니다. 그렇지 않으면 작동하지 않습니다. 첫 번째 호출은 list(parseDicts(...))을 호출 할 때 목록 생성자가 생성자로 parseDicts을 호출하기 때문에 작동합니다. 그러나 parseDicts에서 재귀 적으로 parseDicts을 호출하려고 시도하지만 작동하지 않습니다.

변경은 재귀 호출 파이썬을 사용하는 경우 yield from를 사용하는 3.3 이상 : 파이썬의 이전 버전

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) 

, 당신은 그 재귀 호출을 반복하고 생성 각 값을 산출해야합니다 :

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]