2017-01-26 8 views
2

私はいくつかのデータを削除しようとする関数remove_it()があり、削除されたデータはセットremovedに追加されています。メインロジックは削除する方がいる場合は、削除しておくことで、私のコードは次のようになります。それは私を少し気により良いwhileループ構造のPython

removed = set() 
    prev_count = -1 

    while prev_count != len(removed): 
     prev_count = len(removed) 
     remove_it() 

whileループ条件と次の行がお互いに非常に似ていること。それは正常ですか、それとももっと良い方法ですか?

ロジックは非常に複雑です。いくつかのグラフ構造トポロジを検出し、削除の各ラウンド後にトポロジが変化し、削除が完了するまでどのように変化するかわかりません。

私はremove_it()から復帰ブール値を考えて、セットremovedが変更されたかどうかを追跡しました。それで、whileループは、私にも奇妙な、

while remove_it(): 
    pass 

のようになります。より良い方法がありますか?

+0

あなたはデータの例を挙げることができますか?問題をよりよく理解するのに役立ちます/最適な解決策を提案してください – epattaro

+0

面白いです。私のより強い言葉であるCでは、while(function()); * *明示的*セミコロンに注意してください。 Pythonのようなものはありませんか? – usr2564301

+2

2番目はかなり自然です。おそらく 'remove() 'という名前に変更され、実行されます。つまり、削除しているうちに、続行します。 –

答えて

2

remove_it機能には副作用があり、プログラムを読みにくくします。グローバルremoved変数を変更する代わりに、削除された値のセットを返すように書き換えることができます。次にループを書き直すことができます:

removed = set() 

while True: 
    removed_batch = remove_it() 
    if removed_batch: 
     removed += removed_batch 
    else: 
     break 
+0

関数は、スコープの外側で機能するときに、それがやったことや真偽の値を返すようになりました。使い方についてはもっと慣用で、長期的には保守しやすくなりました。 – Tensibai