Pythonにはいくつかループ処理がありますが、その中でも特に「決まった回数」や「データの集まり(リストとか)の要素の数だけ」繰り返すのが得意なのがforループです。
これを使えば、面倒な繰り返し作業もPythonさんが自動でサクサクこなしてくれるようになりますよ。
この記事では、Pythonのforループの基本的な書き方から、range関数やbreak/continue文の使い方、さらには少し応用的なテクニックまで、豊富なコード例と共に一歩ずつ丁寧に解説します。
Pythonのforループの基本的な書き方
forループの書き方を見ていきましょう!
基本の形はこうです。
for 変数 in イテラブルオブジェクト: 実行したい処理 (インデントする!)
ちょっとカタカナが多くて「?」となるかもしれませんが、大丈夫。
一つずつ説明しますね。
- for
「これからforループを始めますよー」という合図です。 - 変数
イテラブルオブジェクトから取り出した要素が、一時的に入る箱のようなもの。ループが一周するたびに、中身が次の要素に入れ替わります。好きな名前をつけられますが、何が入るかわかりやすい名前がおすすめです(例: `item`, `name`, `num` など)。 - in
「この中から取り出すよ」という意味のキーワードです。 - イテラブルオブジェクト
「要素を一つずつ順番に取り出せるもの」のことです。難しく考えず、まずはリスト、文字列、後で出てくる`range()`などをイメージしてください。 - : (コロン)
「ここからループ内の処理が始まりますよ」の合図。絶対に忘れないでください! - 実行したい処理
ループの中で繰り返したい処理を書きます。大事なのは、行の先頭にスペースを入れて「インデント(字下げ)」すること! Pythonではインデントで処理の範囲を示すので、これがズレるとエラーになります。
言葉だけだとピンと来ないと思うので、次から具体的な例を見ていきましょう!
リストを使ったPythonのforループ具体例
まずは一番よく使う、リストを使った例です。
果物の名前が入ったリスト `fruits` から、一つずつ名前を取り出して表示してみましょう。
fruits = ["apple", "banana", "cherry"] print("好きな果物は?") for fruit in fruits: print(fruit) print("どれも美味しい!")
表示結果
好きな果物は? apple banana cherry どれも美味しい!
どうでしょう?
リスト `fruits` の中身が、`fruit` という変数に順番に入って、`print(fruit)` で表示されているのがわかりますか?
`for`ループが終わると、最後の `print("どれも美味しい!")` が実行されます。ループで処理したい部分だけインデントするのがポイントです。
range関数を使った数値の繰り返し
次は、リストみたいにあらかじめデータがないけど、「決まった回数」だけ繰り返したい、というときに便利な `range()` 関数です。
これは連続した数値を作り出してくれる関数です。
print("0から4まで表示します") for i in range(5): # range(5) は 0, 1, 2, 3, 4 という数値の列を作る print(i)
表示結果
0から4まで表示します 0 1 2 3 4
`range(5)` と書くと、0から始まり、5の手前(つまり4)までの数値の列を作ってくれます。これが結構大事なポイント!指定した数字そのものは含まれないんですね。
変数 `i` に 0, 1, 2, 3, 4 が順番に入って表示されています。
`range()` は、始まりの数字や、いくつ飛ばしにするかも指定できます。
- `range(開始値, 終了値)` → 開始値から終了値の手前まで
- `range(開始値, 終了値, ステップ)` → 開始値から終了値の手前まで、ステップ数飛ばしで
2から6まで表示
print("2から6まで表示します") for num in range(2, 7): # 2から7の手前(6)まで print(num)
表示結果
2から6まで表示します 2 3 4 5 6
0から10まで2つ飛ばしで表示
print("0から10まで2つ飛ばしで表示") for x in range(0, 11, 2): # 0から11の手前(10)まで、2つ飛ばし print(x)
表示結果
0から10まで2つ飛ばしで表示 0 2 4 6 8 10
`range()`、なかなか便利でしょ?決まった回数だけ何かしたい時にめちゃくちゃ役立ちます。
文字列を1文字ずつ処理するforループ
実は、文字列もforループで1文字ずつ取り出すことができるんです。
やってみましょう。
word = "Hello" for char in word: print(char)
表示結果
H e l l o
簡単ですね!文字列 `word` の中の文字が、`char` という変数に1文字ずつ順番に入って表示されています。文字列もリストと同じように扱えるのは覚えておくと便利です。
タプルや辞書でのforループ活用法
リストや文字列の他にも、タプルや辞書もforループで扱えます。
タプルはリストとほぼ同じ感覚で使えます。要素の変更ができない版リスト、みたいなイメージです。
my_tuple = (10, 20, 30) for item in my_tuple: print(item)
表示結果
10 20 30
辞書の場合は、少しパターンがあります。
1. キーだけを取り出す (これが基本の動作)
scores = {"math": 80, "english": 75, "science": 90} print("--- キー ---") for key in scores: # デフォルトだとキーが取り出される print(key)
表示結果
--- キー --- math english science
2. 値だけを取り出す (`.values()`を使う)
scores = {"math": 80, "english": 75, "science": 90} print("--- 値 ---") for value in scores.values(): print(value)
表示結果
--- 値 --- 80 75 90
3. キーと値のペアを取り出す (`.items()`を使う)
これが一番よく使うかもしれません。
scores = {"math": 80, "english": 75, "science": 90} print("--- キーと値 ---") for key, value in scores.items(): # items() を使うのがポイント! print(f"{key}: {value}") # f-string で見やすく表示
表示結果
--- キーと値 --- math: 80 english: 75 science: 90
辞書の場合は、何を取り出したいかに合わせて `.values()` や `.items()` を使い分けるのがコツです。
forループでよく使う制御構文 - breakとcontinue
forループは基本的に最後まで実行されますが、途中で動きを変えたい時もありますよね。
そんな時に使うのが `break` と `continue` です。
- break:ループ処理を完全に中断して、ループから抜け出す。
- continue:今回の処理だけをスキップして、次の回のループ処理に進む。
例えるなら、`break`は「もう十分!ここで終わり!」、`continue`は「今回はパス!次いってみよう!」みたいな感じです。
それぞれ見ていきましょう。
【break文】ループを途中で抜ける方法
`break` は、特定の条件になったらループをもうやめたい時に使います。
例えば、リストの中から特定の値を探していて、見つかったらそれ以上探す必要がない、みたいな場面です。numbers = [1, 5, 8, 12, 15, 20]
print("10より大きい最初の数を見つけたら終了します。") for num in numbers: print(f"チェック中: {num}") if num > 10: print(f"見つけました! {num} です。") break # ここでループを抜ける! print("ループ終了")
の表示結果
10より大きい最初の数を見つけたら終了します。 チェック中: 1 チェック中: 5 チェック中: 8 チェック中: 12 見つけました! 12 です。 ループ終了
12が見つかった時点で `if num > 10:` が `True` になり、`break` が実行されました。
そのため、15と20はチェックされずにループが終了しているのがわかりますね。これが `break` の効果です。
【continue文】特定の処理をスキップする方法
`continue` は、特定の条件の時だけ、その回の残りの処理を飛ばして、次のループに進みたい時に使います。
例えば、特定の要素だけ処理対象外にしたい、みたいな場面です。
foods = ["apple", "banana", "orange", "grape"] print("バナナ以外を表示します。") for food in foods: if food == "banana": continue # バナナの時はここで処理をスキップして、次のループへ! print(f"これは {food} です。") # continueが実行されるとここは実行されない print("処理完了")
表示結果
バナナ以外を表示します。 これは apple です。 これは orange です。 これは grape です。 処理完了
`food` が "banana" の時に `if food == "banana":` が `True` になり、`continue` が実行されました。
そのため、"banana" の回の `print(f"これは {food} です。")` は実行されず、次の "orange" のループに進んでいます。特定の条件だけ処理を飛ばせるのが `continue` の便利なところです。
Pythonのforループでありがちなエラーと対処法
forループは便利ですが、慣れないうちはエラーが出たり、思った通りに動かなかったりすることも。
よくあるパターンと対処法を知っておきましょう!
インデント忘れ・ズレ (`IndentationError`)
これはPython全般で本当によくあるミスです。インデントがなかったり、行によってズレていたりすると `IndentationError` が出ます。
エディタのインデント補助機能を使うと防ぎやすいですよ。
# ダメな例 (インデントがない) # for item in my_list: # print(item) ← エラー! # 正しい例 my_list = [1, 2] for item in my_list: print(item) # ← OK!
コロン忘れ (`SyntaxError`)
`for 変数 in イテラブルオブジェクト` の行末のコロン `:` を忘れると `SyntaxError: invalid syntax` のようなエラーが出ます。単純なミスですが、意外と見落としがち。エラーが出たらまず確認しましょう。
`range()` の範囲指定ミス
`range(5)` が 0 から 4 まで、`range(1, 5)` が 1 から 4 まで、というように、終了値の手前までというのを忘れがちです。思った回数ループしないな、と思ったら `range()` の指定を確認してみましょう。
ループ内でリストなどを変更する際の注意
これは少し応用的な話ですが、forループで処理している対象のリストなどを、ループの内部で追加したり削除したりすると、予期せぬ動きをすることがあります。例えば、要素を削除していくと、ループが途中で終わってしまったり、インデックスがずれてエラーになったり。
もしループ内でリストなどを変更したい場合は、元のリストのコピーに対してループを回すなどの工夫が必要になることがあります。初心者のうちは、まずは「ループ対象はループ内で変更しない」と覚えておくと安全です。
エラーが出ても焦らず、メッセージをよく読んで、どこがおかしいか探ってみてくださいね!
もっと効率的に!Pythonのforループ関連テクニック
基本的なforループは理解できましたか?
ここからは、forループをさらに便利に、そしてコードをより「Pythonっぽく」書くためのテクニックを2つ紹介します!
enumerate関数でインデックスも取得
リストなどをループ処理していると、「今、何番目の要素を処理しているのか」を知りたい時があります。
そんな時に便利なのが `enumerate()` 関数です。
これを使うと、ループの中で要素の値と同時に、その要素のインデックス番号(順番の番号、0から始まる)も取得できます。
members = ["Alice", "Bob", "Charlie"] print("出席番号と名前:") for index, name in enumerate(members): # enumerate() でリストを囲む print(f"{index}: {name}")
表示結果
出席番号と名前: 0: Alice 1: Bob 2: Charlie
`enumerate(members)` とすることで、ループごとに `index` に番号が、`name` に名前が入ってきます。
わざわざ自分でカウンター変数を用意しなくても、スマートにインデックスが扱えるので、覚えておくとコードがスッキリしますよ!
zip関数で複数のリストを同時に処理
次に紹介するのは `zip()` 関数です。
これは、複数のリスト(やタプルなど)の要素を、まるでジッパーで閉じるように、ペアにして同時に取り出せる便利な関数です。
例えば、名前のリストと、対応する年齢のリストがあって、それらを一緒に表示したい、みたいな時に役立ちます。
names = ["Sato", "Suzuki", "Takahashi"] ages = [25, 30, 28] for name, age in zip(names, ages): # zip() で複数のリストをまとめる print(f"{name}さんは {age}歳です。")
表示結果
Satoさんは 25歳です。 Suzukiさんは 30歳です。 Takahashiさんは 28歳です。
`zip(names, ages)` とすることで、1回目のループでは `name` に "Sato"、`age` に 25 が、2回目のループでは `name` に "Suzuki"、`age` に 30 が…というように、対応する要素がセットで取り出せます。
注意点として、`zip()` はリストの長さが違う場合、短い方のリストが終わった時点でループも終了します。
例えば、`names` が3つ、`ages` が2つしかなかったら、2回ループした時点で終わりになります。
`enumerate` や `zip` を使いこなせると、より高度なループ処理も簡潔に書けるようになりますよ!
Pythonのforループ学習まとめ
Pythonのforループについて、基本からちょっとした応用テクニックまで見てきました。
ここで、学んだことを簡単にまとめておきましょう。
- forループは、リストや文字列、range()などで決まった回数や要素数だけ処理を繰り返すのに便利。
- 基本構文は `for 変数 in イテラブルオブジェクト:` で、処理はインデントする。
- `range(終了値)` や `range(開始値, 終了値, ステップ)` で数値の繰り返しができる。
- `break` でループを中断、`continue` で処理をスキップできる。
- `enumerate()` でインデックスと要素を同時に取得できる。
- `zip()` で複数のリストなどを同時に処理できる。
- インデントミスやコロン忘れに注意!
forループは、プログラミングの基本的な考え方である「繰り返し」を学ぶ上で、とても良い練習になります。
まずは、この記事のコードを実際に自分で打ち込んで動かしてみてください。
そして、身の回りにある「繰り返しの作業」をforループで自動化できないか考えてみるのも面白いですよ!
例えば、好きな数字のリストを作って合計値を計算してみるとか、簡単なゲームのスコア計算をしてみるとか。
【関連記事】 「Pythonとは?」に答える最初の一歩
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。