2009-05-28 10 views
21

私はwhileループまたはforループをPythonで使用する必要があるときに問題を発見しています。人々はforループ(コード行が少ない?)を好んで使うようです。私はどちらか一方を使用すべき特定の状況はありますか?それは個人的な好みの問題ですか?私が今までに読んだコードは、それらの間に大きな違いがあると私に思いました。Pythonで "while"または "for"を使用する場合

答えて

48

はい、しばらくの間とするための大きな違いがあります。

ステートメントは、コレクションまたは反復可能なオブジェクトまたはジェネレータ関数を反復します。

ステートメントは、条件がFalseになるまで単純にループします。

好ましくないです。これは、あなたのデータ構造が何であるかの問題です。

多くの場合、処理する値をrange(実際のリスト)またはxrange(値を生成する)として表します。これにより、ステートメントのに合わせたデータ構造が得られます。

しかし、一般的には、セット、タプル、リスト、マップ、文字列などの既製のコレクションがあります。したがって、をループとして使用するだけです。

場合によっては、私たちのためにいくつかの機能プログラミング処理が行われることがあります。その場合、その変換を繰り返しの一部として適用できます。 sortedおよびenumerate関数は、ステートメントの場合はと自然に適合するイテレートに変換を適用します。

繰り返し処理を行うための整然としたデータ構造がない場合、または処理を駆動するジェネレータ関数を持たない場合は、を入力し、を入力する必要があります。

+0

+1これは私が*言いたかったことです:) –

+0

コンラッドの例のように、私はそれを得たと思います。その可読性の問題は、両方の反復を使用することができますが、より曖昧なデータ構造のためにWhileを使用することが推奨されます。 – Fabio

+4

@fabio: "その読みやすさの問題です。"いいえ、それはアルゴリズムとデータ構造のマッチングの問題です。思考や「優先」はありません。それは簡単です。 **不可能でない限り使用してください。**何らかの理由でforが不可能な場合、** while **。 –

12

forは、より簡単で読みやすいため、リストを反復するためにはより多くの選択肢があります。例えば

この:

for i in range(11): 
    print i 

がはるかに簡単かつこれよりも読みやすいです:

i = 0 
while i <= 10: 
    print i 
    i = i + 1 
+0

だから、 'While'はPythonで廃止予定のものだと言えるでしょうか? – Fabio

+4

@fabio ... not quite。 whileを使って合理的に書くことができるループがありますが、ほとんどの場合whileを優先して使用しようとするべきです。 –

17

whileは、ブレーク条件が論理的に任意の種類に依存しないシナリオで有用ですシーケンス。例えば、予測不可能な相互作用を考慮してください。もちろん

while user_is_sleeping(): 
    wait() 

を、あなたそのアクションをカプセル化し、for経由でアクセスできるように、適切なイテレータを書くことができる - しかし、どのようにそれが可読性が役立つであろうすべてで

を¹しました? Pythonの他のケースでは、for(またはループをカプセル化する適切な上位関数)を使用します。

user_is_sleeping機能がFalseとき偽を返すと仮定¹、コード例は、以下forループのように書き換えることができる:

for _ in iter(user_is_sleeping, False): 
    wait() 
+0

問題がなく、好奇心の問題であれば、whileループを置き換えるfor文を書くことができると言っていましたが、どのように見えるでしょうか?ありがとう – Fabio

+0

+1これも良い答えです。 –

2

forループは通常、反復が何をしているかを明確にします。常に直接使用することはできませんが、whileループを使用する反復ロジックをジェネレータ関数の中にラップすることができます。たとえば、次のように

def path_to_root(node): 
    while node is not None: 
     yield node 
     node = node.parent 

for parent in path_to_root(node): 
    ... 

代わりの

parent = node 
while parent is not None: 
    ... 
    parent = parent.parent 
4

まずPythonで、その他の言語のforループの間に違いがあります。 Pythonでは値のリスト(例:[4,3,2,7]の値)、他のほとんどの言語(C/C++、Java、PHPなど)を繰り返し処理しますが、whileループとして機能します。読むのが簡単です。

forループは、反復回数がわかっている場合(たとえば配列の長さ)、whileループが使用される時間がわからない場合に使用されます(たとえば、bubble sortループ値がソートされていない限り)

+0

大きなアドバイス、btw私はこの疑いがあった主な理由は、私がPHPから来たもので、FORとWhileの間の明確な違いを見たことがないと思ったからです。 – Fabio

+0

Forループはシーケンスの各メンバー注文。 Whileループは、次のような場合に使用されます:不規則に要素を操作し、複数の要素に同時にアクセス/操作するか、または条件がTrueからFalseに変わるまでループします。 – apraetor

3

iterablesの処理を検討してください。コードのこれらのブロックの両方が根本的に基本的に同じ方法で同じことを行う

it = mylist.__iter__() 
while True: 
    try: 
     print it.next() 
    except StopIteration: 
     break 

for i in mylist: 
    print i 

それとも、あなたはwhileループでそれを行うことができます:あなたはforループでそれを行うことができます。しかし、forループは反復子の作成と、StopIteration例外の処理を隠すので、自分で処理する必要はありません。

私は、whileループを使用して、イテレータに何らかの理由で直接アクセスする必要がある場合など、iterableを処理すると思います。いくつかの状況下でリスト内の項目をスキップする必要がありました。

+2

リスト内の項目をスキップすることは、continueを使用して行うことができます。このスタイルのwhileループを使用する理由は、条件付きでループ内の次のアイテムを取得してから、ループの始めにやり直す場合です。 –

関連する問題