Python:繰り返し(for / while)の解説
音声
目次
基本:for と while の仕組み
今回できるようになることは、for と while を使って一覧処理と条件ループを正しく書けるようになることです。
for 文は、シーケンス(リストや range など)の各要素を順番に処理するために使います。while 文は、条件が成り立つ間だけ処理を繰り返すために使います。
range() は整数の列を作る組み込み関数で、for と組み合わせて回数分の繰り返しを書くときに便利です。
for の基本形は次のとおりです。
for 変数 in シーケンス:
処理
while の基本形は次のとおりで、ループを抜けられるように条件を変化させる処理も一緒に書きます。
while 条件:
処理
条件を変化させる処理
break を使うとループから早めに抜けられて、continue を使うと次の繰り返しへ進めます。
使い分けは、シーケンスを順に処理するときは for を優先して、回数が固定でない場合や外部条件で止めたい場合は while を選ぶのがポイントです。
実例と最小コード
最小コードは次のとおりです。
# loops_demo.py
def main():
numbers = [1, 2, 3, 4, 5]
sum_even = 0
for idx, n in enumerate(numbers, start=1):
if n % 2 == 0:
sum_even += n
print(f"{idx}: {n} は偶数です")
else:
print(f"{idx}: {n} は奇数です")
i = 0
while i < 3:
print("while でカウント:", i)
i += 1
else:
print("while を抜けました")
if __name__ == "__main__":
main()
このコードでは、リストの各要素を for で確認して偶数の合計を作り、その後に while で 0 から 2 まで数えます。出力例は下に示します。
実行方法は次のとおりです。
- ターミナルで
python loops_demo.pyを実行します。 - または VSCode でファイルを開き、上部の再生ボタンやデバッガーで実行します。
出力例は次のとおりです。
1: 1 は奇数です
2: 2 は偶数です
3: 3 は奇数です
4: 4 は偶数です
5: 5 は奇数です
while でカウント: 0
while でカウント: 1
while でカウント: 2
while を抜けました
デバッグと確認方法
デバッグの見方としては、まず print() で変数の中身や途中結果を出力すると、ループの流れを追いやすくなります。
logging を使うとログレベルで出力を制御できます。次の例では DEBUG レベルの出力を有効にします。
import logging
logging.basicConfig(level=logging.DEBUG)
logging.debug("デバッグ用の出力です")
VSCode のデバッガーを使う場合は、ブレークポイントを置いて変数ウォッチやコールスタックを確認すると、どこで値が変わったかを把握しやすくなります。
確認方法としては、for では enumerate() で index と値を出力し、必要に応じて type() で型も確認すると分かりやすいです。
items = ["a", "b", "c"]
for i, v in enumerate(items):
print(i, v, type(v))
while ではループ変数が想定どおりに増減しているかを出力で追うと、条件式と更新処理の整合を確認しやすくなります。
i = 0
while i < 3:
print("i =", i)
i += 1
合計やカウントを作る処理では、ループの最後に最終結果を出力して期待どおりかを確かめると安心です。
nums = [1, 2, 3]
total = 0
for n in nums:
total += n
print("total =", total)
よくあるミスとして、while でループ変数の更新を忘れて処理が終わらなくなることがあります。この場合はループ内でカウントを増やすなど、条件が変化する処理を入れると改善します。
range() の終端を勘違いして回数が 1 回ずれることもあります。range(n) は 0 から n-1 までになるため、必要な回数と一致するかを見直すとよいです。
リストをループ中に破壊的に変更すると期待どおりに動かないことがあります。たとえば for の最中に remove() を呼ぶ代わりに、コピーしたリストで回すか、削除は後処理に回す方法が扱いやすいです。
1段ステップアップ(関数化・入力対応)
関数化すると再利用性が上がります。例として、リストの偶数合計を関数にまとめます。
def sum_even_numbers(numbers):
total = 0
for n in numbers:
if n % 2 == 0:
total += n
return total
# 実行例
nums = [10, 15, 20]
print("偶数の合計:", sum_even_numbers(nums))
sum_even_numbers関数で偶数だけを足し、呼び出し側では結果を表示します。
入力をユーザーから受け取る場合はinput()を使い、strをintに変換してリストを作る処理を追加します。外部ライブラリは不要です。もし必要ならpipの使い方は一行でpip install パッケージ名です。
30秒チェックです。
- 問題はrange(5)が生成する要素は何ですかです。
- 答えは0, 1, 2, 3, 4です。リストなら[0, 1, 2, 3, 4]と表示できます。
注意(ここだけ)
無限ループは実行が止まらず端末やエディタが操作しづらくなるため、while を書くときはループ上限を設けるか、必ず変化する条件を入れてください。
- 既に動かなくなった場合は、ターミナルで Ctrl+C を押してプロセスを中断してください。
要約
- for はシーケンスを順に処理するのに向いていますが、while は条件で繰り返すときに使います。
- enumerate や range を使うと、インデックスや連続数列の処理が簡単になります。
- print と logging、VSCode のデバッガーで途中結果と変数を確認します。
- while では変数更新の忘れが無限ループの典型的なミスになりやすいので、ループ上限や条件変更を入れます。
- 関数化するとテストと再利用が楽になるため、入力対応は input() と型変換で行います。