pythonの繰り返し処理についてまとめました。
初級者向けです。
pythonバージョン:3.6.9
公式ドキュメントは以下が参考になります。
for文・while文
range
#Rangeを使用するfor
Rangeオブジェクトを使用する繰り返しは、主に回数指定のループ処理に使用します。
Rangeオブジェクトはrange(start, stop, step)
とすることで生成でき、for文中で用いることでstartからstop - 1 まで(stop自体は含まれません)をstepずつ増やしながら実行することができます。以下にいくつか例を挙げます。
##N回繰り返す
for i in range(5):
print(i)
# 0 ~ 4 が出力される
#Rangeのイニシャライザは、startが0、stepが1のデフォルト値があります。
##1から始めて、2ずつ増やしながら繰り返し
#stepに与える値を変えることで任意の順序でループができます
for i in range(1, 10, 2):
print(i)
#1, 3, 5, 7, 9 が出力される
##値を減らしながら繰り返す
逆に減らしながらの実行も可能です。
#startが10、stopが-1、stepが-1なので、10から始まり0までを1ずつ減らしながら処理します
for i in range(10, -1, -1):
print(i)
#10 ~ 0が減少しながら出力される
#For
こちらはrange
を使用しない場合のfor
の使用方法です。
主にイテラブルなどの集合操作に使用します。
##リストなどの要素をすべて繰り返し処理する
Javaなどで言うところのforeach に該当するものです。
処理することができるのは、イテラブルと呼ばれるオブジェクトです。リストやセット、タプルなどがこれにあたります。
(__iter__()
を実装しているものがイテラブルと呼ばれるのですが、詳細な解説は割愛します。)
#リストの全要素を繰り返す
a = [1, 3, 5, 7]
for n in a:
print(n)
#セットに対しても同様
s = {1, 2, 3, 4}
for n in s:
print(n)
なお、ディクショナリについては、ディクショナリが持つメソッドを用いてキーと値を取り出します。
#キーをすべて処理する
for k in m.keys():
print(k)
#値をすべて処理する
for v in m.values():
print(v)
#キーと値のペアに対して処理をする
for k, v in m.items():
print(str(k) + v)
##インデックス付きで繰り返す
要素を走査しつつインデックスも使用したい場合はenumerate
を使用します。
a = ['a', 'b', 'c', 'd', 'f']
for i, n in enumerate(a):
print(i, n)
#以下のように出力されます。
#0 a
#1 b
#2 c
#3 d
#4 f
##複数のイテラブルを同時に処理する
複数のイテラブルの要素を順に同時に扱いたいときはzip()
を使います。
a = [1, 2, 3, 4, 5]
b = ['a', 'b', 'c', 'd', 'e']
for i, j in zip(a, b):
print(str(i) + j)
注意点として、イテラブルの要素数が異なる場合、余分な(要素数の多い方の)要素は無視されます。
#リストaが持つ要素のうち、後ろ3つは処理対象になりません
a = [1, 2, 3, 4, 5, 6, 7, 8]
b = ['a', 'b', 'c', 'd', 'e']
for i, j in zip(a, b):
print(str(i) + ' ' + j)
#1 a
#2 b
#3 c
#4 d
#5 e
# 6 ~ 8 が出力されません!
#While
whileは、「ある条件を満たしている間」処理を実行し続けます。
#この例だと、iが10未満の間、処理を続けます
i = 0
while i < 10:
print(i)
i += 1
# 0 ~ 9 が出力されます。
条件を満たしている間実行し続けるので、下記のコードは無限ループです。
#無限ループの簡単な例
#whileの条件が常にTrueのため、無限ループ
while True:
print('hoge')
#continue, break, else
continue
, break
, else
は、それ単独ではループ処理を実現しませんが、上記に挙げたfor
やwhile
と組み合わせることで、ループ処理中に処理の中断やスキップなどができるようになります。
##continue
continue
は、以下の処理をスキップして、次のループ処理に移ります。
特定の条件の場合は処理をしたくないときなどに使用します。
for i in range(10):
if i % 2 == 0:
#偶数の場合、continueが実行され、次のループ処理に移ります
continue
print(i)
# 1,3,5,7,9 が出力されます
##break
break
は、ループ処理そのものを終了します。特定の条件を満たした場合にループ処理を終了させたい場合などに使用します。
for i in range(10):
# i が7の時に処理を終了するため、7以降の数字は出力されません。
if i == 7:
break
print(i)
#0,1,2,3,4,5,6が出力されます
##else
else
は、ループ処理が終了後、かつbreakでループが終了していないときに実行されるブロックです。
for i in range(10):
print(i)
else:
print('done!')
#0 ~ 9が出力された後、done! が出力されます。
breakでループから抜けた場合はelseは実行されないため、下記の例ではelse句は実行されません。
for i in range(10):
if i == 7:
break
print(i)
else:
print('done!')
# 0 ~ 6が出力され、処理が終了します
以上、他にループ処理についての知見が増えたらまた編集します。