Python "while"ループ(不定反復)

Python "while"ループ(不定反復)

*反復*とは、同じコードブロックを何度も繰り返し実行することを意味します。 反復を実装するプログラミング構造は、*ループ*と呼ばれます。

プログラミングには、不定と確定の2種類の反復があります。

  • *無限反復*では、ループが実行される回数は事前に明示的に指定されません。 むしろ、特定の条件が満たされる限り、指定されたブロックが繰り返し実行されます。

  • *確定反復*では、指定されたブロックが実行される回数は、ループの開始時に明示的に指定されます。

このチュートリアルでは、次のことを行います。

  • 不定反復に使用されるPython制御構造である `+ while +`ループについて学ぶ

  • ループから抜け出す方法またはループの繰り返しを時期尚早に確認する

  • 無限ループを探索する

終了したら、Pythonで無限反復を使用する方法を十分に理解する必要があります。

*無料ボーナス:*リンク:[ここをクリックして無料のPythonチートシートを入手してください]データ型、辞書、リスト、Python関数の操作など、Python 3の基本を示します。

  • __クイズに挑戦:*インタラクティブな「Python "while"ループ」クイズで知識をテストします。 完了すると、学習の進捗状況を経時的に追跡できるようにスコアを受け取ります。

link:/quizzes/python-while-loop/[クイズを読む»]

`+ while +`ループ

Pythonの `+ while +`ステートメントを使用してループを構築する方法を見てみましょう。 シンプルに始めて、装飾を加えていきます。

基本的な `+ while +`ループの形式を以下に示します。

while <expr>:
    <statement(s)>

`+ <statement(s)> `は、繰り返し実行されるブロックを表し、多くの場合、ループの本体と呼ばれます。 これは、 ` if +`ステートメントと同様に、インデントで示されます。

注意: Pythonのすべての制御構造は、インデントを使用してブロックを定義します。 レビューする前のチュートリアルのhttps://realpython.com/python-conditional-statements/#python-its-all-about-the-indentation[grouping statement]の説明を参照してください。

制御式 `+ <expr> +`には通常、ループを開始する前に初期化され、ループ本体のどこかで変更される1つ以上の変数が含まれます。

`+ while `ループが発生すると、https://realpython.com/python-data-types/#boolean-type-boolean-context-and-truthiness [ブールコンテキスト]で最初に ` <expr> `が評価されます]。 真の場合、ループ本体が実行されます。 次に、 ` <expr> `が再度チェックされ、まだtrueの場合、本文が再度実行されます。 これは、 ` <expr> +`がfalseになるまで続きます。この時点で、プログラムの実行はループ本体を超えて最初のステートメントに進みます。

このループを考えてみましょう:

>>>

 1 >>> n = 5
 2 >>> while n > 0:
 3 ...     n -= 1
 4 ...     print(n)
 5 ...
 6 4
 7 3
 8 2
 9 1
10 0

この例で何が起こっているのかを次に示します。

  • `+ n `は最初は ` 5 `です。 2行目の ` while `ステートメントヘッダーの式は ` n> 0 `であり、これはtrueであるため、ループ本体が実行されます。 3行目のループ本体の内部で、「 n 」は「+1」から「4」までデクリメントされ、出力されます。

  • ループの本体が終了すると、プログラムの実行はループの先頭の2行目に戻り、式が再度評価されます。 まだ真実なので、本文は再び実行され、 `+ 3 +`が出力されます。

  • これは、「+ n 」が「+0」になるまで続きます。 その時点で、式がテストされるとき、それは偽であり、ループは終了します。 ループ本体に続く最初のステートメントから実行が再開されますが、この場合は実行されません。

`+ while +`ループの制御式は、他の何かが起こる前に最初にテストされることに注意してください。 最初がfalseの場合、ループ本体はまったく実行されません。

>>>

>>> n = 0
>>> while n > 0:
...     n -= 1
...     print(n)
...

上記の例では、ループが発生すると、「+ n 」は「+0」になります。 制御式 `+ n> 0 +`はすでにfalseであるため、ループ本体は実行されません。

数値比較ではなく、リストを含むもう1つの「+ while +」ループを次に示します。

>>>

>>> a = ['foo', 'bar', 'baz']
>>> while a:
...     print(a.pop(-1))
...
baz
bar
foo

https://realpython.com/python-operators-expressions/#evaluation-of-non-boolean-values-in-boolean-context [リストがブールコンテキストで評価される]に要素が含まれている場合、それは真実ですそれが空の場合、偽物。 この例では、要素が含まれている限り、 `+ a `はtrueです。 ` .pop()`メソッドですべてのアイテムが削除され、リストが空になると、 ` a +`はfalseになり、ループは終了します。

Pythonの `+ break `および ` continue +`ステートメント

これまで見てきた各例では、 `+ while +`ループの本体全体が各反復で実行されます。 Pythonは、ループの反復を途中で終了させる2つのキーワードを提供します。

  • Pythonの + break + ステートメントは、ループを直ちに完全に終了します。 プログラムの実行は、ループ本体に続く最初のステートメントに進みます。

  • Pythonの + continue + ステートメントは、現在のループの反復を即座に終了します。 実行はループの先頭にジャンプし、制御式が再評価されて、ループが再度実行されるか終了するかが決定されます。

`+ break `と ` continue +`の違いを次の図に示します。

以下に、 `+ break `ステートメントを示す ` break.py +`というスクリプトファイルを示します。

 1 n = 5
 2 while n > 0:
 3     n -= 1
 4     if n == 2:
 5         break
 6     print(n)
 7 print('Loop ended.')

コマンドラインインタープリターから `+ break.py +`を実行すると、次の出力が生成されます。

C:\Users\john\Documents>python break.py
4
3
Loop ended.

`+ n `が ` 2 `になると、 ` break `ステートメントが実行されます。 ループは完全に終了し、プログラムの実行は7行目の ` print()+`ステートメントにジャンプします。

次のスクリプト、「+ continue.py 」は、「 break 」の代わりに「 continue +」ステートメントを除いて同一です。

 1 n = 5
 2 while n > 0:
 3     n -= 1
 4     if n == 2:
 5         continue
 6     print(n)
 7 print('Loop ended.')

`+ continue.py +`の出力は次のようになります。

C:\Users\john\Documents>python continue.py
4
3
1
0
Loop ended.

今回は、「+ n 」が「+2」の場合、「+ continue 」ステートメントによってその反復が終了します。 したがって、「 2+」は印刷されません。 実行はループの先頭に戻り、条件が再評価され、それでも真です。 以前と同様に、ループは再開し、「+ n 」が「+0」になると終了します。

`+ else +`句

Pythonでは、 `+ while `ループの最後にオプションの ` else +`句を使用できます。 これはPythonのユニークな機能であり、他のほとんどのプログラミング言語には見られません。 構文は次のとおりです。

while <expr>:
    <statement(s)>
else:
    <additional_statement(s)>

`+ else `句で指定された ` <additional_statement(s)> `は、 ` while +`ループが終了すると実行されます。

thought balloon、width = 693、height = 576

今ごろ、あなたは「それはどのように便利ですか?」これらのステートメントを、 `+ else `なしで、 ` while +`ループの直後に配置することで、同じことを達成できます。

while <expr>:
    <statement(s)>
<additional_statement(s)>

違いは何ですか?

後者の場合、 `+ else `句がないと、 ` while `ループが終了した後、何があっても ` <additional_statement(s)> +`が実行されます。

`+ <additional_statement(s)> `が ` else `句に配置されている場合、ループが「枯渇」によって終了する場合、つまり制御条件がfalseになるまでループが繰り返される場合にのみ実行されます。 ループが ` break `ステートメントによって終了した場合、 ` else +`句は実行されません。

次の例を見てください。

>>>

>>> n = 5
>>> while n > 0:
...     n -= 1
...     print(n)
... else:
...     print('Loop done.')
...
4
3
2
1
0
Loop done.

この場合、条件がなくなるまでループが繰り返され、「+ n 」が「+0」になり、「+ n> 0+」が偽になりました。 ループはいわばその自然な生活を送っていたため、いわば、 `+ else +`句が実行されました。 ここで違いを観察します。

>>>

>>> n = 5
>>> while n > 0:
...     n -= 1
...     print(n)
...     if n == 2:
...         break
... else:
...     print('Loop done.')
...
4
3
2

このループは「+ break 」で途中で終了するため、「 else +」句は実行されません。

「+ else 」という単語の意味は、「 if 」ステートメントと同様に「 while 」ループにも完全には適合しないように思えるかもしれません。 Pythonの作成者であるhttps://en.wikipedia.org/wiki/Guido_van_Rossum[Guido van Rossum]は、実際にやり直したい場合は、「 while +」ループの「+言語のelse + `句。

次の解釈のいずれかが、より直感的になるのに役立ちます。

  • ループのヘッダー( + while n> 0 +)を何度も繰り返し実行される + if +`ステートメント( `+ if n> 0 +)と考えてください。条件が偽になったときに実行されます。

  • 「+ else 」は「 nobreak 」であるかのように考えてください。「 break +」がなければ、後続のブロックが実行されます。

これらの解釈のいずれかが役に立たない場合は、お気軽に無視してください。

`+ while `ループの ` else `句が役立つのはいつですか? 1つの一般的な状況は、特定のアイテムのリストを検索している場合です。 アイテムが見つかった場合は、「 break 」を使用してループを終了できます。「 else +」句には、アイテムが見つからなかった場合に実行されるコードを含めることができます。

>>>

>>> a = ['foo', 'bar', 'baz', 'qux']
>>> s = 'corge'

>>> i = 0
>>> while i < len(a):
...     if a[i] == s:
...         # Processing for item found
...         break
...     i += 1
... else:
...     # Processing for item not found
...     print(s, 'not found in list.')
...
corge not found in list.

*注:*上記のコードは概念を説明するのに役立ちますが、実際にリストをそのように検索することはほとんどありません。

まず、リストは通常​​、 `+ while +`ループではなく、一定の反復で処理されます。 明確な反復については、このシリーズの次のチュートリアルで説明します。

第二に、Pythonはリスト内のアイテムを検索する組み込みの方法を提供します。 `+ in +`演算子を使用できます:

>>>

>>> if s in a:
...     print(s, 'found in list.')
... else:
...     print(s, 'not found in list.')
...
corge not found in list.

`+ list.index()`メソッドも機能します。 このメソッドは、リストにアイテムが見つからない場合に「 ValueError 」例外を発生させるため、使用するには例外処理を理解する必要があります。 Pythonでは、 ` try +`ステートメントを使用して例外を処理します。 例を以下に示します。

>>>

>>> try:
...     print(a.index('corge'))
... except ValueError:
...     print(s, 'not found in list.')
...
corge not found in list.

このシリーズの後半で、例外処理について学習します。

`+ while `ループを伴う ` else +`句は少し奇妙で、あまり見られません。 ただし、コードがわかりやすくなると感じる場合は、遠慮しないでください。

無限ループ

理論的には終了しない「+ while +」ループを作成するとします。 奇妙に聞こえますか?

この例を考えてください。

>>>

>>> while True:
...     print('foo')
...
foo
foo
foo
  .
  .
  .
foo
foo
foo
KeyboardInterrupt
Traceback (most recent call last):
  File "<pyshell#2>", line 2, in <module>
    print('foo')

このコードは、キーボードから割り込みを生成する[.keys]#Ctrl + C#で終了しました。 そうでなければ、果てしなく続くでしょう。 多くの `+ foo +`出力行は削除され、表示されている出力の垂直の省略記号に置き換えられています。

明らかに、 `+ True `が決して偽になることはありません。そうでなければ、私たち全員が非常に大きな問題に直面しています。 したがって、 ` while True:+`は、理論的には永久に実行される無限ループを開始します。

たぶんそれはあなたがやりたいことのように聞こえないかもしれませんが、このパターンは実際には非常に一般的です。 たとえば、サービスリクエストを受け入れて起動し、永久に実行するサービスのコードを作成できます。 この文脈における「永遠」とは、あなたがそれをシャットダウンするまで、または宇宙の熱死までのいずれか早い方を意味します。

もっと普遍的に、 `+ break +`ステートメントでループを抜けることができることを覚えておいてください。 先頭で評価された条件ではなく、ループ本体内で認識された条件に基づいてループを終了する方が簡単な場合があります。

上記のループのもう1つのバリアントは、空になるまで `+ .pop()+`を使用してリストからアイテムを連続的に削除します。

>>>

>>> a = ['foo', 'bar', 'baz']
>>> while True:
...     if not a:
...         break
...     print(a.pop(-1))
...
baz
bar
foo

`+ a `が空になると、 ` not a `が真になり、 ` break +`ステートメントはループを終了します。

ループで複数の `+ break +`ステートメントを指定することもできます:

while True:
    if <expr1>:  # One condition for loop termination
        break
    ...
    if <expr2>:  # Another termination condition
        break
    ...
    if <expr3>:  # Yet another
        break

ループを終了する複数の理由があるこのような場合、ループヘッダーですべての終了条件を指定するのではなく、複数の異なる場所から「+ break +」を実行する方がクリーンな場合がよくあります。

無限ループは非常に便利です。 ある時点でループが確実に中断されるようにしなければならないので、本当に無限にならないようにしてください。

ネストされた `+ while +`ループ

一般に、Pythonの制御構造は相互にネストできます。 たとえば、 + if +/+ elif +/`+ else +`条件ステートメントはネストできます:

if age < 18:
    if gender == 'M':
        print('son')
    else:
        print('daughter')
elif age >= 18 and age < 65:
    if gender == 'M':
        print('father')
    else:
        print('mother')
else:
    if gender == 'M':
        print('grandfather')
    else:
        print('grandmother')

同様に、次のように、「+ while 」ループを別の「 while +」ループ内に含めることができます。

>>>

>>> a = ['foo', 'bar']
>>> while len(a):
...     print(a.pop(0))
...     b = ['baz', 'qux']
...     while len(b):
...         print('>', b.pop(0))
...
foo
> baz
> qux
bar
> baz
> qux

ネストされたループ内で見つかった `+ break `または ` continue +`ステートメントは、最も近い囲みループに適用されます。

while <expr1>:
    statement
    statement

    while <expr2>:
        statement
        statement
        break  # Applies to while <expr2>: loop

    break  # Applies to while <expr1>: loop

さらに、 + while +`ループは `+ if +/+ elif +/`+ else +`ステートメント内にネストでき、その逆も同様です。

if <expr>:
    statement
    while <expr>:
        statement
        statement
else:
    while <expr>:
        statement
        statement
    statement
while <expr>:
    if <expr>:
        statement
    elif <expr>:
        statement
    else:
        statement

    if <expr>:
        statement

実際、すべてのPython制御構造は、必要な範囲で相互に混在させることができます。 それはそうあるべきです。 「「+ if 」ステートメント内に「 while 」ループを含めることはできません」や「+ while + `ループは最大で4つの深さまでしかネストできない」などの予期しない制限があった場合のイライラを想像してください。 」それらすべてを思い出すのは非常に困難です。

一見任意の数値的または論理的な制限は、不十分なプログラム言語設計の兆候と見なされます。 幸いなことに、Pythonには多くはありません。

1行の `+ while +`ループ

+ if +`ステートメントと同様に、 `+ while +`ループは1行で指定できます。 ループ本体を構成するブロックに複数のステートメントがある場合、セミコロン( `+; +)で区切ることができます。

>>>

>>> n = 5
>>> while n > 0: n -= 1; print(n)

4
3
2
1
0

ただし、これは単純なステートメントでのみ機能します。 2つの複合ステートメントを1行に結合することはできません。 したがって、上記のようにすべて1行で `+ while `ループを指定し、1行で ` if +`ステートメントを記述できます。

>>>

>>> if True: print('foo')

foo

しかし、これはできません。

>>>

>>> while n > 0: n -= 1; if True: print('foo')
SyntaxError: invalid syntax

PEP 8は、1行で複数のステートメントを推奨していません。 したがって、おそらくこれを頻繁に行うべきではありません。

結論

このチュートリアルでは、Pythonの `+ while +`ループを使用して*無限反復*について学習しました。 次のことができるようになりました。

  • 基本的で複雑な `+ while +`ループを構築する

  • `+ break `と ` continue +`でループ実行を中断する

  • `+ while `ループで ` else +`句を使用します

  • 無限ループに対処する

これで、コードの一部を繰り返し実行する方法を十分に把握できるはずです。

  • __クイズに挑戦:*インタラクティブな「Python "while"ループ」クイズで知識をテストします。 完了すると、学習の進捗状況を経時的に追跡できるようにスコアを受け取ります。

link:/quizzes/python-while-loop/[クイズを読む»]

このシリーズの次のチュートリアルでは、 `+ for +`ループを使用した*確定反復*-反復回数が明示的に指定された反復実行について説明します。