読者です 読者をやめる 読者になる 読者になる

Python Works

Pythonで色々プログラミングする

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