はじめに
Pythonのfor文は(C言語などの記法を参照している多くの言語とは異なり)少し特殊なため,様々なPythonのfor文をまとめてみます。
※ 本記事は,Python初心者の方にPythonicなコードを知ってもらいたいという目的で書いています。それなりにPythonに詳しい方には新たな発見はないかと思います。予めご了承ください。
一番基本
Pythonのforは他の言語で言うforeachのような感じで,リスト(など)から要素を一つずつ取り出して処理するイメージです。
例えば
for i in [0, 1, 2, 3, 4]:
print(i)
実行結果:
0
1
2
3
4
まあこれなら普通は
for i in range(5):
print(i)
と書きますね
インデックスと要素を同時に取得する
例えば,
s = 'spam'
for i in range(len(s)):
print(i, s[i])
のようなコードは,組込み関数enumerate
を使って
s = 'spam'
for i, c in enumerate(s):
print(i, c)
というように書くことができます。
実行結果:
0 s
1 p
2 a
3 m
複数のリストを扱う
複数のリストを同時にイテレートする
同じインデックスで複数のリストを同時にイテレートする場合には,zip
を使って
for i, j in zip(range(5), range(10, 15)):
print(i, j)
という書き方ができます。
実行結果:
0 10
1 11
2 12
3 13
4 14
直積を利用する
リストの直積集合を利用したい場合には,for文をネストする代わりに,itertools.product
を使って
from itertools import product
for i, j in product(range(3), range(10, 13)):
print(i, j)
と書くことができます。
実行結果:
0 10
0 11
0 12
1 10
1 11
1 12
2 10
2 11
2 12
要素を使用しない場合
複数回同じ処理をしたいが要素は要らないという場合には,アンダースコアを使って
for _ in range(100):
print('spam')
と書くことで要素を捨てることができます。
dictを回す
辞書のデータのキーだけ,値だけ,あるいは両方を順番に取得したい場合はよくありますが,この場合はそれぞれ
menu = {
1: 'spam',
2: 'ham',
3: 'egg'
}
# キーだけ
for num in menu.keys():
print(num)
# 値だけ
for item in menu.values():
print(item)
# 両方
for num, item in menu.items():
print(num, item)
と書けます。
実行結果:
1
2
3
spam
ham
egg
1 spam
2 ham
3 egg
イテレータを実装する
自分で実装したクラスをイテレータとして利用したい場合には,__next__()
と__iter__()
を実装します。
例として,指定された個数だけフィボナッチ数列を返すクラスを示します。
class Fibonacci():
def __init__(self, cnt):
self.n0 = 0
self.n1 = 1
self.cnt = cnt
def __iter__(self):
return self
def __next__(self):
if self.cnt == 0:
raise StopIteration()
self.n0, self.n1 = self.n1, self.n0+self.n1
self.cnt -= 1
return self.n0
for f in Fibonacci(5):
print(f)
実行結果:
1
1
2
3
5
for-else
私もいまいち遣いどころを把握していないのですが,
for item in items:
# なんか処理1
else:
# なんか処理2
という構文を紹介します。
「なんか処理1」は通常のfor文のように処理され,この中でbreak
が使用されるとすべて終了します。
しかし,break
が使われずにループが終了した場合には「なんか処理2」が実行されます。
簡単な具体例を挙げると
def is_prime(n):
for i in range(1, n):
if n % i == 0:
print(f'{n}は合成数です')
break
else:
print(f'{n}は素数です')
みたいな感じですかね
(この場合は早期リターンでいいので例として微妙ですが,文法の説明ということでご容赦ください)
さいごに
『エキスパートPythonプログラミング』を読みましょう。