フリーキーズ | 独学プログラミング

Pythonの繰り返し構文を徹底解説!初心者でもできるループ処理の基本

リンドくん

リンドくん

たなべ先生、Pythonで同じ処理を何回も書くのって大変です…もっと効率的な方法はないんですか?

たなべ

たなべ

そうだね、同じコードを繰り返し書くのは非効率的だよ。
そんなときこそ繰り返し構文(ループ)の出番なんだ!
Pythonには便利な繰り返しの仕組みがあるから、今日はそれを詳しく説明するね。

繰り返し処理はプログラミングの基本中の基本

プログラミングを学び始めると、同じような処理を何度も書かなければならない場面に必ず出会います。
例えば、リストの全要素を表示したり、1から100までの数字を合計したり...。これを一つずつ手作業で書いていたら、非常に非効率的ですよね。

そこで重要になるのが「繰り返し構文」(ループ処理)です。Pythonには主に2種類の繰り返し構文があります。

  • forループ - 決まった回数や要素に対して繰り返す
  • whileループ - 条件が真である限り繰り返す

この記事では、Pythonの繰り返し構文の基本から応用まで、初心者にもわかりやすく解説していきます。
コードを効率的に書けるようになれば、プログラミングの幅が大きく広がるはずです!

forループ - 最も使用頻度の高い繰り返し処理

リンドくん

リンドくん

forループというのはどういう時に使うんですか?

たなべ

たなべ

forループは決まった回数リストなどのデータを順番に処理したいときに使うんだよ。
例えば、クラスの生徒全員の名前を表示したいときなんかが典型的な使い方だね。

forループの基本構文

Pythonのforループは、他のプログラミング言語と比べてとても直感的で書きやすいのが特徴です。
基本的な構文は以下のとおりです。

for 変数 in 繰り返し対象:
    # 繰り返し実行したい処理

繰り返し対象には以下のようなものが使えます。

  • リスト(配列)
  • 文字列
  • 辞書(ディクショナリ)
  • 範囲オブジェクト(range)
  • その他のイテラブル(繰り返し可能な)オブジェクト

例)リストの要素を処理する

例えば、果物のリストがあり、それぞれの果物の名前を表示したい場合は以下のように書けます。

fruits = ["りんご", "バナナ", "オレンジ", "ぶどう"]
for fruit in fruits:
    print(fruit)

この例では、fruitsリストの要素が順番にfruit変数に代入され、それぞれに対してprint()関数が実行されます。   実行結果は以下のようになります。

りんご
バナナ
オレンジ
ぶどう

range関数を使った繰り返し

特定の回数だけ繰り返したい場合は、range()関数が便利です。
例えば、1から5までの数字を表示したい場合は以下ののようになります。

for i in range(1, 6):  # 1から5まで
    print(i)

range()関数は以下のように使えます。

  • range(終了値) - 0から終了値-1まで
  • range(開始値, 終了値) - 開始値から終了値-1まで
  • range(開始値, 終了値, ステップ) - 開始値から終了値-1までをステップごとに

forループでインデックスも使いたい場合

リストの要素と同時にインデックス(位置)も必要な場合は、enumerate()関数を使います。

fruits = ["りんご", "バナナ", "オレンジ"]
for index, fruit in enumerate(fruits):
    print(f"{index}番目の果物は{fruit}です")
# 実行結果
0番目の果物はりんごです
1番目の果物はバナナです
2番目の果物はオレンジです

enumerate()関数は、イテラブルオブジェクトの要素と同時にインデックスも取得できる便利な関数です。

whileループ - 条件満たす限り繰り返す

リンドくん

リンドくん

forループとwhileループは何が違うんですか?

たなべ

たなべ

大きな違いは、繰り返す条件の指定方法だね。
forループは「リストの全要素」や「〇回」といった明確な対象に対して使うのに対して、whileループは「〇〇の条件を満たす限り」という柔軟な条件で繰り返せるんだ。

whileループの基本構文

whileループは、指定した条件がTrueである限り、ブロック内のコードを繰り返し実行します。

while 条件式:
    # 条件式がTrueの間、繰り返し実行したい処理

例)ユーザー入力の繰り返し

例えば、ユーザーが「終了」と入力するまで、入力を受け付けるプログラムを考えてみましょう。

user_input = ""
while user_input != "終了":
    user_input = input("何か入力してください(「終了」で終わります): ")
    print(f"あなたは「{user_input}」と入力しました")

print("プログラムを終了します")

このプログラムは、ユーザーが「終了」と入力するまで、入力と出力を繰り返します。

無限ループとbreak文

条件式に True を指定すると無限ループになります。
ただし、break文を使用することで、ループから抜け出すことができます。

counter = 0
while True:  # 無限ループ
    print(counter)
    counter += 1
    
    if counter >= 5:
        print("カウンターが5になったので、ループを終了します")
        break  # ループから抜け出す

無限ループは危険に思えるかもしれませんが、適切にbreak文を使うことで、複雑な条件の繰り返し処理が簡潔に書けることがあります。

ループ制御 - 細かい制御がプログラムの質を高める

リンドくん

リンドくん

ループの途中で処理をスキップしたり、途中で終了したりすることもできるんですか?

たなべ

たなべ

もちろん!Pythonにはcontinuebreakという2つの便利な制御文があるよ。
これらを使いこなせると、ループ処理がもっと柔軟になるんだ。

break文 - ループを途中で終了

先ほど紹介したbreak文は、ループを即座に終了させます。
例えば、リスト内に特定の値が見つかったらループを終了させたい場合に便利です。

numbers = [1, 3, 5, 7, 9, 11, 13, 15]
for num in numbers:
    if num > 10:
        print(f"{num}は10より大きいので終了します")
        break
    print(f"現在の数値: {num}")
# 実行結果
現在の数値: 1
現在の数値: 3
現在の数値: 5
現在の数値: 7
現在の数値: 9
11は10より大きいので終了します

continue文 - 現在の繰り返しをスキップ

continue文は、現在の繰り返しをスキップして、次の繰り返しに進みます。
例えば、偶数だけを処理したい場合に使えます。

for num in range(1, 6):
    if num % 2 != 0:  # 奇数の場合
        continue  # 次のループへスキップ
    print(f"偶数です: {num}")
# 実行結果
偶数です: 2
偶数です: 4

else節 - ループが正常終了した場合の処理

あまり知られていませんが、PythonのループにはOptionでelse節をつけることができます。
これは、ループがbreak文で中断されずに正常終了した場合に実行されます。

for num in range(1, 6):
    print(num)
else:
    print("ループが正常に終了しました")

このコードでは、ループが中断されずに最後まで実行されるため、else節の処理も実行されます。

ネストしたループ

リンドくん

リンドくん

ループの中にループを入れることもできるんですか?

たなべ

たなべ

その通り!ネストしたループと呼ばれるテクニックだよ。
これを使うと、二次元データの処理や複雑なパターンの生成ができるんだ。

ネストしたループの基本

ループの中に別のループを入れることを「ネストしたループ」と呼びます。
例えば、掛け算の九九表を作るプログラムを考えてみましょう。

for i in range(1, 10):  # 外側のループ: 1~9
    for j in range(1, 10):  # 内側のループ: 1~9
        print(f"{i} × {j} = {i*j}")
    print("-----")  # 各段の区切り

このコードでは、外側のループが1回実行される間に、内側のループが9回実行されます。
つまり、全部で9×9=81回の掛け算が表示されます。

二次元リストの処理

ネストしたループは、二次元リスト(リストの中にリストがある構造)の処理に特に役立ちます。

matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

for row in matrix:  # 各行に対して
    for element in row:  # 行の各要素に対して
        print(element, end=" ")  # 横に並べて表示
    print()  # 行の終わりで改行
# 実行結果
1 2 3 
4 5 6 
7 8 9

このように、ネストしたループを使うことで、複雑なデータ構造も効率的に処理できます。

実践的な使用例

リンドくん

リンドくん

実際のプログラミングでは、どんな場面でループを使うことが多いですか?

たなべ

たなべ

本当に様々な場面で使うよ!
例えばデータ集計ファイル処理条件に合うデータの検索など、プログラミングをしていると毎日のように使うテクニックだね。

データ集計

例えば、テストの点数リストから平均点を求めるプログラムを考えてみましょう。

scores = [85, 90, 78, 92, 88]
total = 0

for score in scores:
    total += score  # 合計を計算

average = total / len(scores)  # 平均を計算
print(f"平均点: {average}")
# 実行結果
平均点: 86.6

条件に合うデータの検索とフィルタリング

条件に合致する要素だけを抽出する例を見てみましょう。

numbers = [12, 35, 9, 56, 24]
even_numbers = []  # 偶数を格納するリスト

for num in numbers:
    if num % 2 == 0:  # 偶数かどうかチェック
        even_numbers.append(num)  # 偶数ならリストに追加

print(f"偶数リスト: {even_numbers}")
# 実行結果
偶数リスト: [12, 56, 24]

リスト内包表記

Pythonでは、上記の「条件に合うデータのフィルタリング」をより簡潔に書ける「リスト内包表記」という構文があります。

numbers = [12, 35, 9, 56, 24]
even_numbers = [num for num in numbers if num % 2 == 0]
print(f"偶数リスト: {even_numbers}")

リスト内包表記は少し難しく見えるかもしれませんが、慣れると非常に便利な機能です。
「[式] for [変数] in [イテラブル] if [条件]」という形で書くことで、簡潔にリスト処理ができます。

まとめ

リンドくん

リンドくん

ループの基本がわかってきました!自分でもいろんな処理に挑戦してみたいです。

たなべ

たなべ

素晴らしい!繰り返し構文はプログラミングの基本中の基本だから、ぜひ実際に手を動かして練習してみてね。
わからないことがあれば、いつでも質問してくださいね。

ここまで、Pythonの繰り返し構文について詳しく解説してきました。
ここで要点をまとめておきましょう。

  • forループは、リストや範囲など決まった対象に対して繰り返すのに最適
  • whileループは、条件が満たされる限り繰り返す柔軟な構文
  • breakcontinueを使うことで、ループをより細かく制御できる
  • ネストしたループを使えば、複雑なデータ構造も処理できる
  • 実際のプログラミングでは、データ集計やフィルタリングなど様々な場面でループが活躍する

繰り返し構文をマスターすることで、効率的で読みやすいコードが書けるようになります。
ぜひ、様々なプログラミング課題に挑戦してみてください!

関連するコンテンツ