Python入門 - 繰り返し
同じ処理をなんども繰り返す
学生の名前データをリストにしている時に、リストに名前をある1つずつ順番に表示するような処理を考えてみましょう。
サンプルコード
studentList = ['Suzuki', 'Tanaka', 'Kato', 'Yamada']
print(studentList[0])
print(studentList[1])
print(studentList[2])
print(studentList[3])
実行結果
Suzuki
Tanaka
Kato
Yamada
リストの要素数が少なければ、こういうやり方でもいいかもしれません。
しかし、100人分の名前のリストだったらどうでしょうか?この書き方では、正直ちょっとやってられないですね。
このやりたいことは、「リストの要素を表示する」という処理をリストの要素数だけ繰り返す、という操作です。
このように、同じ処理を繰り替えず(ループする)ためにPythonでは、「for文」と「while文」というものがあります。
for文
それでは、先にfor文からみていきましょう。
for文は「オブジェクトの最初の要素から処理をスタートして、最後の要素の処理が終わるまで、処理を繰り返す」ことができます。
for ループ変数 in オブジェクト:
繰り返したい処理
繰り返したい処理
・・・
まず、繰り返したい処理をforよりも一段下げる(インデントする)ことと、forの最後に「:(コロン)」を付けるのは、if文と一緒です。
「ループ変数」と「オブジェクト」については、サンプルコードをみながら説明したいと思います。
サンプルコード
sutudentList = ['Suzuki', 'Tanaka', 'Kato', 'Yamada']
for name in sutudentList:
print(name)
実行結果
Suzuki
Tanaka
Kato
Yamada
先ほどの、1つずつ順番に表示したサンプルコードと同じ結果になりました。
これは、ループ変数「name」にオプジェクト「studentList」の要素を、順番に代入しながら処理をしたからです。
ループ変数には、オブジェクトの要素が代入されます。
そして、ループが1回分が終わると、オブジェクトの次の要素がループ変数に代入されます。
この「オブジェクトの要素を順番にループ変数に代入して処理」することを「オブジェクトの最後の要素まで(オブジェクトの全ての要素に対して)」行います。
これが、for分の基本的な使い方です。
では、もう少しサンプルをみてみましょう。
サンプルコード
drinkSet = (['water', 'coffee', 'tea'])
for drink in drinkSet:
if drink == 'coffee':
print('I like ' + drink)
elif drink == 'tea':
print('I do not like ' + drink)
実行結果
I like coffee
I do not like tea
このように、ifと組み合わせて使うこともできます。
繰り返し処理は、実際のプログラムの中でも、よくでてきますし、様々な使い方があります。
rangeオプジェクト
繰り返し処理をする時に、リストやセットの全ての要素について処理するのではなく、「10回繰り返す」とか「-5〜5まで繰り返す」ということをしたい時があります。
この時に、例えば、list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]というオブジェクトを作ればできるのですが、めんどくさいです。
このような数字が順番に並んだオブジェクトを簡単に作る方法がPythonにはあります。
それが「rangeオブジェクト」です。
サンプルコード
sum = 0
for i in range(10):
print(i)
sum += i
print(sum)
print('**************')
for i in range(-5,5):
print(i)
実行結果
0
0
**************
1
1
**************
2
3
**************
3
6
**************
4
10
**************
5
15
**************
6
21
**************
7
28
**************
8
36
**************
9
45
**************
-5
-4
-3
-2
-1
0
1
2
3
4
range(n)で「0 〜 (n - 1)までのn個の整数」が要素のオブジェクトになります。
また、range(from, to)で「from 〜 (to - 1)までの整数」が要素のオブジェクトになります。
rangeは、指定回数だけ順番に繰り返し処理をする時によく使います。
continue文
処理を繰り返している途中で、ある条件の時だけ、処理をスキップしたい場合があります。この時、continue文を使うことで処理をスキップすることができます。
次のサンプルは3の倍数の時だけ、数値を表示するのをスキップするプログラムです。
サンプルコード
for i in range(10):
if (i % 3) == 0:
print('skip!')
continue
print(i)
実行結果
skip!
1
2
skip!
4
5
skip!
7
8
skip!
continueは、たいていの場合、if文と組み合わせて使うことになると思います。
break文
処理のスキップに続いて、繰り返しの中断の仕方もみてみましょう。
例えば、「繰り返し処理をしている中で、エラーが発生したら繰り返しを中断する」などの使い方があります。繰り返しの中断には「break文」を利用します。
次のコードは5〜19までの数値を順番に足していく中で、「もし100を超えたら繰り返しを中断」します。
サンプルコード
sum = 0
for i in range(5, 20):
sum += i
print(sum)
if sum > 100:
print('finish!')
break
実行結果
5
11
18
26
35
45
56
68
81
95
110
finish!
繰り返しが途中で中断していることがわかりますね。
whilw文
ythonには、もう1種類、繰り返しをするために「while文」があります。
while文は「条件がtrueである間、処理を繰り返す」ことができます。
while 条件式:
繰り返したい処理
繰り返したい処理
・・・
では、実際にコードを書いてみましょう。
サンプルコード
i = 0
while i < 10:
i += 2
print(i)
実行結果
2
4
6
8
10
while文では、for文と違い、事前に繰り返し回数がわからないような処理に向いています。for文では「オブジェクトの要素数の分しか繰り返さない」のに対して、while文では、「条件がtrueの間(つまり、falseになるまで)ずっと繰り返す」からです。
while文でも、for文と同じようにcontinue分野break文を使うことができます。
無限ループ
while文の特徴的な使い方の1つに無限ループがあります。これは、while文の条件が、ずっとtrueのままでfalseにならないようにすることで実現できます。
次のコードは、無限ループなので、実行すると普通にはプログラムは終了しません。強制的に中断するためには、キーボードの「control + c」を同時におす必要があります。(IDLEを終了してもOKです)
サンプルコード
i = 0
while i < 10:
print('loop!ç')
whileの中で、「i」が変更されないので、「iはずっと0のまま」です。その結果「i < 10はずっとtrue」でループから抜け出すことができません。しかし、この無限ループはbreakと組み合わせて、便利に使うことができます。
次のサンプルは、endと入力してenterキーが押されるまでループします。(input()を使うことで、キーボードからの入力を取得することができます)
サンプルコード
while True:
print('loop!')
str = input()
if str == 'end':
print('break!')
break