2016-07-03 8 views
1

私は、再帰関数でyieldとreturnの使い方を学んでいます。私は特定の価値を探しているネストされた辞書を持っています。 「歩留まり」を使用している場合yieldを持つPython再帰とネストされた辞書の戻り

は、以下の機能が正常に動作して成功した値を返します。

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"という繰り返しの問題が発生します。

私はここで何が欠けていますか?これに

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

+0

"NoneType反復の問題" とは何ですか?私はあなたの問題を理解していません。期待される結果と、実際に入力があった場合、何が起こっているか教えてください。また、これら2つのコードの違いの1つは、Pythonが 'return'ステートメントに達していない場合(条件が満たされていないため)、関数の最後に到達し、' None'を返します。 – freakish

+0

値とネストされたディクショナリが関数に渡されるとき、期待される結果は反復すべきであり、その値のインスタンスが見つかった場合はそれを呼び出し側に返し、インスタンスが特定のネストされた辞書に見つかったことを確認できるようにします。 "NoneType"の問題は、 "yield"の代わりに "return"を使用すると、関数が反復できなくなり、 "NoneType"というオブジェクトが反復不可能なエラーで停止することです。私は同じ結果を達成するためにyieldステートメントの代わりにreturnステートメントを使用する方法を見つけようとしています。 – mab

答えて

0

私はあなたがこれを変更することができると信じて

return valuefind(value, v) 
+0

これは断続的に機能します。例えば、10回の実行で結果を見つけたり、無関係な値のリストに結果を提供することができます。 – mab

関連する問題