Atom's tech blog

Pythonを勉強しよう! 同じ処理を繰り返すfor文

f:id:iAtom:20201109142943j:plain

Python初心者の備忘録.....

今回は、「 for 」文についてです。

for文は一定の回数を繰り返し処理を行うために使用します。

基本的な組み合わせで使用するものが「 break 」、「 continue 」、「 else 」。

その他に一緒に使うことで便利な関数もあります。

for文の記述

C言語とは異なり、基本形は以下となります。

for "変数"  in "イテレート可能なオブジェクト" :
      "繰り返す処理"

イテレート 」とは「繰り返し処理」するという意味で、イテレート可能ということは、オブジェクトの中から順に値を取り出せることを意味します。

どのようなことを示しているか、サンプルをみてみましょう。

fruits = ['apple', 'orange', 'banana']
for name in fruits:
    print(name)

# 出力結果
# apple
# orange
# banana

特に回数を指定しなくてもリストデータに入っている数(上記サンプルでは3要素)分ループします。さらにそのデータをname変数へ取り出しができています。

回数と固定してループすることも可能です。後ほど説明を追加します。

for文を途中で終了: break

for文で一定回数をループしているときに、ある条件のときは最後までループさせたくないときがあります。そのときは「 break 」文を使いましょう。

それではサンプルをみてみましょう。

fruits = ['apple', 'orange', 'banana']
for name in fruits:
    if name == "orange":
        print("break")
        break

    print(name)

# 出力結果
# apple
# break

3行目の条件文でTrue結果のとき、5行目で「 break 」し、「 for 」文をと途中で終了します。

途中で終了することで 「 banana 」のループを実施しない結果となります。

処理をスキップ: continue

for文で一定回数をループしているときに、ある条件のときは処理したくないけど、ループは継続したいときがあります。

そのときは「 continue 」文を使用しましょう。

サンプルをみてみましょう。

fruits = ['apple', 'orange', 'banana']
for name in fruits:
    if name == "orange":
        print("skip")
        continue

    print(name)

# 出力結果
# apple
# skip
# banana

3行目の条件文でTrue結果のとき、5行目で「 continue 」し、「 for 」文に戻ります。

戻ることで「 banana 」のループも実施され「banana」を表示しています。

forループ正常終了後の処理: else

for文が一定回数正常終了した後に、何か処理をしたいときに「 else 」を使います。

breakで途中で終了したときは、「 else 」ルートに行かないとのこと。

breakで抜けるループ処理があるときに使えそうですね。

fruits = ['apple', 'orange', 'banana']
for name in fruits:
    if name == "grape":
        break

else:
    print("OK Finish")

# 出力結果
# OK Finish

「 else 」を用いることで途中でbreakせずに最後までループしたことが、これでわかりますね。

「 continue 」の場合は、「 break 」と異なり正常回数分ループするため、「 else 」ルートへ分岐します。

fruits = ['apple', 'orange', 'banana']
for name in fruits:
    if name == "orange":
        print("skip")
        break

else:
    print("OK Finish")

#  出力結果
#  skip

「 break 」文で途中で処理を終了すると「 else 」ルートにはいかないことがわかりますね。

インデックス(カウンタ): range()関数

指定回数分ループ 」させ、さらにその「 インデックスカウンタ値を取得する 」目的で使用します。

インデックスカウンタ取得しないケースでも使用したりしますね。

インデックスカウンタを0から開始するとき

range()関数には, (start値 , stop値) の2つの引数を指定できます。0カウンタ値から実施したい場合は、stopのみでもよいです。

下記のサンプルは「0開始〜4終了の5回ループ」です。

for cnt in range(5):
    print(cnt)

# 出力結果
# 0
# 1
# 2
# 3
# 4
インデックスカウンタを5から開始するとき
for cnt in range(5 , 10):
    print(cnt)

# 出力結果
# 5
# 6
# 7
# 8
# 9
カウントアップを任意の増分したいとき

1ずつではなく任意の増分を指定したい場合は、 range(start, stop, step) のように3つの引数を指定します。

下記サンプルは5開始で、2ずつカウントアップ。終了は10までの3回ループをイメージしています。

for cnt in range(5 , 10, 2):
    print(cnt)

# 出力結果
# 5
# 7
# 9
カウントダウンを任意の減分したいとき

カウントアップは「 + 」プラスだけではなく、「 - 」マイナス していくこともできます。

下記サンプルは10開始で、-2ずつカウントダウン。終了は5までの3回ループをイメージしています。

for cnt in range(10 , 6, -2):
    print(cnt)

# 出力結果
# 10
# 8
# 6

リストの要素とインデックス: enumerate()関数

指定回数分ループ 」させ、さらにその「 インデックスカウンタ値 」と「 イテラブルオブジェクトの要素 」を取得する目的で使用します。

インデックスカウンタを0から開始
fruits = ['apple', 'orange', 'banana']
for cnt,name in enumerate(fruits):
    print(cnt, name)

# 出力結果
# 0 apple
# 1 orange
# 2 banana
インデックスカウンタを任意の値から開始

enumerate()関数の第二引数には開始値を指定でき、任意の整数値から開始できます。

fruits = ['apple', 'orange', 'banana']
for cnt,name in enumerate(fruits,10):
    print(cnt, name)

# 出力結果
# 10 apple
# 11 orange
# 12 banana

enumerate()関数に増分stepを指定する引数はありません。

逆順: reversed()関数

イテラブルオブジェクトの要素を取得

イテラブルオブジェクトの要素」を逆から取得をreversed()関数でできます。

fruits = ['apple', 'orange', 'banana']
for name in reversed(fruits):
    print(name)

# 出力結果
# banana
# orange
# apple
range()関数と組み合わせる

range()関数と合わせることでカウントダウンインデックス値を取得することもできます。

for cnt in reversed(range(5)):
    print(cnt)

# 出力結果
# 4
# 3
# 2
# 1
# 0

多重ループ: itertools.product()関数

「 for 」文の複数使用で多重ループをする方法を普通に思いつきますが、itertools.product()関数を使用することで、ネストを深くせずに記述し「 for 」文の複数使用と同等の結果が得られます。

使用するには組み込み関数ではなく、標準ライブラリの「 itertools 」を使用します。そのためimportする必要があるためサンプルのように記述します。

import itertools

list1= [0, 1, 2]
list2 = [10, 20, 30, 40]

for x, y in itertools.product(list1, list2):
    print(x, y)

# 出力結果
# 0 10
# 0 20
# 0 30
# 0 40
# 1 10
# 1 20
# 1 30
# 1 40
# 2 10
# 2 20
# 2 30
# 2 40

dictionary objectのforループ

dictionaryとは、keyとvalueのペアを登録できるデータ構造となっています。keyを使ってvalueを呼び出せるので、情報のヒモ付けされるイメージなので参照、アクセスしやすいです。

このdictionary objectのデータを「 for 」文で取得する方法です。

keyのみを取得
# dictionaryオブジェクト
fruits = {'apple':1, 'orange':2, 'banana':3}

for key in fruits:
    print(key)

# 出力結果
# apple
# orange
# banana
valueのみを取得

valueを取得するときは、dictionaryオブジェクトのvalues()メソッドを使用して取得します。

# dictionaryオブジェクト
fruits = {'apple':1, 'orange':2, 'banana':3}

for value in fruits.values():
    print(value)

# 出力結果
# 1
# 2
# 3
# key と valueの両方を取得

key とvalueを取得するときは、dictionaryオブジェクトのitems()メソッドを使用して取得します。

# dictionaryオブジェクト
fruits = {'apple':1, 'orange':2, 'banana':3}

for key, value in fruits.items():
    print(key , value)

# 出力結果
# apple 1
# orange 2
# banana 3