Python入門|for・whileループの使い方を解説
プログラミングで「同じ処理を何度も繰り返す」場面は非常に多く出てきます。Pythonではfor文とwhile文を使ってループ(繰り返し)処理を行います。この記事では、2つのループの使い方と使い分けのポイントを解説します。
for文の基本
for文は「決まった回数」や「リストの要素を順番に」繰り返すときに使います。Pythonのfor文は他の言語と比べてシンプルで読みやすいのが特徴です。
リストを使ったループ
fruits = ["りんご", "みかん", "ぶどう"]
for fruit in fruits:
print(fruit)
# 出力:
# りんご
# みかん
# ぶどう
for 変数 in リスト: という形で書きます。リストの要素が一つずつ変数に入り、ブロック内の処理が繰り返し実行されます。
range()を使ったループ
指定した回数だけ繰り返したいときはrange()を使います。
# 0から4まで(5回繰り返す)
for i in range(5):
print(i)
# 出力: 0, 1, 2, 3, 4
# 1から10まで
for i in range(1, 11):
print(i)
# 出力: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
# 0から10まで2刻み
for i in range(0, 11, 2):
print(i)
# 出力: 0, 2, 4, 6, 8, 10
range()の引数は以下の通りです。
range(終了値): 0から終了値-1までrange(開始値, 終了値): 開始値から終了値-1までrange(開始値, 終了値, ステップ): 開始値から終了値-1までステップ刻み
enumerate()でインデックスも取得
要素と一緒に番号(インデックス)も欲しい場合はenumerate()を使います。
colors = ["赤", "青", "緑", "黄"]
for index, color in enumerate(colors):
print(f"{index}: {color}")
# 出力:
# 0: 赤
# 1: 青
# 2: 緑
# 3: 黄
# 1から始めたい場合
for index, color in enumerate(colors, start=1):
print(f"{index}: {color}")
# 出力:
# 1: 赤
# 2: 青
# 3: 緑
# 4: 黄
while文の基本
while文は「条件が満たされている間」繰り返すときに使います。繰り返す回数が事前にわからない場合に向いています。
count = 0
while count < 5:
print(f"カウント: {count}")
count += 1
# 出力:
# カウント: 0
# カウント: 1
# カウント: 2
# カウント: 3
# カウント: 4
while 条件式: という形で書き、条件式がTrueの間ブロック内の処理が繰り返されます。
while文の実用例
# ユーザー入力を繰り返し受け付ける
while True:
user_input = input("コマンドを入力(qで終了): ")
if user_input == "q":
print("終了します")
break
print(f"入力: {user_input}")
# 合計が100を超えるまで加算
total = 0
num = 1
while total <= 100:
total += num
num += 1
print(f"合計: {total}, 最後に足した数: {num - 1}")
# 合計: 105, 最後に足した数: 14
ループの制御: break・continue・else
ループの流れを細かく制御するための命令があります。
break: ループを途中で抜ける
# リストから特定の要素を探す
numbers = [3, 7, 2, 9, 5, 1, 8]
for num in numbers:
if num == 9:
print("9を見つけました!")
break
print(f"{num}を確認中...")
# 出力:
# 3を確認中...
# 7を確認中...
# 2を確認中...
# 9を見つけました!
continue: 残りの処理をスキップして次のループへ
# 偶数だけを表示する
for i in range(10):
if i % 2 != 0:
continue # 奇数はスキップ
print(i)
# 出力: 0, 2, 4, 6, 8
for-else: ループが最後まで完了したときの処理
# 素数かどうかを判定
num = 17
for i in range(2, num):
if num % i == 0:
print(f"{num}は素数ではありません({i}で割り切れる)")
break
else:
# breakされずにループが完了した場合に実行される
print(f"{num}は素数です")
# 出力: 17は素数です
for-elseのelseブロックは「breakされなかった場合」に実行されます。知らないと読みにくい構文ですが、検索系の処理で便利です。
ネスト(入れ子)ループ
ループの中にループを入れることもできます。
# 九九の表
for i in range(1, 10):
for j in range(1, 10):
print(f"{i * j:3d}", end="")
print() # 行の区切り
# 出力:
# 1 2 3 4 5 6 7 8 9
# 2 4 6 8 10 12 14 16 18
# 3 6 9 12 15 18 21 24 27
# ...
ネストループは便利ですが、3重以上になるとコードが読みにくくなります。そのような場合は関数に分割することを検討しましょう。
リスト内包表記
Pythonにはfor文を1行で書ける「リスト内包表記」という便利な構文があります。
# 通常のfor文
squares = []
for i in range(1, 6):
squares.append(i ** 2)
print(squares) # [1, 4, 9, 16, 25]
# リスト内包表記(同じ結果)
squares = [i ** 2 for i in range(1, 6)]
print(squares) # [1, 4, 9, 16, 25]
# 条件付きリスト内包表記
even_squares = [i ** 2 for i in range(1, 11) if i % 2 == 0]
print(even_squares) # [4, 16, 36, 64, 100]
リスト内包表記は短く書けますが、複雑な処理には向きません。読みやすさを優先して通常のfor文と使い分けましょう。
よくある間違いと対策
間違い1: 無限ループ
# NG: countを更新し忘れて無限ループになる
# count = 0
# while count < 5:
# print(count)
# # count += 1 を忘れている!
# OK: カウンタを確実に更新する
count = 0
while count < 5:
print(count)
count += 1
while文では条件がFalseになるようにループ内で変数を更新する必要があります。もし無限ループになってしまったら、Ctrl + Cで強制停止できます。
間違い2: ループ中のリスト変更
# NG: ループ中にリストの要素を削除すると予期せぬ動作に
numbers = [1, 2, 3, 4, 5]
# for num in numbers:
# if num % 2 == 0:
# numbers.remove(num) # 危険!
# OK: リスト内包表記で新しいリストを作る
numbers = [1, 2, 3, 4, 5]
odd_numbers = [num for num in numbers if num % 2 != 0]
print(odd_numbers) # [1, 3, 5]
間違い3: range()の範囲ミス
# 1から5まで表示したい場合
# NG: 0から4まで表示されてしまう
for i in range(5):
print(i) # 0, 1, 2, 3, 4
# OK: range(1, 6)で1から5
for i in range(1, 6):
print(i) # 1, 2, 3, 4, 5
range(n)は0から始まりn-1で終わるという点を常に意識しましょう。
使い分けのまとめ
- 回数が決まっている繰り返し →
for文 - リストや辞書の要素を処理する →
for文 - 条件が満たされる間繰り返す →
while文 - ユーザー入力を繰り返し受け付ける →
while文
迷ったときはfor文を使ってみて、うまくいかなければwhile文に切り替えるという方法でも大丈夫です。実際のプログラミングではfor文の方が使う場面が多いです。