プログラミングにおいて同じ処理を何度も繰り返す「繰り返し処理」は必須のテクニックです。
Pythonではwhile
文やfor
文を中心に、多彩なループ構造が用意されています。
この記事では繰り返し処理の基本的な使い方から応用例、注意点までをわかりやすく解説します!
while文による繰り返し
while
文は条件式が真(True)の間、ブロック内の処理を繰り返します。
主に「条件を満たすまでループを続けたい」場面で使用します。
count = 0
while count < 5:
print(f"現在のcountは{count}です")
count += 1
- 条件式は毎回評価され、Falseになるとループが終了する
- whileブロック内で条件を操作する場合は無限ループに注意!
上記のような例では、count += 1
のように必ず条件を変化させて、いずれ条件を満たすようにすることで回避します。
※基本的に、カウントアップする場合は次に説明するfor
文を使用しましょう。
for文によるシーケンスの反復
for
文はシーケンス(リストやタプル、文字列など)の各要素を1つずつ取り出して処理します。
Pythonicな書き方(Pythonらしい書き方)として推奨されるケースが多いです。
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(f"好きな果物は{fruit}です")
- リストやタプル、文字列、辞書のキーなどに対応
- インデックス操作不要で、可読性が高い
rangeを使った数値ループ
数値のシーケンスを生成するにはrange
が便利です。range(start, stop, step)
で開始値、終了値(未満で継続)、ステップ幅を指定できます。
for i in range(1, 10, 2):
print(i) # 1, 3, 5, 7, 9
range(stop)
だけだと0からstop-1までのシーケンスを生成- Python 3では
range
は遅延評価(実際に値が必要となるまで計算されない=無駄な処理が行われない)
enumerateでインデックスを同時取得
辞書などでシーケンスの要素とインデックスを同時に扱うにはenumerate
が便利です。
names = ["Alice", "Bob", "Charlie"]
for idx, name in enumerate(names, start=1):
print(idx, name)
# 1 Alice
# 2 Bob
# 3 Charlie
start
引数でインデックスの開始値を指定可能- インデックス操作のミスを防ぐことができる
breakとcontinue
ループ中の処理をさらに制御したい場合、break
やcontinue
を使います。
break
: ループを即座に終了continue
: 現在の繰り返しを中断(スキップ)して次のループへ
for n in range(10):
if n == 5:
break # 5になったらループ終了
if n % 2 == 0:
continue # 偶数はスキップ
print(n)
# 1
# 3
- 過度な使用は可読性低下の原因になるため注意が必要
- 複雑なループには関数化を検討して可読性を保ちましょう
ループ内の else 節
Python特有の機能として、ループにelse
を付けられます。
ループが通常終了(break
で中断せず終了)した場合にのみ実行されます。
for prime in range(2, 10):
for div in range(2, prime):
if prime % div == 0:
print(f"{prime}は合成数")
break
else:
print(f"{prime}は素数")
- この例では、内側の
for
がbreak
を呼ばなかったときだけelse
が動作する - 例外的な判定や後処理によく使用します
ネスト(入れ子)ループ
ループの中にさらにループを定義することで、二次元配列や表形式データを簡単に扱えます。
ただし、繰り返し回数が掛け算で増えていくため、パフォーマンスには十分注意しましょう。
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
]
for row in matrix:
for val in row:
print(val, end=" ")
print() # 改行
# 1 2 3
# 4 5 6
# 7 8 9
- 大規模データではパフォーマンスに注意して必要であればアルゴリズムの見直しをしましょう
- ジェネレータ式や
itertools
でメモリ効率を向上できます
リスト内包表記
ループを使ったリスト生成は、[]の中に記述するリスト内包表記で短く書くことができます。
squares = [x*2 for x in range(5)]
# 0~4までの2倍のリスト [0, 2, 4, 6, 8] になります
[...]
でリスト内包表記- 一行で書けるため可読性が向上します
- 複雑すぎる内包表記はむしろ読みにくくなり可読性が下がるので注意
注意点とベストプラクティス
- ループ回数が多いと処理が重くなるため、アルゴリズムの計算量を意識する
- 無限ループを避けるために終了条件を必ず書く
break
/continue
の多用を控え、複雑になる場合は関数化や早期リターンを検討- 大量データにはリストでなくジェネレータ式や
itertools
を使いメモリ効率を確保 - 可読性を優先し、複雑なネストは分割して関数化
おわりに
Pythonの繰り返し処理は、シンプルなwhile
文から高度な内包表記まで幅広くサポートしています。
適切なループ文を選び、可読性とパフォーマンスのバランスを意識することが重要です。
ぜひ今回紹介したテクニックを使いこなし、効率的で美しいコードを書いてみてください!