Python独習塾

  • ホーム
  • Pythonのfor文(繰り返し処理、ループ)を解説【range, enumerate】

Pythonのfor文(繰り返し処理、ループ)を解説【range, enumerate】

  • 作成日: 2025-06-18
  • 更新日: 2025-07-20
  • カテゴリ: 基本
  • タグ: for, break, continue

Pythonのfor文について詳しく解説します。リストやタプルやrange等のシーケンス型を回す方法や、辞書や集合などを回す方法、それから組み込み関数のenumerateやreversedを組み合わせて使う方法を解説します。
参考ドキュメントは以下になります。

8. for文 — 複合文 (compound statement) — Python 3.13.5 ドキュメント

Pythonのfor文のBNF構造はどうなってるの?

BNF少女

Pythonのfor文のBNF構造は以下のようになっています。

for_stmt ::= "for" target_list "in" starred_list ":" suite  
             ["else" ":" suite]  

出典:8. for文 — 複合文 (compound statement) — Python 3.13.5 ドキュメント

for_stmtというのがfor文です。::=の右側がfor文の中身です。
まずキーワードとしてforがあり、そのあとにtarget_listが続きます。
そしてその後にキーワードのinがあり、その後にstarred_listが続きます。
その後にキーワードの:が続き、その後にsuiteが続きます。

そして最後にelse節が付いたり付かなかったりします。
else節はキーワードのelseで始まり、その後に:が続き、その後にsuiteが続きます。

Pythonのfor文のstarred_listの意味は?

Pythonのfor文のstarred_listはイテラブルオブジェクトを生成するものです。

出典:iterable — 用語集 — Python 3.13.5 ドキュメント

イテラブルオブジェクトはイテレータなどで生成されます。

出典:iterator — 用語集 — Python 3.13.5 ドキュメント

イテレータとはデータの流れを表現するオブジェクトのことです。
たとえばlisttupleなどのシーケンスはiter()に渡すとイテレータを生成します。また、listtupleなどはfor文のstarred_listにすると自動でイテレータを生成します。
つまりstarred_listlisttupleを渡すと、自動でイテレータが生成され、そのイテレータがイテラブルオブジェクトを生成することになります。

Pythonのfor文のtarget_listの意味は?

Pythonのfor文のtarget_listにはstarred_listが生成するイテラブルオブジェクトが代入されます。
この代入のルールは代入文によるルールになります。

出典:7. 代入文 — 単純文 (simple statement) — Python 3.13.5 ドキュメント

代入文は単純なa = bという代入と、複数のa, b = cという代入が行えます。
これはfor文のtarget_listでも同様で、target_listは複数のアイテムを持つことができます。
つまり以下のような文法が可能だということです。

for アイテム in starred_list:  
    suite  

for アイテム1, アイテム2 in starred_list:  
    suite  

Pythonのfor文のelse節ってなに?

elseを疑問に思いながら見る少年

Pythonのfor文の処理がすべて正常終了するとelse節が実行されます。
else節はsuiteを持っています。

for target_list in starred_list:  # このfor文が正常終了すると  
    suite  
else:  # このelse節のsuiteが実行される  
    suite  

for文のsuiteにbreak文があって実行されると、else節は実行されません。そのため、break文が実行されなかったときの処理を書きたい場合に、else節を使うことがあります。

Pythonのfor文のsuiteってなに?

Pythonのfor文でのsuiteは複数の式や文などを含んだものになります。
つまり1 + 2などの式やif文やfor文や、関数呼び出しなどを書くことができます。

for target_list in starred_list:  
    # 以下はいずれもsuite  
    if 1 < 2:  
        var = 3 + 4  
        print(var)  
    else:  
        func()  

関連記事:Pythonのif文(条件分岐)の書き方の解説【elif, else】

Pythonのfor文でbreak文を実行するとどうなるの?

すべてをぶっ壊すbreakマン

Pythonのfor文のsuiteでbreak文が実行されると、親のfor文からループを抜けます。この時、else節は実行されずスキップされます。

for target_list in starred_list:  
    break  # ループを抜ける  
else:  # else節は実行されない  
    suite   

出典:4. break 文と continue 文 — その他の制御フローツール — Python 3.13.5 ドキュメント

break文は一般にループ処理から抜け出したいときに使います。よくあるのはif文と組み合わせてbreak文を実行する形です。

for target_list in starred_list:  
    if target_list > 0:  
        break  # target_listが0より上ならここでループからbreakする。  
else:  
    suite  # break文が実行された場合、else節は実行されない。  

上記ではtarget_listが0より上な時にbreak文が実行されて、for文から抜け出します。break文でループから抜け出すと、そこでfor文は終了します。

Pythonのfor文のcontinue文を実行するとどうなるの?

Pythonのfor文のsuiteでcontinue文が実行されると、それ以降の処理がスキップされます。

for target_list in starred_list:  
    continue  
    # 以降の処理がスキップされる。  

出典:4. break 文と continue 文 — その他の制御フローツール — Python 3.13.5 ドキュメント

continue文は特定の条件でfor文の中の処理(suite)をスキップしたいときに使われます。たとえばよくあるのはif文とcontinue文を組み合わせる形です。

for target_list in starred_list:  
    if target_list > 0:  
        continue  
        # target_listが0より上なら以降の処理がスキップされる。  
else:  
    suite  # continue文は実行してもelse節は実行される。  

上記ではtarget_listの値が0より上な時にcontinue文が実行されて、処理がスキップされます。

Pythonのfor文の文法的構造はどうなってる?

BNFからわかるPythonのfor文の文法的な構造を見てみます。基本形は以下です。

for アイテム in イテラブルを生成するオブジェクト:  
    ループ内の処理  

イテラブル(反復可能)オブジェクトはアイテムに代入されますが、この代入は代入文のルールによります。

出典:7. 代入文 — 単純文 (simple statement) — Python 3.13.5 ドキュメント

よって以下の文法も許容されます。

for アイテム1, アイテム2 in イテラブルを生成するオブジェクト:  
    ループ内の処理  

for文のお尻にはオプションでelse節が付くことがあります。

for アイテム in イテラブルを生成するオブジェクト:  
    ループ内の処理  
else:  
    ループが終わった時の処理  

else節はループがbreakされずに正常終了したときに実行されます。for文内でbreak文が実行された場合はelse節は実行されません。

コードで見るPythonのfor文

何かを書いている少年

Pythonのfor文の基礎的な文法は以下です。

for アイテム in イテラブルを生成するオブジェクト:  
    処理  

上記の文法で「イテラブルを生成するオブジェクト」には以下が含まれます。

  • シーケンス型(list, tuple, range)
  • テキストシーケンス型(str)
  • バイナリシーケンス型(bytes, bytearray, memoryview)
  • コレクション(set, その他)
  • マッピング型(dict)
  • その他

このうち、よく使用するオブジェクトとしては以下が挙げられます。

  • list
  • tuple
  • range
  • str
  • bytes
  • set
  • dict

また、組み込み関数enumerateはイテラブルを生成するenumerateオブジェクトを生成します。

  • enumerate

また、組み込み関数reverseはイテラブルを生成するリバースイテレーターを生成します。

  • reverse

また、for文の処理(suite)の中ではbreak文とcontinue文を使うことができます。

  • break
  • continue

Pythonのfor文でリストを回すコードはどうなる?

リスト(list)はPythonのシーケンス型の1つです。
リストはミュータブル(可変)なシーケンスで、複数の値をまとめるときに使われます。

出典:リスト型 — 組み込み型 — Python 3.13.5 ドキュメント

関連記事:Pythonのリスト(list)の解説【append, extend】

リストをfor文で回すには以下のようにします。

# リスト  
lis = [1, 2, 3]  

for item in lis:  
    print(item)  
1  
2  
3  

starred_listにリストを書きます。そうするとリストからイテラブルオブジェクトが生成されてtarget_listitem)に代入されます。

Pythonのfor文でタプルを回すコードはどうなる?

タプル(tuple)はPythonのシーケンス型の1つです。
タプルはイミュータブル(不変)なシーケンスで、リストと同様に複数の値をまとめるときに使われます。

出典:タプル型 — 組み込み型 — Python 3.13.5 ドキュメント

関連記事:Pythonのtuple(タプル)の解説【イミュータブル、シーケンス】

# タプル  
tup = (1, 2, 3)  

for item in tup:  
    print(item)  
1  
2  
3  

starred_listにタプルを書きます。そうするとタプルからイテラブルオブジェクトが生成されてtarget_listitem)に代入されます。

Pythonのfor文でrangeを回すコードはどうなる?

range(レンジ)はPythonのシーケンス型の1つです。
rangeは数の集まりを表すシーケンスです。for文のループ処理で使われます。

関連記事:Pythonのrangeの解説【for文,1から,逆順】

class range(stop)  
class range(start, stop)  
class range(start, stop, step)  

出典:range型 — 組み込み型 — Python 3.13.5 ドキュメント

関連記事:Pythonのrangeの解説【for文,1から,逆順】

Pythonのrangeで一定回数まわすには?

rangeでループを4回まわしたいときは以下のようにします。

for i in range(4):  
    print(i)  
0  
1  
2  
3  

range(4)と書くと、rangeが引数の整数4を元に数を0から1ずつ増やしながら生成します。
その数がtarget_listi)に代入されていきます。

関連記事:Pythonのrangeの解説【for文,1から,逆順】

Pythonのrangeで一定範囲まわすには?

rangeでループを4から8まで回したいときは以下のようにします。

for i in range(4, 8):  
    print(i)  
4  
5  
6  
7  

range(開始位置, 停止位置)です。
上記の場合は4から開始して、8より下まで増加します。

関連記事:Pythonのrangeの解説【for文,1から,逆順】

Pythonのrangeで一定間隔で回すには?

rangeで一定範囲の中で増加量を指定したい場合は以下のようにします。

for i in range(0, 8, 2):  
    print(i)  
0  
2  
4  
6  

range(開始位置, 停止位置, 増加量)です。
range()の3つめに2を指定すると2ずつ増加します。4を指定した場合は4ずつ増加します。

増加量には負数も指定できます。

for i in range(8, 0, -2):  
    print(i)  
8  
6  
4  
2  

上記の場合は8から始まって0まで-2ずつ減少していきます。

関連記事:Pythonのrangeの解説【for文,1から,逆順】

Pythonのfor文で文字列(str)を回すには?

Pythonのfor文では文字列(str)を回すこともできます。
Pythonの文字列はテキストシーケンス型で、イミュータブル(不変)なシーケンスです。

出典:テキストシーケンス型 — 組み込み型 — Python 3.13.5 ドキュメント

文字列はシングルクオートかまたはダブルクオートで文字列を囲むか、str()で生成できます。

for c in 'Hello':  
    print(c)  
H  
e  
l  
l  
o  

文字列は先頭から末尾に向かって順にtarget_listc)に代入されていきます。
代入されるtarget_listは文字列型です。

for c in 'Hello':  
    print(type(c))  
<class 'str'>  
<class 'str'>  
<class 'str'>  
<class 'str'>  
<class 'str'>  

Pythonのfor文でバイト列(bytes)を回すには?

Pythonのfor文ではバイト列(bytes)を回すこともできます。
Pythonのバイト列はバイナリシーケンス型で、シーケンスの一種です。

出典:バイナリシーケンス型 — 組み込み型 — Python 3.13.5 ドキュメント

バイト列は文字列のプレフィクスにbを付けるか、bytes()で生成できます。

for c in b'Hello':  
    print(c)  
72  
101  
108  
108  
111  

バイト列も先頭から末尾に向かって順にtarget_listc)に代入されていきます。
代入されるtarget_listは整数型です。

for c in b'Hello':  
    print(type(c))  
<class 'int'>  
<class 'int'>  
<class 'int'>  
<class 'int'>  
<class 'int'>  

Pythonのfor文で集合(set)を回すには?

Pythonのfor文では集合(set)も回すことができます。
Pythonの集合は順序なしコレクションです。重複しない値の集まりで、ブレース({})かset()で生成できます。

出典:set(集合)型 — 組み込み型 — Python 3.13.5 ドキュメント

関連記事:Pythonのset(集合)の解説

s = {1, 2, 3}  

for item in s:  
    print(item)  
1  
2  
3  

集合は値の小さい方から順にtarget_listに代入されていきます。

s = {3, 1, 2}  

for item in s:  
    print(item)  
1  
2  
3  

Pythonのfor文で辞書(dict)を回すには?

Pythonのfor文では辞書(dict)を回すことができます。
Pythonの辞書はマッピング型で、キーと値を関連付けて管理できます。ブレース({})かdict()で生成できます。

出典:マッピング型 — 組み込み型 — Python 3.13.5 ドキュメント

関連記事:Pythonのdict(辞書)の解説

辞書はfor文にそのまま渡すとtarget_listにキーを代入します。キーとは、値に紐づいているアイテムを表す識別子のことです。

d = {'a': 1, 'b': 2, 'c': 3}  

for key in d:  
    print(key, d[key])  
a 1  
b 2  
c 3  

上記の場合{'a': 1, ...}aがキーで、1が値です。
辞書は辞書[キー]で値を参照することができます。上記ではd[key]で値を参照しています。

またdict.keys()でもキーをtarget_listに代入していくことができます。

d = {'a': 1, 'b': 2, 'c': 3}  

for key in d.keys():  
    print(key, d[key])  
a 1  
b 2  
c 3  

値をtarget_listに代入していきたい場合はdict.values()を使います。

d = {'a': 1, 'b': 2, 'c': 3}  

for val in d.values():  
    print(val)  
1  
2  
3  

キーと値を同時にtarget_listに代入したい場合はdict.items()を使います。

d = {'a': 1, 'b': 2, 'c': 3}  

for key, val in d.items():  
    print(key, val)  
a 1  
b 2  
c 3  

enumerateで添え字と値を取り出すには?

Pythonの組み込み関数enumerateを使うと、リストやタプルなどから添え字と値を同時にtarget_listに代入することができます。

出典:enumerate — 組み込み関数 — Python 3.13.5 ドキュメント

enumerate(iterable, start=0)  

enumerateはenumerateオブジェクトを生成します。
引数iterableはシーケンスかイテレータ、あるいはイテレーションをサポートするオブジェクトである必要があります。
引数startは添え字の開始番号を指定することができます。
enumerateオブジェクトはlist()tuple()などに渡すと添え字と値をタプルにした列を生成できます。

obj = enumerate([10, 20, 30])  
print(type(obj))  # <class 'enumerate'>  
print(obj)  # <enumerate object at 0x000001F64DCF1EE0>  
print(list(obj))  # [(0, 10), (1, 20), (2, 30)]  

obj = enumerate([10, 20, 30], 5)  
print(list(obj))  # [(5, 10), (6, 20), (7, 30)]  

enumerateオブジェクトはfor文のstarred_listにするとイテラブルオブジェクトを生成します。
これはつまりタプルで、target_listへの代入は複数可能なので、以下のように添え字と値を取り出すことができます。

lis = [10, 20, 30]  

for i, val in enumerate(lis):  
    print(i, val)  
0 10  
1 20  
2 30  

添え字の起点を指定したい場合は以下のように指定します。

lis = [10, 20, 30]  

# 5起点で添え字を開始する  
for i, val in enumerate(lis, 5):  
    print(i, val)  
5 10  
6 20  
7 30  

reversedで要素を逆順にするには?

Pythonの組み込み関数reversedを使うと、リストやタプルなどのシーケンスを逆順にすることができます。

出典:reversed — 組み込み関数 — Python 3.13.5 ドキュメント

reversed(seq)  

reversed関数は要素を逆順に取り出すリバースイテレータを返します。
引数seqはリストやタプルなどのシーケンスか、__len__メソッドと__getitem__メソッドを実装しているオブジェクトでないといけません。
for文ではリストなどを逆順にしたい場合はreversedを組み合わせて使います。

lis = [1, 2, 3]  

for item in reversed(lis):  
    print(item)  
3  
2  
1  

reversedで添え字を取り出したい場合はenumerateを併用します。
しかしenumerateで取り出す添え字は逆順にはなっていないので注意が必要です。

lis = [1, 2, 3]  

for i, val in enumerate(reversed(lis)):  
    print(i, val)  
0 3  
1 2  
2 1  

Pythonのfor文でbreak文を使い、ループから抜けるには?

Pythonのfor文ではbreak文を使うことができます。break文はループから抜ける際に使います。

出典:4. break 文と continue 文 — その他の制御フローツール — Python 3.13.5 ドキュメント

for i in range(4):  
    print(i)  
    if i == 1:  
        break  
0  
1  

上記のコードでは変数iが1になったらif文が真になり、break文が実行されます。
break文が実行されると、for文から抜けます。よって、printされる値は0, 1のみとなります。

break文が実行されるとfor文のelse節は実行されなくなります。
たとえば以下のコードではelse節が実行されます。

for i in range(4):  
    print(i)  
else:  
    print('完了')  
0  
1  
2  
3  
完了  

しかし以下のコードではbreak文が実行されるのでelse節が実行されません。

for i in range(4):  
    print(i)  
    if i == 1:  
        break  
else:  
    print('完了')  
0  
1  

Pythonのbreak文で入れ子になったループから抜けるには?

break文は親のfor文から抜けます。break文1つだけでは入れ子になったfor文からは脱出できません。

for i in range(4):  
    for j in range(4):  
        print(i, j)  
        if j == 1:  
            break  # jのfor文から抜ける  
0 0  
0 1  
1 0  
1 1  
2 0  
2 1  
3 0  
3 1  

入れ子になったfor文から抜けたい場合はフラグ変数とif文を組み合わせて使います。

flag = False  

for i in range(4):  
    for j in range(4):  
        print(i, j)  
        if j == 1:  
            flag = True  # フラグを立てる  
            break  # jのfor文から抜ける  
    if flag:  
        break  # iのfor文から抜ける  
0 0  
0 1  

上記ではflagがTrueになったらfor i in range(4):から抜けます。flagfor j in range(4):のループ内でTrueになります。

Pythonのfor文のelse節ってどういう使い道があるの?

Pythonのfor文のelse節は以下の特徴があります。

  • for文内でbreak文が実行された場合に実行されない

よって、以下の使い道が考えられます。

  • for文でbreak文を実行しなかった時の処理が書ける

たとえばリストから特定の値を探す関数を考えます。この関数はリスト内に特定の値があればTrueを返し、無ければFalseを返します。

def has_value(lis: list, target: int):  
    for item in lis:  
        if item == target:  
            break  # 値が見つかったのでbreak.  
    else:  
        return False  # 値が見つからなかった場合はここが実行される。  
    return True  # 値が見つかった場合はここが実行される。  

lis = [1, 2, 3]  
print(has_value(lis, 2))  # True  
print(has_value(lis, 4))  # False  

上記のような実装に応用することもできます。もっとも、このような判定は以下のように「in」を使った方が簡単に判定が行えます。上記はあくまで実装例として示しました。

lis = [1, 2, 3]  
print(2 in lis)  # True  
print(4 in lis)  # False  

Pythonのfor文でcontinue文を使い、ループをスキップするには?

Pythonのfor文でループをスキップしたい場合はcontinue文を使います。

出典:4. break 文と continue 文 — その他の制御フローツール — Python 3.13.5 ドキュメント

for i in range(4):  
    if i >= 2:  
        continue  
    print(i)  
0  
1  

上記では変数iが2以上になったらif文が真になり、continue文が実行されます。
continue文が実行されるとそれ以降にある処理(print)はスキップされます。

continue文は実行してもfor文のelse節は実行されます。

for i in range(4):  
    if i >= 2:  
        continue  
    print(i)  
else:  
    print('完了')  
0  
1  
完了  

continue文も親のfor文に作用します。入れ子になっている場合は親以外のfor文には作用しません。

for i in range(4):  
    for j in range(4):  
        if j >= 2:  
            continue  
        print(i, j)  
0 0  
0 1  
1 0  
1 1  
2 0  
2 1  
3 0  
3 1  

Pythonのbreak文とcontinue文の違いは?

Pythonのbreak文とcontinue文の違いは以下の通りです。

  • break文 ... 実行するとそこからループを抜ける
  • continue文 ... 実行するとそれ以降の処理をスキップする

break文は「ループをぶっ壊す(break)」、continue文は「ループをスキップして継続する(continue)」と覚えることもできます。
breakは日本語では「壊す」、continueは日本語では「続ける」という意味を持っていますので、それと関連させて覚えてもいいでしょう。

出典:breakの意味・使い方・読み方・覚え方 | Weblio英和辞書
出典:英語「continue」の意味・使い方・読み方 | Weblio英和辞書

Pythonのfor文で高速化を行うには?

Pythonは遅い言語です。最近はPythonにもJITコンパイラの実装が進み始めていて、その内速くなるかもしれませんが、今のところ大変遅いです。
Pythonのfor文も例外ではなく、そのため高速化を意識した実装が大事になってきます。

Pythonの添え字参照って遅いの?

for文内で添え字でリストなどを参照するのは遅くなると言われています。

lis = [1, 2, 3]  

for i in range(len(lis)):  
    print(lis[i])  
    # lis[i]で添え字アクセスをしています。  

これはインデックスアクセスでO(1)の処理が必要なのと、関数呼び出し(CPythonレベルで見た場合の)のコストがあるからだと想像できます。
そのため添え字参照ではなくて直接リストから参照を行います。

lis = [1, 2, 3]  

for item in lis:  
    print(item)  
    # 添え字アクセスなしです。  

この場合はイテレータが生成するitemを出力するだけなので添え字アクセスより高速になるはずです。

要素の生成はリスト内法表記の方が速いの?

for文を普通に回してリストなどに値を格納するのは、遅いと言われています。

lis = []  

for i in range(4):  
    lis.append(i)  

print(lis)  # [0, 1, 2, 3]  

そのため、こういうケースではリスト内包表記を使った方が速くなります。

lis = [i for i in range(4)]  
print(lis)  # [0, 1, 2, 3]  

要素の変換にはmapを使った方が速いの?

for文で要素をキャストして別のリストなどに格納するのは、mapを使った方が速いと言われています。

lis = []  

for c in '0123':  
    lis.append(int(c))  

print(lis)  # [0, 1, 2, 3]  

上記のコードをmapで書き直すと以下のようになります。

lis = list(map(int, '0123'))  
print(lis)  # [0, 1, 2, 3]  

mapは組み込み関数なので、Pythonのコードを書くよりも最適化を行いやすいのが特徴です。つまりCPythonレベルの実装で見た場合、mapの実装はほとんどC言語になると思われるため、mapを使った方が速いという理屈です。

関連記事

Pythonのrangeの解説【for文,1から,逆順】

カテゴリー