24.for文

プログラムの制御文は条件分岐と繰り返しで
今回は繰り返しをやっていきます。

お待たせしました、for文です。

pythonで処理を繰り返し行う場合は for を使っていきます。

forの使い方

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

※イテラブルオブジェクトとは?

繰り返しができるオジェクト、
要は複数要素をもつオブジェクトの事

例えば
こう変数に文字を格納すると

In [1]:
aaaa = 'abcde12345'
print(aaaa)
abcde12345

これは文字列の「オブジェクト」になります。

オブジェクト指向では,「⁠データ」を「オブジェクト」として扱うので
データを格納した「⁠変数」もまた「オブジェクト」と同じものだと言えます。

ではイテラブルオブジェクトってなんでしょうか?
これは繰り返しができるという意味で、
複数要素をもつオブジェクトのことです。

要はリスト型や辞書型のようなデータ構造のオブジェクトとなります。
for文では文字列型でも繰り返しを行う事ができます。

簡単なfor文の例:

In [2]:
# 5回繰り返し処理を行う
for i in [1,2,3,4,5]:
    print(i)
1
2
3
4
5

これが一番シンプルな繰り返しです。
for 文の中の繰り返される処理の部分はインデントをしてください。

繰り返し行う回数というのが、「in」のあとに書いた
イテラブルオブジェクトの要素数だけ行われます。

for の後に書いた この「 i 」という変数は
繰り返しの中で使うことのできる変数になります。

それぞれ1回目はこのリストの1つ目がこの「 i 」に代入される
2回目は2つ目・・・
という仕組みになっているので、
このリストの要素数分だけ処理が実行されるという仕組みです。

リストは変数に代入しておいても同じように動きます。

In [3]:
# リスト型の変数に6つの要素を格納する
sample_list =[ 1,2,3,4,5,6]

# 6回繰り返し処理を行う
for i in sample_list:
    print(i)
1
2
3
4
5
6

回数を指定したい場合

range()関数で回数分の値を生成する。

range(整数値)
range(開始,終了)
range(開始,終了,間隔)

※range()関数は引数に指定した整数値の分だけ
数値を生成してくれます。
引数を追加すると開始、終了の数値、間隔を調整する事もできます。

In [4]:
# 10個の数値を持ったオブジェクトを生成
print(range(10))
range(0, 10)

ただしこれはリストではないので分かりづらいです。
リストに変換してみましょう。

In [5]:
print(list(range(10)))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

これでリスト型になりわかりやすくなります。

range()関数では0から始まって引数分だけ整数値を生成しますが
注意点としては0から始まるので
終わりは指定した値にならないので注意してください。
指定した値 -1 になっています。

In [6]:
for i in range(3):
    print(i)
0
1
2

繰り返しは基本、なんらかのオブジェクトを用いてその要素数だけ実行するか
range()関数を使って指定した回数だけ実行するか、ということになります。

In [7]:
# 文字列型の文字数だけ実行する場合
for i in 'apple':
    print(i)
a
p
p
l
e
In [8]:
# range関数で4回だけ実行する場合
for i in range(4):
    print(i)
0
1
2
3

第一引数から始まって、第二引数まで、となります。
この場合は5から10 の1つ手前までの値を生成します。

In [9]:
# 5から9まで
for i in range(5,10):
    print(i)
5
6
7
8
9

第三引数は、どれだけ加算するかを決められます。

マイナスを指定すると、引いていくこともできます。

In [10]:
# 2から10手前までの偶数
for i in range(2,10,2):
    print(i)
2
4
6
8
In [11]:
# 20から10手前までの3個飛ばしで
for i in range(20,10,-3):
    print(i)
20
17
14
11

繰り返しの途中で抜ける場合

break を用いる

In [12]:
li = ['Alice', 'in', 'Chains']
for name in li:
    if name == 'in':
        print('!!BREAK!!')
        # ここで抜ける
        break
    # 2回目の処理は行われない
    print(name)
Alice
!!BREAK!!

この場合は繰り返しの2回目でif 文の条件に引っかかり、
その中のプリント文と break が実行されます。

そうなると途中で抜けた場合は、抜けた後以降の処理は行われません。
結果として2回目のプリントの前に抜けた、ということになります。

for 文でもelse が使用できます。

In [13]:
for i in  ['Alice', 'in', 'Chains']:
    print(i)
else:
    # for文の後に実行される
    print('処理終了')
Alice
in
Chains
処理終了

breakによって途中絵終了した場合には
elseの処理は実行されません。

In [14]:
li = ['Alice', 'in', 'Chains']
for name in li:
    if name == 'in':
        print('!!BREAK!!')
        break
    print(name)
else:
    # break後は実行されない
    print('!!FINISH!!')
Alice
!!BREAK!!

breakは完全に処理を抜けてしまいますが
処理の一部だけを飛ばして、まだ処理を続けたい時は
continue を使います。

In [15]:
li = ['Alice', 'in', 'Chains']
for name in li:
    if name == 'in':
        print('!!continue!!')
        # ここで処理を飛ばす
        continue
    # continue後は実行されない
    print(name)
else:
    # 最後に実行される
    print('!!FINISH!!')
Alice
!!continue!!
Chains
!!FINISH!!

for文はプログラムの中でも高頻度で使われるもので
プログラムでは必須です。

どう処理を組み立てれば良いかを考えながら
for文を用いていきます。

特に2回以上行うような複雑な処理を二回書くよりは
for文内で1回で済ませてしまう方が楽になるので
使い方なども研究してみてください。