2016-07-03 1 views
1

나는 재귀 함수에서 yield와 return의 사용법을 배우려고합니다. 나는 특정 값을 찾고있는 중첩 된 사전을 가지고있다. "항복"을 사용하는 경우yield가있는 파이썬 재귀와 중첩 된 사전으로 돌아 가기

는 다음과 같은 기능을 잘 실행하고 성공적으로 발견 된 값을 반환합니다 :

def findvalue (value, document): 
    if isinstance (document, list): 
     for d in document: 
      for result in findvalue(value, d): 
       yield result 
    if isinstance (document, dict): 
     for k,v in document.items(): 
      if v == value: 
       yield v 
      elif isinstance (v, dict): 
       for result in findvalue(value, v): 
        yield result 
      elif isinstance (v, list): 
       for d in v: 
        for result in findvalue(value, d): 
         yield result 

내가 발전기의 작동 방식을 이해하고 수율이하는 이유는 위의 코드에 무엇을. 이제 동일한 코드를 사용하지만 반환과 함께 빈 반환을 확인하기 위해 체크를 넣으면이 코드에서 빈 결과가 반환되기 때문에 여전히 "NoneType"반복 문제로 끝납니다 :

여기에 무엇이 누락 되었습니까?

+0

? 나는 당신의 문제를 이해하지 못합니다. 예상되는 결과와 주어진 입력에 대해 실제로 어떤 결과가 발생했는지 알려주십시오. 또한이 두 코드의 차이점 중 하나는 파이썬이'return' 문에 도달하지 않으면 (만족되는 조건이 없기 때문에) 함수의 끝에 도달하고'None'을 리턴한다는 것입니다. – freakish

+0

값과 중첩 된 사전이 함수에 전달되면 예상되는 결과는 반복되어야하며 해당 값의 인스턴스를 찾으면 호출자에게 반환하여 인스턴스가 특정 중첩 된 사전에서 발견되었음을 확인할 수 있도록합니다. "NoneType"문제는 "yield"대신 "return"을 사용하면 함수가 반복 할 수 없으며 "NoneType"오류가 발생하여 중지된다는 것입니다. 동일한 결과를 얻으려면 yield 문 대신 return 문을 사용할 수있는 방법을 찾으려고합니다. – mab

답변

0

나는 당신이 이것을 변경할 수 있다고 생각 : 여기에

for result in valuefind(value, v): 
        if result is not None: 
         return result 

:

는 "NoneType 반복 문제"무엇
return valuefind(value, v) 
+0

간헐적으로 작동합니다. 예를 들어, 10 번의 실행 결과를 찾거나 관련이없는 값 목록에 결과를 제공 할 수 있습니다. – mab