11

したがって、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、このループが永久に実行されることを意味します。私はループを使用していますが、それに偽の状態を与え、その中に本物を入れています。

私はうるさいですか?これを行うより良い方法はありますか?おそらく、私が知らないこのために設計された言語構造がありますか?

4

1 に答える 1

30

イテレータを考えてみてください。たとえば、この特定のケースでは次のようになります。

for the_input in iter(lambda: raw_input('what to print?\n'), 'quit'):
    print the_input

Python のほとんどのループは、抽象化の最も低いレベルを除いてfor、「ループ ロジック」をキャプチャするいくつかの基になるイテレータの助けを借りてループとして実装するのが最適iterです。式) を使用することができますが、標準ライブラリ モジュールitertoolsが助けになることがあります。

ほとんどの場合、カスタムジェネレーター関数( を使用する関数yield) をコーディングするか、(非常に洗練された状態管理が必要な場合) カスタムイテレーター クラス__iter__(特別なメソッドをreturn self, およびnext[[または__next__Python の最新バージョンで]として定義するクラス) をコーディングすることを選択します。 ] を使用して「反復からの次の値」を返します)。

ループ自体によって順次生成されるさまざまなアイテムに対して行うこととは別に、ループ ロジックをキャプチャすることが、ここでの重要な抽象化ヘルパーです。

于 2010-05-31T03:50:43.260 に答える