Python|forループのバリエーションと使い方(range, enumerate, zip)
![](https://tech.aru-zakki.com/wp-content/uploads/2024/04/python-for.001.jpeg)
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__
メソッドで、index
とs0
, 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
![](https://tech.aru-zakki.com/wp-content/uploads/2023/06/tabbycat.png)
いきなり難しい内容になっていますが、細かいことを知る必要はありません。とりあえず、イタラブルはこんな感じで自作できることは知っておきましょう。
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
![](https://tech.aru-zakki.com/wp-content/uploads/2023/06/tabbycat.png)
enumerate, zipは便利なのでよく使います。覚えておいて損はないです。
まとめ
以上、Pythonのfor文について解説しました。javascriptなどの他の言語からPythonに入るとfor文の書き方の違いに戸惑うことがありますが、基本はfor ~ in ~
しかないので実は簡単です。