Python - 繰り返し処理

for 文

Python の for 文は、以下のように記述します。

for 変数名 in イテラブルオブジェクト:
    処理
for 文の構文

イテラブルオブジェクトとは、イテレータ (リストやタプルなどから要素をひとつずつ取り出して返すもの) に対応しているオブジェクトのことです。イテラブルオブジェクトから取り出された要素は、任意の変数名に代入されて処理が行われます。これらの処理は、イテラブルオブジェクトの要素がなくなるまで繰り返されます。

rabbits = ['Flopsy', 'Mopsy', 'Cottontail', 'Peter']

for rabbit in rabbits:
    print(rabbit)
# Flopsy
# Mopsy
# Cottontail
# Peter
for 文のサンプル

繰り返し処理を途中で抜ける: break

for 文の途中で繰り返し処理を抜ける場合は、break を使います。

rabbits = ['Flopsy', 'Mopsy', 'Cottontail', 'Peter']

for rabbit in rabbits:
    if rabbit == 'Mopsy':
        print('BREAK!')
        break
    print(rabbit)
# Flopsy
# BREAK!
for 文のサンプル

繰り返し処理を途中でスキップする: continue

for 文の途中で特定の要素に対する処理をスキップしたい場合は、continue を使います。breakfor ループ全体が終了しますが、continue はその要素に対する continue 文以降の処理がスキップされ、繰り返し処理は継続されます。

rabbits = ['Flopsy', 'Mopsy', 'Cottontail', 'Peter']

for rabbit in rabbits:
    if rabbit == 'Mopsy':
        print('SKIP!')
        continue
    print(rabbit)
# Flopsy
# SKIP!
# Cottontail
# Peter
for 文のサンプル

ループ正常終了後の処理: else

for 文による繰り返し処理が正常終了後に何らかの処理を行いたい場合は、else を使います。

rabbits = ['Flopsy', 'Mopsy', 'Cottontail', 'Peter']

for rabbit in rabbits:
    print(rabbit)
else:
    print('FINISH!')
# Flopsy
# Mopsy
# Cottontail
# Peter
# FINISH!
for 文のサンプル

break によって途中で繰り返し処理が終了した場合、else の処理は実行されません。

rabbits = ['Flopsy', 'Mopsy', 'Cottontail', 'Peter']

for rabbit in rabbits:
    if rabbit == 'Mopsy':
        print('BREAK!')
        break
    print(rabbit)
else:
    print('FINISH!')
# Flopsy
# BREAK!
for 文のサンプル

continue の場合は、繰り返し処理が最後の要素まで到達するため、else の処理は実行されます。

rabbits = ['Flopsy', 'Mopsy', 'Cottontail', 'Peter']

for rabbit in rabbits:
    if rabbit == 'Mopsy':
        print('SKIP!')
        continue
    print(rabbit)
else:
    print('FINISH!')
# Flopsy
# SKIP!
# Cottontail
# Peter
# FINISH!
for 文のサンプル

数値シーケンスの生成: range()関数

range() 関数は、指定した範囲の数値のストリームを返すことができます。range() はイテラブルなオブジェクトを返すので、戻り値は for in で繰り返し処理するか、リストなどのシーケンスに変換する必要があります。range() 関数の構文は以下のとおりです。

range(start, stop[, step])
range 関数の構文
start
引数 start の値 (この引数が省略された場合は 0)
stop
引数 stop の値
step
引数 step の値 (この引数が省略された場合は 1)

必須の引数は end のみで、最後の値は end の直前の値になります。

for x in range(3):
    print(x)
# 0
# 1
# 2

for x in range(0,3):
    print(x)
# 0
# 1
# 2

print(list(range(0, 3)))
# [0, 1, 2]
range 関数を使った繰り返し処理

step のデフォルト値は 1 ですが、-1 を指定することで逆順にすることができます。逆順で 2 から 0 までの範囲は、以下のように記述できます。

for x in range(2, -1, -1):
    print(x)
# 2
# 1
# 0
range 関数を使った繰り返し処理

step サイズを 2 にすることで偶数の値を取得することも可能です。

for x in range(0, 11, 2):
    print(x)
# 0
# 2
# 4
# 6
# 8
# 10
range 関数を使った繰り返し処理

リストの要素とインデックスを取得する: enumerate()関数

イテラブルオブジェクトの要素とインデックスを同時に取得したい場合は、enumerate() 関数を使います。enumerate() 関数の構文は以下のとおりです。

enumerate(iterable, start=0)
enumerate 関数を使った繰り返し処理
iterable
イテラブルオブジェクト
start
開始値 (この引数が省略された場合は 0)
rabbits = ['Flopsy', 'Mopsy', 'Cottontail', 'Peter']

for i, rabbit in enumerate(rabbits):
    print(i, rabbit)
# 0 Flopsy
# 1 Mopsy
# 2 Cottontail
# 3 Peter

for i, rabbit in enumerate(rabbits, 10):
    print(i, rabbit)
# 10 Flopsy
# 11 Mopsy
# 12 Cottontail
# 13 Peter
enumerate 関数を使った繰り返し処理

複数リストの要素(複数変数): zip()関数

複数のイテラブルオブジェクトの要素をまとめて取得したい場合は、zip() 関数を使います。

nums = ['10', '20', '30', '40']
rabbits = ['Flopsy', 'Mopsy', 'Cottontail', 'Peter']

for num, rabbit in zip(nums, rabbits):
    print(num, rabbit)
# 10 Flopsy
# 20 Mopsy
# 30 Cottontail
# 40 Peter
zip 関数を使った繰り返し処理

zip() 関数は、イテラブルオブジェクトをいくつでもまとめることができます。

days = ['Monday', 'Tuesday', 'Wednesday']
fruits = ['banana', 'orange', 'peach']
drinks = ['coffee', 'tea', 'beer']
desserts = ['tiramisu', 'ice cream', 'pie', 'pudding']

for day, fruit, drink, dessert in zip(days, fruits, drinks, desserts):
    print(day, ": drink", drink, ", eat", fruit, ", enjoy", dessert)
# Monday : drink coffee , eat banana , enjoy tiramisu
# Tuesday : drink tea , eat orange , enjoy ice cream
# Wednesday : drink beer , eat peach , enjoy pie
zip 関数を使った繰り返し処理

ただし、zip() 関数はもっとも小さいシーケンスの要素に合わせて止まります。上記の例では desserts のリストが他のリストよりも長くなっています。そのため他のリストを長くしない限り、プリン (pudding) を取得することはできません。

逆順で繰り返し処理を行う: reversed()関数

イテラブルオブジェクトの要素を逆順で取得したい場合は、reversed() 関数を使います。

rabbits = ['Flopsy', 'Mopsy', 'Cottontail', 'Peter']

for rabbit in reversed(rabbits):
    print(rabbit)
# Peter
# Cottontail
# Mopsy
# Flopsy
reversed 関数を使った繰り返し処理

多重の繰り返し処理を行う: itertools.product()関数

一般的な多重の繰り返し処理は以下のように記述します。

list1 = ['a', 'b']
list2 = [1, 2]

for i in list1:
    for j in list2:
        print(i, j)
# a 1
# a 2
# b 1
# b 2
多重の繰り返し処理

Python では標準ライブラリ itertools モジュールの itertools.product() 関数を使うことで for 文をネストせずに上記と同様の結果を得られます。

import itertools
list1 = ['a', 'b']
list2 = [1, 2]

for i, j in itertools.product(list1, list2):
    print(i, j)
# a 1
# a 2
# b 1
# b 2
多重の繰り返し処理

辞書型オブジェクトの繰り返し処理: for in

辞書型オブジェクトを for in で繰り返し処理を行うと、辞書のキーが取得できます。

dict = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}

for key in dict:
    print(key)
# key1
# key2
# key3
辞書型オブジェクトの繰り返し処理

キーに対応する値を取得したい場合は、以下のとおり記述します。

dict = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}

for value in dict.values():
    print(value)
# value1
# value2
# value3
辞書型オブジェクトの繰り返し処理

キーと値を両方取得したい場合は、以下のとおり記述します。

dict = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}

for key, value in dict.items():
    print(key, value)
# key1 value1
# key2 value2
# key3 value3
辞書型オブジェクトの繰り返し処理

while 文

Python の while 文は、以下のように記述します。

count = 1
while count <= 5:
    print(count)
    count += 1
# 1
# 2
# 3
# 4
# 5
while 文による反復処理

繰り返し処理を途中で抜ける: break

while 文の条件に true を設定すると無限ループになります。ただし、無限ループを使う場合は break 文を使って何らかの条件によりループから抜け出す方法を提供するべきです。

以下のコードは、キーボードから q が入力されるとループから抜け出す方法を提供しています。

while True:
    stuff = input("String to capitalize [type q to quit]: ")
    if stuff == "q":
        break
    print(stuff.capitalize())

String to capitalize [type q to quit]: test
Test
String to capitalize [type q to quit]: hey, it works
Hey, it works
String to capitalize [type q to quit]: q
繰り返し処理を途中で抜ける

繰り返し処理を途中でスキップする: continue

while 文の途中で特定の要素に対する処理をスキップしたい場合は continue を使います。breakfor ループ全体が終了しますが continue はその要素に対する continue 文以降の処理がスキップされ、繰り返し処理は継続されます。

while True:
    value = input("Integer, please [q to quit]: ")
    if value == 'q': # 終了
        break
    number = int(value)
    if number % 2 == 0: # 偶数
        continue
    print(number, "squared is", number*number)

Integer, please [q to quit]: 1
1 squared is 1
Integer, please [q to quit]: 2
Integer, please [q to quit]: 3
3 squared is 9
Integer, please [q to quit]: 4
Integer, please [q to quit]: 5
5 squared is 25
Integer, please [q to quit]: q
繰り返し処理を途中でスキップする

ループ正常終了後の処理: else

while 文による繰り返し処理が正常終了後に何らかの処理を行いたい場合は else を使います。

numbers = [1, 3, 5]
position = 0
while position < len(numbers):
    number = numbers[position]
    if number % 2 == 0:
        print('Found even number', number)
        break
    position += 1
else: # breakが呼び出されていない
    print('No even number found')

No even number found
繰り返し処理を途中でスキップする

関連記事

Python 全体の仕様を体系的にまとめたページは、プログラミング Python 入門を参照してください。

Category:
プログラミング
公開日:
更新日:
Pageviews:
167
Shares:
3
Tag:
Python