はじめに:Pythonの繰り返し処理でコードを効率化しよう
Pythonプログラミングにおいて、同じような処理を何度も実行する場面は頻繁に登場します。そんな時に必須となるのが「繰り返し処理」です。
この記事を読めば、Pythonにおける繰り返しの基本である for文 と while文 の使い方から、コードをよりスマートでPythonらしく記述できる 内包表記 まで、しっかりと理解できます。
この記事で得られること
for文を使った様々なデータの繰り返し方法がわかるwhile文の正しい使い方がわかる- 内包表記を使って、冗長なコードを簡潔に書けるようになる
初心者の方でもコピペしてすぐ試せるサンプルコードを豊富に用意したので、ぜひ最後までお付き合いください。
Pythonにおける繰り返しの基本「for文」
for文は、リストやタプルのような複数の要素を持つデータ(イテラブルオブジェクト)から、要素を1つずつ順番に取り出して処理を行う、最も基本的な繰り返し構文です。
range()を使った基本的なforループ
決まった回数だけ処理を繰り返したい場合に最もよく使われるのがrange()関数です。range(5)と書くと、0から4までの連続した数値のシーケンスを生成します。
# 0から4までの数字を順番に出力
for i in range(5):
print(i)実行結果:
0
1
2
3
4リストやタプルを順番に取り出す
for文の真骨頂は、リストやタプルのようなコレクションの各要素に対して処理を行うことです。これにより、データの数に関わらず同じ処理を適用できます。
fruits = ["apple", "banana", "cherry"]
# リストの各要素を順番に出力
for fruit in fruits:
print(fruit)実行結果:
apple
banana
cherryenumerate()でインデックス付きループ
リストの要素とそのインデックス(何番目か)を同時に取得したい場合があります。その際はenumerate()関数を使うと非常に便利です。
fruits = ["apple", "banana", "cherry"]
# インデックスと要素を同時に取得して出力
for index, fruit in enumerate(fruits):
print(f"{index}: {fruit}")実行結果:
0: apple
1: banana
2: cherryzip()で複数のリストを同時にループ
複数のリストを、同じインデックスの要素同士をペアにして同時に処理したい場合はzip()関数が役立ちます。
names = ["Suzuki", "Sato", "Takahashi"]
ages = [25, 32, 41]
# 2つのリストから対応する要素をペアで取得
for name, age in zip(names, ages):
print(f"{name}さんの年齢は{age}歳です。")実行結果:
Suzukiさんの年齢は25歳です。
Satoさんの年齢は32歳です。
Takahashiさんの年齢は41歳です。この方法は、最も短いリストの要素数に合わせてループが終了します。
条件が満たされるまで繰り返す「while文」
while文は、指定した条件式がTrueである間、内部の処理を繰り返し実行します。for文のように対象のデータがなくても、条件だけでループを作れるのが特徴です。
while文の基本的な使い方
カウンター変数を使い、その変数が特定の条件を満たすまで処理を繰り返すのが一般的な使い方です。カウンターの値を更新し忘れると無限ループに陥るため注意が必要です。
count = 0
# countが5未満の間、処理を繰り返す
while count < 5:
print(f"現在のカウント: {count}")
count += 1 # countを1増やす(この行がないと無限ループになる)
print("ループが終了しました。")実行結果:
現在のカウント: 0
現在のカウント: 1
現在のカウント: 2
現在のカウント: 3
現在のカウント: 4
ループが終了しました。breakとcontinueでループを制御する
while文やfor文のループは、breakとcontinueを使って途中で挙動を制御できます。
break: ループを完全に中断し、ループ構文の次の処理に進みます。continue: 現在の回の処理を中断し、次の回のループ処理の先頭に進みます。
count = 0
while count < 10:
count += 1
if count == 3:
# countが3の時はこの回の処理をスキップ
continue
if count == 7:
# countが7になったらループを抜ける
break
print(count)実行結果:
1
2
4
5
6この例では、countが3の時はprintが実行されず、7になるとループ自体が終了していることがわかります。
コードを簡潔にする「内包表記」とは?
内包表記(Comprehension)は、既存のリストなどから新しいリストや辞書、集合を生成するための、Pythonらしい簡潔な記述方法です。主にforループを一行で書くようなイメージです。
なぜ内包表記を使うのか?メリットを解説
最大のメリットはコードの簡潔さと可読性の向上です。 単純なforループで新しいリストを作成する場合、数行のコードが必要ですが、内包表記を使えば一行で記述できます。また、処理速度も通常のforループより若干速い場合があります。
forループをリスト内包表記に書き換える
forループを使って、0から4までの数値を2乗した新しいリストを作成するコードを見てみましょう。
通常のforループ:
squares = []
for i in range(5):
squares.append(i * i)
print(squares) # [0, 1, 4, 9, 16]これをリスト内包表記で書くと、以下のようになります。
リスト内包表記:
squares = [i * i for i in range(5)]
print(squares) # [0, 1, 4, 9, 16][式 for 変数 in イテラブル]という構文で、非常にスッキリと書けているのがわかります。
ifを使った条件付きリスト内包表記
内包表記にはif文を組み込むことで、条件に一致する要素だけで新しいリストを作成できます。
forループで0から9までの数値から偶数だけを取り出して2乗するコードです。
通常のforループ:
even_squares = []
for i in range(10):
if i % 2 == 0: # 偶数かどうかを判定
even_squares.append(i * i)
print(even_squares) # [0, 4, 16, 36, 64]条件付きリスト内包表記:
even_squares = [i * i for i in range(10) if i % 2 == 0]
print(even_squares) # [0, 4, 16, 36, 64][式 for 変数 in イテラブル if 条件式]という構文で、条件分岐も一行で記述できます。
辞書内包表記と集合内包表記
リスト内包表記と同様の考え方で、辞書や集合も生成できます。
辞書内包表記の使い方
キーと値のペアを持つ辞書を生成します。{キー: 値 for ...}のように波括弧{}を使います。
# 0から4までの数値をキーとし、その2乗を値とする辞書を生成
square_dict = {x: x*x for x in range(5)}
print(square_dict) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}集合内包表記の使い方
重複しない要素を持つ集合(set)を生成します。こちらも波括弧{}を使いますが、キーと値のペアではなく要素だけを記述します。
# リスト内の数値で偶数だけを要素に持つ集合を生成
numbers = [1, 2, 2, 3, 4, 4, 5]
even_set = {x for x in numbers if x % 2 == 0}
print(even_set) # {2, 4}元のリストに2や4が複数あっても、集合なので重複が取り除かれている点に注目してください。
まとめ
今回は、Pythonの基本的な文法である「繰り返し処理」と、それを応用した「内包表記」について解説しました。
for文: リストなどの各要素に対して処理を行う基本のループwhile文: 特定の条件が満たされるまで処理を繰り返すループ- 内包表記:
forループとif文を組み合わせて、新しいリストや辞書などを一行で簡潔に生成するテクニック
繰り返し処理はプログラミングの土台となる非常に重要な概念です。そして、内包表記を使いこなせるようになると、よりPythonらしい、効率的で読みやすいコードが書けるようになります。
まずは簡単なforループから書き始め、慣れてきたら内包表記への書き換えに挑戦してみてください。


コメント