Pythonの基礎 - 反復処理(for文)
概要
ここでは、Pythonにおいて、条件が成立する時に反復処理(イテレーション)をするfor文を記載する。
また、range関数とzip関数を使用した処理も併せて記載する。
反復処理が可能(イテラブル)なオブジェクト(文字列、リスト、タプル、辞書等)を使用して反復処理を行うにはfor文を使用する。
for-in文で反復処理をする
Pythonでfor文を使ってループ処理のコードを書くには、forの後ろに繰り返し変数を記述する。
続けて、inキーワードを記述した後にリストなどのシーケンスを記述して、末尾にコロンを置く。
for 繰り返し変数 in シーケンス:
実行コード
以下の例では、リスト変数から各要素を取得している。
lang = ["Python","PHP","Swift"]
for i in lang:
print(i)
# 出力
Python
PHP
Swift
次に、文字列をシーケンスとして使用する。
以下の例では、Pythonという文字列を、繰り返し変数をsとして、1文字ずつ取得している。
for s in "Python":
print(s)
# 出力
P
y
t
h
o
n
break文でfor文を抜ける
for文でも、while文と同様にbreak文を使用して反復処理を抜けることができる。
以下の例では、取得した文字がhの時にfor文から抜ける処理をしている。
for s in "Python":
if s == "h":
break
print(s)
# 出力
P
y
t
continue文で処理をスキップする
continue文を使用して、処理をスキップして再度反復処理の先頭に戻ることができる。
以下の例では、指定した文字hの場合のみ処理がスキップしている。
for s in "Python":
if s == "h":
continue
print(s)
# 出力
P
y
t
o
n
for文のelse文とbreak文
for文もwhile文と同様に、処理が終わったら何か別の処理をする場合にelse文と組み合わせることができる。
以下の例のように、else文を最後に付け加えるだけである。
lang = ["Python","PHP","Swift"]
for i in lang:
print(i)
else:
print("Done!")
# 出力
Python
PHP
Swift
Done!
また、以下の例では、break文と組み合わせている。
break文で反復処理を抜けると、else文の処理は実行されない。
このような処理は、break文が実行されなかった場合は、else文でチェックするような時に使用する。
lang = ["Python","PHP","Swift"]
for i in lang:
if i == "PHP":
break
print(i)
else:
print("Done!")
# 出力
Python
for文と辞書(values関数とitems関数)
辞書型変数をfor文で処理する場合を考える。
次のような辞書型変数を用意して、for文で処理する。
print関数で出力されているものは、辞書のキーの部分である。このように、辞書型変数をfor文で処理するとキーが処理される。
foods = {"breakfast":"miso soup", "lunch":"sandwich", "dinner":"steak"}
for food in foods:
print(food)
# 出力
breakfast
lunch
dinner
上記のサンプルコードは、次のように辞書型変数のkeys関数を使用した処理と同じである。
for文で辞書をそのまま使用してもkeys関数を使用しても、結果はどちらもキーが取得されることになる。
foods = {"breakfast":"miso soup", "lunch":"sandwich", "dinner":"steak"}
for food in foods.keys():
print(food)
# 出力
breakfast
lunch
dinner
for文と辞書のvalues関数
辞書の値を反復処理で取得する場合は、values関数を使用する。
以下の例では、values関数を使用して辞書の値を取得している。
foods = {"breakfast":"miso soup", "lunch":"sandwich", "dinner":"steak"}
for food in foods.values():
print(food)
# 出力
miso soup
sandwich
steak
for文と辞書のitems関数
辞書のキーと値をセットでタプル型に変換して反復処理する場合は、items()関数を使用する。
foods = {"breakfast":"miso soup", "lunch":"sandwich", "dinner":"steak"}
for food in foods.items():
print(food)
# 出力
('breakfast', 'miso soup')
('lunch', 'sandwich')
('dinner', 'steak')
また、以下の例では、このタプルをそれぞれの変数にキーと値を代入する処理を行っている。
ピリオドと改行コードを文末に出力するために、print関数のendオプションを使用している。
それぞれキーと値が対応した位置に出力されている。
foods = {"breakfast":"miso soup", "lunch":"sandwich", "dinner":"steak"}
for food, menu in foods.items():
print("Yesterday, I had", menu, "for", food, end=".\n")
# 出力
Yesterday, I had miso soup for breakfast.
Yesterday, I had sandwich for lunch.
Yesterday, I had steak for dinner.
range関数で反復処理(数値のシーケンス生成)
for文において、range関数が使用されることがよくある。
range関数は、指定した範囲の数値の順に取得するので、イテラブルなオブジェクトを返すことができる。
range関数の使用方法は、range(start値, end値, step値)という形でそれぞれの値に数値を指定する。(スライスと同様の使用方法)
for i in range(5):
print(i)
# 出力
0
1
2
3
4
次に、range関数のstart値、end値、step値を指定する。
for i in range(1, 10, 3):
print(i)
# 出力
1
4
7
range関数は、list関数を使用してリストに変換することができる。
a = list(range(1, 10, 3))
print(a)
# 出力
[1, 4, 7]
zip関数で反復処理(複数のシーケンスの反復処理)
zip関数を使用すると、複数のシーケンスを並列に反復処理することができる。
以下の例では、複数のリストをzip関数でまとめて、それぞれの位置に対応した変数を出力している。
各リストの共通するインデックスの値が抜き出されて反復処理されている。
3つのリストがここでは全て同じ要素数でしたが、要素数がそれぞれ異なる場合は、一番小さい要素数に合わせたオフセットで反復処理がなされます。
lang = ["Python", "PHP", "Swift"]
prefix = ["P", "P", "S"]
suffix = ["n", "P", "t"]
for item1, item2, item3 in zip(lang, prefix, suffix):
print(item1, item2, item3)
# 出力
Python P n
PHP P P
Swift S t
上記のサンプルコードをrange関数を使用して記述すると、以下のようになる。
実行すると同様の結果が出力される。
lang = ["Python", "PHP", "Swift"]
prefix = ["P", "P", "S"]
suffix = ["n", "P", "t"]
for i in range(len(lang)):
print(lang[i], prefix[i], suffix[i])
# 出力
Python P n
PHP P P
Swift S t