while-loops内の小さなコード冗長性(きれいに感じない)
-
05-10-2019 - |
質問
したがって、Pythonでは(多くの言語に適用できると思いますが)、私はこのようなことを非常に頻繁に見つけます。
the_input = raw_input("what to print?\n")
while the_input != "quit":
print the_input
the_input = raw_input("what to print?\n")
多分私はあまりにもうるさいですが、私はラインがどのように好きではありません the_input = raw_input("what to print?\n")
繰り返さなければなりません。保守性と組織を減らします。しかし、問題をさらに悪化させることなく、重複コードを避けるための回避策はありません。いくつかの言語では、私はこのようなものを書くことができます:
while ((the_input=raw_input("what to print?\n")) != "quit") {
print the_input
}
これは間違いなくです いいえ Pythonic、およびPythonは、ループ条件内での割り当てさえ許可していません。
この有効なコードは、冗長性を修正します。
while 1:
the_input = raw_input("what to print?\n")
if the_input == "quit":
break
print the_input
しかし、まったく正しいとは感じません。 while 1
このループが永遠に実行されることを意味します。私はループを使用していますが、偽の状態を与え、本物の状態をその中に置いています。
私はあまりにもうるさいですか?これを行うためのより良い方法はありますか?おそらく、私が知らないこのために設計されたいくつかの言語構造がありますか?
解決
考え イテレーター - たとえば、この特定の場合:
for the_input in iter(lambda: raw_input('what to print?\n'), 'quit'):
print the_input
Pythonのほとんどのループは、抽象化の最低レベルを除き、として最もよく実装されています for
「ループロジック」をキャプチャするいくつかのアンダーリングイテレーターの助けを借りてループ - iter
組み込みは(こちらのように)役立つことがあります。 itertools
救助に来ます。
ほとんどの場合、カスタムをコーディングすることを選択します ジェネレーター機能 (使用するもの yield
)、またはそれ以上(本当に洗練された状態管理が必要なとき)カスタム イテレータークラス (1つを定義します __iter__
特別な方法として return self
, 、 と next
[また __next__
Pythonの最新バージョンで]]を返します。「反復から次の値)。
ループロジックをキャプチャして、あなたが何であれ、 行う ループ自体によって順番に作成されたさまざまなアイテムについては、ここで重要な抽象化ヘルパーです!