Pythonの基礎 - 反復処理(for文)

提供:MochiuWiki : SUSE, EC, PCB
2021年11月19日 (金) 20:11時点におけるWiki (トーク | 投稿記録)による版 (文字列「<source lang="python">」を「<syntaxhighlight lang="python">」に置換)
ナビゲーションに移動 検索に移動

概要

ここでは、Pythonにおいて、条件が成立する時に反復処理(イテレーション)をするfor文を記載する。
また、range関数とzip関数を使用した処理も併せて記載する。

反復処理が可能(イテラブル)なオブジェクト(文字列、リスト、タプル、辞書等)を使用して反復処理を行うにはfor文を使用する。


for-in文で反復処理をする

Pythonでfor文を使ってループ処理のコードを書くには、forの後ろに繰り返し変数を記述する。
続けて、inキーワードを記述した後にリストなどのシーケンスを記述して、末尾にコロンを置く。

<syntaxhighlight lang="python">
for 繰り返し変数 in シーケンス:
    実行コード
</source>


以下の例では、リスト変数から各要素を取得している。

<syntaxhighlight lang="python">
lang = ["Python","PHP","Swift"]

for i in lang:
    print(i)

# 出力
Python
PHP
Swift
</source>


次に、文字列をシーケンスとして使用する。
以下の例では、Pythonという文字列を、繰り返し変数をsとして、1文字ずつ取得している。

<syntaxhighlight lang="python">
for s in "Python":
    print(s)

# 出力
P
y
t
h
o
n
</source>



break文でfor文を抜ける

for文でも、while文と同様にbreak文を使用して反復処理を抜けることができる。
以下の例では、取得した文字がhの時にfor文から抜ける処理をしている。

<syntaxhighlight lang="python">
for s in "Python":
    if s == "h":
        break
    print(s)

# 出力
P
y
t
</source>



continue文で処理をスキップする

continue文を使用して、処理をスキップして再度反復処理の先頭に戻ることができる。
以下の例では、指定した文字hの場合のみ処理がスキップしている。

<syntaxhighlight lang="python">
for s in "Python":
    if s == "h":
        continue
    print(s)

# 出力
P
y
t
o
n
</source>



for文のelse文とbreak文

for文もwhile文と同様に、処理が終わったら何か別の処理をする場合にelse文と組み合わせることができる。
以下の例のように、else文を最後に付け加えるだけである。

<syntaxhighlight lang="python">
lang = ["Python","PHP","Swift"]

for i in lang:
    print(i)
else:
    print("Done!")

# 出力
Python
PHP
Swift
Done!
</source>


また、以下の例では、break文と組み合わせている。
break文で反復処理を抜けると、else文の処理は実行されない。
このような処理は、break文が実行されなかった場合は、else文でチェックするような時に使用する。

<syntaxhighlight lang="python">
lang = ["Python","PHP","Swift"]

for i in lang:
    if i == "PHP":
        break
    print(i)
else:
    print("Done!")

# 出力
Python
</source>



for文と辞書(values関数とitems関数)

辞書型変数をfor文で処理する場合を考える。
次のような辞書型変数を用意して、for文で処理する。
print関数で出力されているものは、辞書のキーの部分である。このように、辞書型変数をfor文で処理するとキーが処理される。

<syntaxhighlight lang="python">
foods = {"breakfast":"miso soup", "lunch":"sandwich", "dinner":"steak"}

for food in foods:
    print(food)

# 出力
breakfast
lunch
dinner
</source>


上記のサンプルコードは、次のように辞書型変数のkeys関数を使用した処理と同じである。
for文で辞書をそのまま使用してもkeys関数を使用しても、結果はどちらもキーが取得されることになる。

<syntaxhighlight lang="python">
foods = {"breakfast":"miso soup", "lunch":"sandwich", "dinner":"steak"}

for food in foods.keys():
    print(food)

# 出力
breakfast
lunch
dinner
</source>


for文と辞書のvalues関数

辞書の値を反復処理で取得する場合は、values関数を使用する。
以下の例では、values関数を使用して辞書の値を取得している。

<syntaxhighlight lang="python">
foods = {"breakfast":"miso soup", "lunch":"sandwich", "dinner":"steak"}

for food in foods.values():
    print(food)

# 出力
miso soup
sandwich
steak
</source>


for文と辞書のitems関数

辞書のキーと値をセットでタプル型に変換して反復処理する場合は、items()関数を使用する。

<syntaxhighlight lang="python">
foods = {"breakfast":"miso soup", "lunch":"sandwich", "dinner":"steak"}

for food in foods.items():
    print(food)

# 出力
('breakfast', 'miso soup')
('lunch', 'sandwich')
('dinner', 'steak')
</source>


また、以下の例では、このタプルをそれぞれの変数にキーと値を代入する処理を行っている。
ピリオドと改行コードを文末に出力するために、print関数のendオプションを使用している。
それぞれキーと値が対応した位置に出力されている。

<syntaxhighlight lang="python">
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.
</source>



range関数で反復処理(数値のシーケンス生成)

for文において、range関数が使用されることがよくある。
range関数は、指定した範囲の数値の順に取得するので、イテラブルなオブジェクトを返すことができる。

range関数の使用方法は、range(start値, end値, step値)という形でそれぞれの値に数値を指定する。(スライスと同様の使用方法)

<syntaxhighlight lang="python">
for i in range(5):
    print(i)

# 出力
0
1
2
3
4
</source>


次に、range関数のstart値、end値、step値を指定する。

<syntaxhighlight lang="python">
for i in range(1, 10, 3):
    print(i)

# 出力
1
4
7
</source>


range関数は、list関数を使用してリストに変換することができる。

<syntaxhighlight lang="python">
a = list(range(1, 10, 3))
print(a)

# 出力
[1, 4, 7]
</source>



zip関数で反復処理(複数のシーケンスの反復処理)

zip関数を使用すると、複数のシーケンスを並列に反復処理することができる。

以下の例では、複数のリストをzip関数でまとめて、それぞれの位置に対応した変数を出力している。
各リストの共通するインデックスの値が抜き出されて反復処理されている。
3つのリストがここでは全て同じ要素数でしたが、要素数がそれぞれ異なる場合は、一番小さい要素数に合わせたオフセットで反復処理がなされます。

<syntaxhighlight lang="python">
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
</source>


上記のサンプルコードをrange関数を使用して記述すると、以下のようになる。
実行すると同様の結果が出力される。

<syntaxhighlight lang="python">
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
</source>