Uncategorized
記事内に商品プロモーションを含む場合があります

Python|forループのバリエーションと使い方(range, enumerate, zip)

tadanori

pythonのfor文は他の言語と少し違います。この記事では、pythonのfor文について解説します。

for文について

他の言語のfor文について

C言語などの他の言語から入った人は、for文は

for(初期化文;判定式;更新文)

のような感じで指定するものだと考えているかと思います。

もっと古い言語では、

FOR カウンター変数=初期値 TO 終了値 STEP 増加量

のように定義していました。

どちらにせよ、

for(i = 0; i < 10; i++)

みたいにカウンタでループさせるのが普通でした。

Pythonのfor文

Pythonでは、他の言語のようなfor文はなく、

for 変数 in イテラブル

という形のfor文だけが存在します。イテラブルはリストやタプル、辞書、集合などの要素です。

なお、このようなfor 要素 : 要素の集合というfor文はjavaやC++, C#などでも利用することができます。

ここでは、pythonのfor文について少し深掘りしてみます。

イテラブルとは

イテラブルとは、「__iter__メソッド、または__getitem__メソッドを持つオブジェクト」です。実際に、イテラブルを定義してみます。

下記の例は、__getitem__メソッドを持つオブジェクトの例です。例ではindexが0~10までの間はindexを返し、範囲を超えたらIndexErrorエラーを発生させます。

コードを動作させると0~10までの値が表示されます。

class MyIterable:
    def __getitem__(self, index):
        if 0 <= index <= 10:
            return index
        else:
           raise IndexError

for e in MyIterable():
    print(e) 

# 0
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10

イテラブルは上記のようなメソッドを持ったオブジェクトなら自作することが可能です。

もう1つ例です。こちらは__iter__メソッドを持つものです。こちらは、n個目までのフィボナッチ数を返すイテレータです。__next__メソッドで、indexs0, s1を更新しています。

class MyIterator:
    def __init__(self, n):
        self.n = n
        self.s0 = 1
        self.s1 = 1
        self.index = 0

    def __iter__(self):
        return self

    def __next__(self):
        if self.index >= self.n:
            raise StopIteration
        value = self.s0
        self.s0, self.s1 = self.s1, self.s0 + self.s1
        self.index += 1
        return value 

for e in MyIterator(10):
    print(e)   

# 1
# 1
# 2
# 3
# 5
# 8
# 13
# 21
# 34
# 55

いきなり難しい内容になっていますが、細かいことを知る必要はありません。とりあえず、イタラブルはこんな感じで自作できることは知っておきましょう。

Pythonのfor文の例

以下、Pythonのfor文でよく使うパターンです。

range

range()関数を使うことで他の言語のforループのような使い方をすることが可能です。

終了のみ指定

終了値のみを指定すると0,1,2…終了値-1までループします。

for i in range(10):
  print(i, end=" ")
# 0 1 2 3 4 5 6 7 8 9 

開始と終了を指定

開始と終了を指定します。区間としては[開始値, 終了値)までのループとなります。

for i in range(5, 10):
  print(i, end=" ")
# 5 6 7 8 9 

開始、終了、ステップを指定

開始、終了、ステップを指定できます。ステップをしてすることで降順にすることも可能です。

for i in range(10, 0, -1):
  print(i, end=" ")
# 10 9 8 7 6 5 4 3 2 1 

リスト、辞書、セット

リスト

リストの要素を1つずつ取り出す例です。

a = [1,2,3,4,5]
for e in a :
    print(e, end = " ")
# 1 2 3 4 5 

set

セット(set)の値を1つづつ取り出す例です

a = set([1,3,10,4,5,6,7,8,1,2,3,4])
for e in a :
    print(e, end = " ")
# 1 2 3 4 5 6 7 8 10 

辞書(dict)

辞書の要素でループする例です。何も指定しないとkeyが変数eに代入されます。

a = {"a":1, "b":2, "c":3}
for e in a:
    print(e, end = " ")
# a b c 

a.keys()とした場合は、何も指定しない場合と同様になります。

a = {"a":1, "b":2, "c":3}
for e in a.keys():
    print(e, end = " ")
# a b c 

a.values()と指定するとeには要素の値が代入されます。

a = {"a":1, "b":2, "c":3}
for e in a.values():
    print(e, end = " ")
# 1 2 3 

enumerate

enumerateを使うことで、ループ回数を受け取ることが可能です。

a = ["a", "b", "c"]
for i, e in enumerate(a):
    print(i, e)

# 0 a
# 1 b
# 2 c

zip

zipを使うことで、2つの要素から同時に値を取り出すことが可能です。

a = ["a", "b", "c"]
b = [1, 2, 3]
for x, y in zip(a, b):
    print(x, y)

# a 1
# b 2
# c 3

enumerate, zipは便利なのでよく使います。覚えておいて損はないです。

まとめ

以上、Pythonのfor文について解説しました。javascriptなどの他の言語からPythonに入るとfor文の書き方の違いに戸惑うことがありますが、基本はfor ~ in ~しかないので実は簡単です。

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

記事URLをコピーしました