
Table of Contents(目次)
Pythonのfor文の基本構文と使い方
なぜfor文が必要なのか
同じ処理を何度も繰り返したいとき、for文を使うとコードを簡潔に書けます。繰り返しの処理を「自動化」できるのがfor文の強みです。
次のコードでは、商品の合計金額を計算しています。dictで定義した商品と価格の情報から、1行ごとに手動で価格を変数total_price
へ加算しています。商品数が3つならまだしも、100種類ある場合は100行書かなければなりません。これは作業効率が悪く、修正や追加が発生したときにも非常に手間がかかります。
# 商品データ(商品名: 価格(円))
items = {'りんごジュース': 120, 'パンケーキ': 350, 'コーヒー': 250}
# 合計金額を入れる変数を0で初期化
total_price = 0
# 1つずつ手で加算(for文なし)
# 商品が100個に増えると、100行必要になります
total_price += items['りんごジュース']
total_price += items['パンケーキ']
total_price += items['コーヒー']
print(f'合計金額は {total_price} 円です。') # 合計金額は720円です。
for文を使うと、下記のように商品数が増えても1つのループ構文だけで処理できます。(7行目と9行目のコード。) コードが短くなり、拡張性も高いという点が大きなメリットです。一方で、for文の使い方を誤ると意図しない回数の繰り返しになることもあるため、構文の理解が重要です。
# 商品データ(商品名: 価格(円))
items = {'りんごジュース': 120, 'パンケーキ': 350, 'コーヒー': 250}
# 合計金額を入れる変数を0で初期化
total_price = 0
# dictの場合、for文で回すとキー(商品名)が順に取得できます
for item_name in items:
# 商品数が100個以上になっても、この1行だけで対応できます(商品の価格をtotal_priceに加算)
total_price += items[item_name]
print(f'合計金額は {total_price} 円です。') # 合計金額は720円です。
for文の基本構文
for 変数 in イテラブル:
処理
for
:繰り返しを開始するキーワードです。変数
:イテラブルの中から1つずつ値(要素)を受け取る変数です。ループのたびに中身が更新されます。in
:データ(list・文字列など)の中から順に要素を取り出すことを指示するキーワードです。for ~ in
の組み合わせで使います。イテラブル
:forで繰り返し処理できる対象です。要素を複数持つことができるものや、連続で値を返すものが該当します。- list、dictのような、複数の値を保持できる構造体
- 文字列も複数の文字情報を保持するため、該当します
- range() は特定の回数のループに使われます。引数で指定した値に応じて、連続した整数を返します。
:
:行の最後に必ずコロンが必要です。忘れないようにしましょう。処理
:繰り返しごとに実行する命令です。インデント(基本は半角スペース4つ分)で範囲を示します。
つまり「イテラブル
の中の要素を1つずつ取り出して変数
に代入し、その都度処理
を実行する」という流れになります。
次のような記述でfor文を定義するプログラミング言語が存在します。
for (i=0; i < 10; i++) {
// 繰り返し処理
}
Pythonはこの記述方法は存在しません。
Pythonは、
データ構造の要素数だけ繰り返す書き方、
for var in list:
もしくは、range()
を使って繰り返す回数を指定する方法、
for var in range(5):
しかありません。
慣れてしまえば、Pythonの構文の方がコードを書く手間も少なく、可読性も担保できます。
for文の簡単な例
for文の動きを理解するために、list内の要素を1つずつ取り出して表示してみましょう。
fruits = ['apple', 'banana', 'cherry']
for fruit in fruits:
print(fruit)
# 出力結果
apple
banana
cherry
- 変数
fruits
はlistで、イテラブルなデータです。 - このlistには
'apple'
、'banana'
、'cherry'
という3つの文字列が入っています。 for fruit in fruits:
は、「変数fruits
の中から1つずつ取り出して変数fruit
に代入し、処理を繰り返す」という意味です。- 最初は
fruit = 'apple'
、次は'banana'
、最後は'cherry'
と、処理が繰り返されるたびに、変数fruit
へ値が代入されます。 print(fruit)
で、その都度取り出した要素を出力します。
この書き方のメリットは、要素数がいくつあっても同じ構文で処理できることです。デメリットとしては、すべての要素に同じ処理しかできないため、条件付き処理をしたい場合はif文などと組み合わせる必要があります。
インデント(字下げ・基本は半角スペース4つ)は必ず必要です。Pythonではこれがブロックの範囲を決めるため、省略するとエラーになります。
for文で要素の合計を計算する
for文を使えば、このレクチャーの最初に示したように、要素の値の合計を求めることができます。1つずつ手で足していくよりも、データが増えても短いコードで対応できるのが大きな利点です。
今回は、listを使ったサンプルコードになります。
numbers = [10, 20, 30, 40, 50]
total = 0
for number in numbers:
total += number
print(f'合計: {total}') # 合計: 150
このコードでは、変数numbers
に数値が5つ入っています。変数total
を0
で初期化し、for文で変数numbers
の要素を1つずつ取り出してtotal += number
で加算しています。1回目のループで10
(0+10)、2回目で30
(10+20)... 最終的に150
になります。
もしfor文を使わなければ、次のようにすべて手で書く必要があります。
total += numbers[0]
total += numbers[1]
total += numbers[2]
total += numbers[3]
total += numbers[4]
データの数が多い場合、for文を使うことで効率的かつ可読性の高いコードにできます。
また、Pythonには上記と同じ結果を1行で求める sum()
関数があります。 sum()
関数に引数としてlistを渡せば、全ての要素の合計値を返してくれます。単純な加算であればsum()
でもいいのですが、for文を使うことで、途中で条件分岐を入れるなど、より柔軟に処理を制御できます。例えば、『正の数のみ足し合わせる』や、『異常値が含まれていた時にエラーを発生させる』などの処理は、for文を使って自分で処理を制御する必要があります。
for文とif文を組み合わせて条件付き処理を行う
for文は、if文と組み合わせることで「特定の条件を満たす要素だけを処理する」といった使い方もできます。以下の例では、偶数だけを取り出して新しいlistに追加しています。
numbers = [10, 15, 20, 25, 30]
evens = []
for number in numbers:
if number % 2 == 0:
evens.append(number)
print(f'偶数: {evens}') # 偶数: [10, 20, 30]
if number % 2 == 0
は「2で割ったときの余りが0なら偶数」という意味です。条件を満たすときだけ evens.append(number)
が実行され、変数 evens
にその数値を追加します。
このように、for文とif文を組み合わせることで「条件に合う要素だけを取り出す」「特定の値だけをカウントする」といった柔軟な処理が可能です。
range()を使って指定回数だけ繰り返す
for文は、listやdictなどのデータを回すだけでなく、単純に「指定した回数だけ繰り返す」処理にも使えます。そのときに便利なのが range()
です。
for i in range(5):
print(i)
# 出力結果
0
1
2
3
4
range()
は、0から始まり、引数で指定した数の1つ手前まで整数を生成します。range(5)
の場合、 0から4まで(5の1つ手前まで) の整数を順に生成します。
- 変数
i
には 0 → 1 → 2 → 3 → 4 が順番に代入されます。 print(i)
で各数値が出力されます。
range()
の詳細な使い方は、専用のレクチャーで解説します。
for文でよくある間違いと注意点
インデントを忘れる
for number in numbers:
print(number) # エラーになります。
Pythonでは、インデント(字下げ)がブロックの範囲を表します。上のようにインデントを省略すると IndentationError
が発生します。必ずブロック内の処理を1段下げて書きましょう。
rangeの終端を勘違いする
for i in range(3):
print(i)
# 出力結果
0
1
2
range(3)
は「0から2まで(3の1つ手前まで)」を生成します。終端の値は含まれないことを覚えておきましょう。
ループ中にlistを変更しない
for文でループ中にlistを変更すると、参照しているlistの長さが途中で変わり、ループが終わらなくなったり、想定外の結果になることがあります。
下記の場合、変数numbers
はfor文のブロックの中で、要素数を加える処理(append()
)を行っています。Pythonでは、listに要素が残っている場合、for文は反復を続けます。ですので、forブロックの中で要素が追加され続けると、繰り返し処理は延々と終わりません。
numbers = [1, 2, 3]
for number in numbers:
numbers.append(number * 2) # 無限ループや予期せぬ動作の原因になります。
このような、終わらない繰り返し処理の事を『無限ループ (永久ループ)』と言います。無限ループになってしまった場合は、アプリを強制終了させるしかありません。Visual Studio Codeの場合は、画面上部のStopボタンをクリックして、強制的に処理を止めます。
無限ループにならないように、numbers.copy()
でコピーを作ってループするのが安全です。
下記の場合、変数numbers
と、numbers.copy()
で生成されたlistは別オブジェクトなので、変数numbers
に対して要素数を加える処理を行っても、元のlistの要素数(3個)の繰り返しで処理を終えます。
ループは『numbers.copy()
で生成されたlist』に対して反復処理を行うため、元のlist(変数numbers
)への変更は反復回数に影響を与えません。
numbers = [1, 2, 3]
for number in numbers.copy():
numbers.append(number * 2)