Python

【Python】for文を使ってループ処理をする方法

この記事では、Pythonのfor文の使い方を解説します。

プログラミングでは、同じような処理を繰り返したい時がよくあります。普通に書くとなると繰り返す回数だけ処理を書くことになりますが、これだとめんどくさいし効率も良くありません。

同じような処理を何度も実行したい場合やリストなどのイテラブルの要素をまとめて処理したい場合は、for文、またはwhile文を使います。

for文とwhile文の違い
  • for文: イテラブル(リストやタプルなど)を使ってループ処理
  • while文: 条件式がTrueの間だけループ処理

この記事では、for文について解説していきます。while文については以下の記事を参考にしてください。

Linkwhile文を使ったループ処理

それでは、for文について見ていきましょう!

for文の使い方

for文は、以下のようにイテラブルを使ってループ処理します。

for 変数名 in イテラブル:
    何かしらの処理

指定されたイテラブルの要素が1つずつ順番に変数に代入され、ブロック内の処理が反復されます。イテラブルの要素が取り出せなくなった時点でループが終了します。

イテラブルの要素が代入された変数はfor文ブロック内で使用可能です。

イテラブルとは?

イテラブルとはリストやタプル、文字列などの反復可能なオブジェクトのことを言います。詳しく知りたい方は以下の記事を参照してください。

Linkイテラブルとイテレータについて解説

例えば、リストの要素を1つずつ出力するには、以下のようなコードになります。

vals = [1, 2, 3]

for v in vals:
    print(v)

実行結果

1
2
3

valsの要素がvに1つずつ代入され、for文ブロック内のprint()関数がループ処理されることによってすべての要素が出力されています。

任意の回数だけループ:range関数

for文とrange()関数を組み合わせることで任意の回数だけループ処理させられる。

range()関数は、数列を生成する関数です。

Linkrange関数を使って数列を生成する方法を解説

以下のコードでは、3回ループ処理しています。

for i in range(3):
    print(i)

実行結果

0
1
2

負の数や初期値を指定することもできる。

for i in range(2, -3, -1):
    print(i)

実行結果

2
1
0
-1
-2

取り出した要素を使用しない場合は、_(アンダースコア)を使うと安全です。

for _ in range(3):
    print('abc')

実行結果

abc
abc
abc

ループ処理をスキップ:continue

ループ処理をスキップするには、continue文を使います。

処理をスキップしたい回でcontinue文が実行されるようにfor文ブロック内に記述することで、その回のループ処理をスキップすることができます。

continue文が実行された回の処理のみスキップするので以降もループ処理は継続されます。

例えば、ある値が偶数の時のみ処理をスキップしたいと思ったら以下のように記述します。

l = [1, 2, 3, 4, 5, 6]

for i in l:
    if i % 2 == 0:
        continue
    print(i)

実行結果

1
3
5

iの値が偶数の時にcontinue文が実行され、処理がスキップされているのでprint()が実行されず、奇数のみが出力されています。

ループ処理を中断:break

ループ処理を中断するには、break文を使います。

何かしらの値を受け取った際にbreak文が実行されるようにfor文ブロック内に記述することでループ処理を途中で終了することができます。

以下のコードでは、'end'が処理される際にbreak文が実行されてループが終了します。

for v in ['a', 'b', 'end', 'c']:
    if v == 'end':
        break
    print(v)

実行結果

a
b

'end'が処理される際にbreak文が実行されてループが中断したのでそれ以降の要素である'c'は処理されませんでした。

for文が正常終了した際の処理:else

for文のオプションとしてelse節が用意されています。else節は、for文が正常終了した際に処理されるブロックを定義できます。

l = [1, 2, 3]

for i in l:
    print(i)
# for文の後に記述する
else:
    print('正常終了しました!')

実行結果

1
2
3
正常終了しました!

break文によってfor文が中断された場合、else節は処理されないので注意してください。

l = [1, 2, 3]

for i in l:
    print(i)
    break
else:
    print('正常終了しました!')

実行結果

1

continue文によって処理をスキップした場合、else節は問題なく処理されます。

任意の範囲の要素でループ:スライス

特定の範囲の要素のみでループしたい場合は、スライスを使うと簡単です。

l = [1, 2, 3, 4, 5, 6, 7, 8, 9]

for i in l[4:7]:
    print(i)

実行結果

5
6
7

上記コードは、スライスを用いてstart4stop7を指定し、インデックスが4 < N <= 7の要素のみを使ってループ処理しました。

Linkシーケンスの要素を任意の範囲で取得するスライスの使い方

要素とインデックスを同時に取得する:enumrate関数

for文とenumerate()関数を組み合わせることで要素とインデックスを扱うことができます。

enumerate(iterable, start=0)

enumerate()関数は2つの要素(インデックス, 引数に指定されたイテラブルの要素)を返すので受け取る変数を2つ用意する必要があります。

vals= ['a', 'b', 'c']

for index, val in enumerate(vals):
    print(index, val)

実行結果

0 a
1 b
2 c

start引数に整数を指定することで開始値を変更することができます。以下のコードでは、開始値を1にして実行しています。

vals = ['a', 'b', 'c']

for i, v in enumerate(vals, 1):
    print(i, v)

実行結果

1 a
2 b
3 c

複数のシーケンスの要素を取得:zip関数

for文とzip()関数を組み合わせることで複数のイテラブルを扱うことができます。

nums = [1, 2, 3]
vals = ['a', 'b', 'c']

for num, val in zip(nums, vals):
    print(num, val)

実行結果

1 a
2 b
3 c

2つ以上のイテラブルも同時に処理することができます。

l1= [1, 2, 3]
l2 = ['a', 'b', 'c']
l3 = [4, 5, 6]

for v1, v2, v3 in zip(l1, l2, l3):
    print(v1, v2, v3)

実行結果

1 a 4
2 b 5
3 c 6

渡されたイテラブルの長さが異なる場合は、短い方に合わせて実行されます。

nums = [1, 2, 3]
vals = ['a', 'b']

for num, val in zip(nums, vals):
    print(num, val)

実行結果

1 a
2 b

for文を何度も実行するのはコストがかかるのでできだけまとめて処理しちゃいましょう。

逆順で処理する:reversed関数

for文とreversed()関数を組み合わせることで要素を逆順で取得することができます。

nums = [1, 2, 3]

for num in reversed(nums):
    print(num)

実行結果

3
2
1

まとめ

この記事では、for文を使った繰り返し処理の仕方について解説しました。

Pythonに限らずプログラミングでは「条件分岐」と「繰り返し処理」を非常によく使います。しっかり覚えておきましょう!

また、状況によってはwhile文を使うことを検討しましょう!

それでは今回の内容はここまでです!ではまたどこかで〜( ・∀・)ノ