「Pythonにはなぜforeach文がないんだろう?」と疑問に思ったことはありませんか?
特に、JavaScriptやC#など他の言語を経験された方なら、foreach文の便利さをよくご存知のことと思います。Pythonでもfor文・map関数・リスト内包表記を使えば、foreach文とまったく同じ処理を実現できます。
この記事では、Pythonでforeachのようなループ処理を書く方法を、初心者の方にも分かりやすいサンプルコード付きで丁寧に解説します。
Pythonのfor文の基礎から確認したい方は、こちらの記事も参考にしてみてください。
→ Python for文の使い方を徹底解説
foreach文とは?基本的な仕組みをおさらい
まず、foreach文を知らない方のために基本を整理しておきます。
foreach文とは、プログラミングにおける繰り返し(ループ)制御構文の一つです。配列やリストなどのコレクションから要素を1つずつ取り出して処理でき、for文よりも可読性が高く簡潔に記述できるのが特徴です。
C#・PHP・JavaScriptなど多くの言語で利用できます。
C#でのforeach文の記述例
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
foreach (int number in numbers)
{
Console.WriteLine(number);
}
}
}
実行結果:
1
2
3
4
5
同じ処理をfor文で書くと以下のようになります。
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
for (int i = 0; i < numbers.Count; i++)
{
Console.WriteLine(numbers[i]);
}
}
}
このように、リストから要素を取り出す処理はfor文よりforeach文の方がシンプルに書けますね。
foreachが苦手な処理
foreach文にも不向きな処理があります。代表的なものを確認しておきましょう。
① 要素のインデックスが必要な場合
foreach文は要素を直接取得する構文のため、インデックス番号へのアクセスが難しいです。インデックスが必要な処理にはfor文を使う方が適しています。
// C# でインデックスが必要な場合はfor文を使う
List<int> numbers = new List<int> { 10, 20, 30, 40, 50 };
for (int i = 0; i < numbers.Count; i++)
{
Console.WriteLine($"Index: {i}, Value: {numbers[i]}");
}
② ループ中にコレクションを変更する場合
foreach文でループ中にリストの要素を追加・削除しようとすると、多くの言語でエラーになります。このような処理には通常のfor文か、コレクションのコピーを使う方法が安全です。
PythonにforeachがないのはなぜかPython自体がforeachの設計になっているから
実はPythonのfor文はそれ自体がforeachの設計になっています。
多くの言語では「インデックスでループするfor文」と「要素を直接取り出すforeach文」が別々に存在しますが、Pythonのfor文は最初から「イテラブル(繰り返し可能なオブジェクト)から要素を直接取り出す」仕様になっています。
つまり、Pythonのfor文=foreach文と考えてしまって問題ありません。
Pythonでforeachと同じ処理を実現する4つの方法
ここからが本題です。Pythonでforeachと同等の処理を書く代表的な方法を4つ紹介します。
方法① for文で要素を直接取り出す(最もシンプル)
Pythonのfor文は、リストや辞書などのイテラブルから要素を直接取り出せます。これがforeachと同等の基本的な書き方です。
# リストの要素を1つずつ取り出す(foreachと同じ動作)
numbers = [1, 2, 3, 4, 5]
for number in numbers:
print(number)
実行結果:
1
2
3
4
5
C#のforeach文と見比べてみてください。ほぼ同じ感覚で書けることが分かります。
方法② enumerate()でインデックス付きforeachを実現する
foreachが苦手とする「インデックスも同時に取得したい」という場面では、Pythonのenumerate()関数が便利です。
# インデックスと要素を同時に取得する
fruits = ["apple", "banana", "cherry"]
for index, fruit in enumerate(fruits):
print(f"Index: {index}, Value: {fruit}")
実行結果:
Index: 0, Value: apple
Index: 1, Value: banana
Index: 2, Value: cherry
enumerate()を使えば、foreachの弱点だった「インデックスへのアクセス」も簡単に解決できます。
方法③ map()関数で要素に処理を適用する
map()関数を使うと、リストの各要素に関数を適用する処理をforeachライクに書けます。特に全要素に同じ変換処理を行いたいときに便利です。
# 各要素を2倍にする処理をmap()で実現
numbers = [1, 2, 3, 4, 5]
doubled = list(map(lambda x: x * 2, numbers))
print(doubled)
実行結果:
[2, 4, 6, 8, 10]
map()はfor文よりも処理速度が速い場合があり、パフォーマンスが求められる場面でも活躍します。
方法④ リスト内包表記でforeachをよりPythonicに書く
Pythonらしい(Pythonic)書き方として、リスト内包表記があります。foreach的なループ処理を1行で書けるため、コードがすっきりします。
# リスト内包表記で各要素を2倍にする
numbers = [1, 2, 3, 4, 5]
doubled = [x * 2 for x in numbers]
print(doubled)
実行結果:
[2, 4, 6, 8, 10]
条件フィルタリングも同時にできます。
# 偶数だけを2倍にして取り出す
numbers = [1, 2, 3, 4, 5, 6]
result = [x * 2 for x in numbers if x % 2 == 0]
print(result)
実行結果:
[4, 8, 12]
辞書(dict)に対してforeachと同じ処理をする方法
リストだけでなく、辞書(dict)に対してもforeachのようなループ処理が可能です。
キーだけをループする
person = {"name": "Alice", "age": 30, "city": "Tokyo"}
for key in person:
print(key)
実行結果:
name
age
city
キーと値を同時にループする(items()を使う)
person = {"name": "Alice", "age": 30, "city": "Tokyo"}
for key, value in person.items():
print(f"{key}: {value}")
実行結果:
name: Alice
age: 30
city: Tokyo
items()を使えば、キーと値をセットで取り出せるので非常に便利です。
4つの方法の比較まとめ
ここまで紹介した4つの方法を表にまとめます。
| 方法 | 特徴 | 向いている場面 |
|---|---|---|
| for文(基本) | 最もシンプルで読みやすい | 基本的なループ処理全般 |
| enumerate() | インデックスと要素を同時取得 | インデックスが必要な処理 |
| map()関数 | 全要素に関数を適用、高速 | 変換処理・パフォーマンス重視 |
| リスト内包表記 | 1行で書けるPythonic | 変換+フィルタリングを簡潔に |
まとめ:Pythonのfor文はforeachそのもの
この記事では、Pythonでforeachのようなループ処理を実現する方法を4つ紹介しました。
- Pythonのfor文はそれ自体がforeachの設計になっている
- インデックスも必要ならenumerate()を使う
- 変換処理にはmap()関数が便利
- Pythonicに書くならリスト内包表記がおすすめ
他の言語のforeach文と同等以上のことがPythonでも十分できますので、ぜひ活用してみてください。
Pythonのfor文についてさらに詳しく学びたい方は、こちらの記事もあわせてどうぞ。
→ Python for文の使い方を徹底解説
📚 関連記事
- 初心者はこれでOK!Pythonのfor文をマスター!— for文の基礎を詳しく解説しており、対象記事の前提知識として最適
- Pythonのenumerate関数・zip関数をfor文で使う方法【初心者向け解説】— enumerate()の実践的な使用方法を扱っており、対象記事の方法②を補完
- forやwhileでelseを使った場合の動作と目的— Pythonのfor文の応用知識として、より深い理解に貢献
- Python初心者のためのリストの基礎と実用例3問— foreachで処理するリストについての基礎知識を提供





