質問

したがって、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の最新バージョンで]]を返します。「反復から次の値)。

ループロジックをキャプチャして、あなたが何であれ、 行う ループ自体によって順番に作成されたさまざまなアイテムについては、ここで重要な抽象化ヘルパーです!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top