2017-11-28 13 views
2

私はPythonでwhileループについて質問をします。 コードがループに断線がないwhileループを停止する方法は?

def batched(iterator, batch_size): 

    while True: 
     data = np.zeros(batch_size) 
     target = np.zeros(batch_size) 
     for index in range(batch_size): 
      data[index], target[index] = next(iterator) 

     yield data, target 

batches = batched(examples, params.batch_size) 

for index, batch in enumerate(batches): 
    ....... 
    ....... 

下にあり、それは永遠に真続けるので、このループはどのように停止することができます。 ps。このコードは、TensorFlow for Machine Intelligenceの本の例です。

+2

'batched'はイテレータです。 'yield'は、イテレータが次に呼び出されるまでループを一時停止します。したがって、反復( 'for'ループ)が終了条件を持っていれば、良いことです! Pythonで 'iterators'を読んでみると、いくつかのことがクリアされるはずです。 – Harsh

答えて

1

これはPythonジェネレータです。一度呼び出す通常の関数とは異なり、終了するまで待って戻り値を取得します。これは、外出先でデータを生成するために使用され、これらの結果はyieldキーワードから得られます。 無限ループがyieldキーワードにヒットするたびに、現在のデータとターゲットが返され、それが続けられます。発電機の最も単純な使用は、forループである:

for data, target in batched(iterator, batch_size): 
    # do Something 

一度このループ分割用のwhileループ改、(任意のより多くのデータをフェッチしていません)。

あなたはここにいくつかの例を見つけることができます:https://wiki.python.org/moin/Generators#line-60

を、私は、彼らが発電機内部で無限ループを使用するすべての例を見つけることができませんでしたが、コンセプトは単純です:あなたの関数は、結果の無限の量を生成することができます(フィボナッチ数が可能)、必要に応じてブレークするforループにコントロールを渡しています。

2

私はこの回答を書いています。コメントのセクションはあまりにも厳しいようでした。

まず、Pythonで約Iteratorsを読み上げると、混乱が解消されます。

私はとにかく説明しようとします! :D


def batched(iterator, batch_size): 

    while True: 
     data = np.zeros(batch_size) 
     target = np.zeros(batch_size) 
     for index in range(batch_size): 
      data[index], target[index] = next(iterator) 

     yield data, target 

batchedは、発電/イテレータ関数です。ここの鍵はyieldです。プログラムフローがyieldに達すると、この関数は値を返します(ここではdata, target)。 しかし、キャッチは、のみ次回呼び出すときは、最後にyieldedだったところから流れ続けます。この例では、次回関数が呼び出されると、ループが先頭から開始されます。

break条件なしでwhile True:ループが誤っている可能性があるため、batchedはブロック機能呼び出しではありません。

また、

batches = batched(examples, params.batch_size) 

は、関数呼び出しではない、ということに注意します。上記の行を実行すると、イテレータへのポインタが得られます。この関数は、反復処理されたときにのみ実行されます。あなたのために

が、それはここで行われています:ターミネータ条件がループ内で処理されていない場合

for index, batch in enumerate(batches): 

をここで再び、forループは無限ループに陥るでしょう。つまり、ループはforループ内のbreakで手動で終了する必要があります。

+0

あなたの答えをありがとう、今私はそれについて明確です! –

+0

ようこそ。あなたは適切な答えを受け入れることができます! – Harsh

-1

簡単な答えは、終了したい条件にtrueを変更するか、ループ内に "break"を含むif文を作成します。

関連する問題