for 文による繰り返し処理とインデントの規則

for 文による繰り返し処理とインデントの規則

for文による繰り返し処理

for文とインデント

 まず最初にサンプルコードを掲載します。

# プログラミング言語のリスト
p_language = ["Python", "C++", "Java", "PHP", "Ruby"]

# リストから順に要素を取り出します
for x in p_language:
    print(x, end = "")
Python C++ Java PHP Ruby

 このサンプルコードでは、最初に 5 個の要素で構成されるリスト型変数を定義してから、

 ・リスト p_language から "Python" という要素を取り出して変数 x に入れて、x を表示する。
 ・リスト p_language から "C++" という要素を取り出して変数 x に入れて、x を表示する。
 ・リスト p_language から "Java" という要素を取り出して ......

という処理を繰り返します。最後の "Ruby" を取り出して表示したら処理を終えます。このように、Python では for繰り返し変数 とイテラブルオブジェクトを添えて ループ処理 を実行することになっています。
 
python for文による繰り返し処理(ループ)
 
 イテラブルオブジェクトとは リスト文字列set のように、反復処理で要素を取り出せるオブジェクトのことです。ループの間は繰り返し変数はイテラブルオブジェクトから1つずつ値を受け取って処理が実行されます。

 ループ内で処理する内容は段落を下げてから、インデントして(左側に空白を空けて)記述します。
 同一ループの中で処理したい内容はすべてインデントが揃っていなくてはなりません(インデントの揃ったコードの範囲はブロックとよばれます)。これが Python 特有のインデントのルールです。このルールのおかげで、Python のコードは他の言語に比べてとても読みやすくなっているのです。どのようなインデント幅をとってもコードは動きますが、半角 4 文字というのが世界共通のルール(というよりマナー?)となっているようです。とはいえ、Jupyter Notebooki をはじめ、Python 専用エディタには自動でインデントを入れる機能が備わっているので、実際にコードを書くときにはインデントの幅についてあまり気にする必要はありません。以下では for文を使ったいくつかの例を紹介します。
 

文字列を区切ります

 "Python" という文字列を「 | 」で区切ってみましょう。
 for文で一文字ずつ取り出し、「 | 」を付け加えて表示するという処理を繰り返します。

my_str = "Python"

# Python を一文字ずつ区切ります
for x in my_str:
    print(x, "| ", end = "")
P | y | t | h | o | n | 

 

Range関数を使ってループします

 for文に添えるイテラブルオブジェクトとして range関数 が多用されます。range は連続した整数を生成する関数です。たとえば range(10) は 0 から 9 までの 10 個の数字を作りだします (1 から 10 ではないことに注意!)。for文と組合わせると、繰り返し変数には range から取り出された数字が順次代入され、要素がなくなるとループを終了します。つまり range(10) をイテラブルオブジェクトとして使うとループ回数は 10 回となります。例として "Python" という文字列を 3 つ表示させてみましょう。

for x in range(3):
    print("Python", end = "")
Python Python Python

 

等差数列の和を計算します

 数字の 1 から 10 を順番に足した和を計算してみましょう(これは最も単純な等差数列の足し算で、答えはよく知られているように 11 × 5 = 55 となるはずです)。

asum = 0

for x in range(11):
    asum += x
print(asum)
55

 asum の a は arithmetric series(等差数列)の頭文字です。
 このコードでは range(11) の要素を asum に加えた値を asum に再代入することを繰り返して

  0 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10

を計算しています。最初の 0 二つが要らないと思えば、asum の初期値を 1, range関数の第1引数に開始要素 2 を指定します (2, 3, ...... 10 という数字が生成されます)。

asum = 1

for x in range(2,11):
    asum += x
    
print(asum)
55

 

等比数列の和を計算します

 初項 1、公比 5 の等比数列の第 5 項までの和

  1 + 5 + 52 + 53 + 54

を計算してみましょう。

gsum = 1

for x in range(4):
    gsum += 5 ** (x + 1)
    
print(gsum)
781

 gsum の g は geometric series(幾何級数)の頭文字です。
 range(4) の最初の要素が 0 なので、5 のべき指数を x + 1 として計算しています。プログラミングに慣れないうちは、頭の中で変数を1つずつ動かしながら、繰返し処理の過程を追ってみてください。
 

ディクショナリのループ

 ディクショナリの反復処理はキーを繰り返し変数に使います。

キーを取得します

 ディクショナリのキーを表示するサンプルコードです。

# X大学の科目コードと科目名
subjects = {"B235":"解析力学", "B245":"電磁気学", "F115":"群論Ⅰ"}

# 科目コードを取得します
for k in subjects:
    print(k)
B235
B245
F115

 

値を取得します

 ディクショナリの値(バリュー)を表示するサンプルコードです。

# X大学の科目コードと科目名
subjects= {"B235":"解析力学", "B245":"電磁気学", "F115":"群論Ⅰ"}

# 科目名を取得します
for k in subjects:
    print(subjects[k])
解析力学
電磁気学
群論Ⅰ

 

# X 大学の科目コードと科目名
subjects= {"B235":"解析力学", "B245":"電磁気学", "F115":"群論Ⅰ"}

# 科目名を取得します
for k in subjects.values():
    print(k)
解析力学
電磁気学
群論Ⅰ

 

キーと値を取得します

 ディクショナリのキーと値を表示するサンプルコードです。

# X大学の科目コードと科目名
subjects = {"B235":"解析力学", "B245":"電磁気学", "F115":"群論Ⅰ"}

# 科目コードと科目名を取得します
for k in subjects:
    print(k, subjects[k])
B235 解析力学
B245 電磁気学
F115 群論Ⅰ

 
 タプル形式で取得することもできます。

# X 大学の科目コードと科目名
subject = {"B235":"解析力学", "B245":"電磁気学", "F115":"群論Ⅰ"}

# 科目コードと科目名をタプルで取得します
for k in subjects.items():
    print(k)
('B235', '解析力学')
('B245', '電磁気学')
('F115', '群論Ⅰ')

 

値によって条件分枝します

 もう少し複雑な例を見てみましょう。
 ある大学の『代数学』の試験の結果がディクショナリに

  {氏名A:51, 氏名B:83, 氏名 C:67, ...... }

という形で保存されているとします。それぞれの得点に応じて「優」「良」「可」「不可」の成績をつけて、

  氏名 A:良
  氏名 B:不可
  氏名 C:優

のように表示させるには、キーと値に対応する 2 つの変数でディクショナリをループさせながら、「"値" がこの点数の範囲にあれば」「"キー" の成績は~」と判定していきます。

# 代数学の成績と単位認定
test_score = {"田中次郎":58, "鈴木ゆかり":72, "中村啓介":84}

for x, y in test_score.items():
    
    if y <= 59:
        print(x,":不可")
        
    elif 60 <= y <= 69:
        print(x, ":可")
        
    elif 70 <= y <=79:
        print(x, ":良")
        
    else:
        print(x,":優")
田中次郎 :不可
鈴木ゆかり :良
中村啓介 :優

 x と y は、それぞれキーと値に対応する繰り返し変数です。ループの1回ごとに、y(点数)によって条件分枝して、x(氏名)と成績を print関数で表示させています。
 

複数変数によるループ処理

 itertoolsモジュールの product()関数を使うと、引数に渡したリストの直積をタプルで返します。すなわち、異なるリストの要素同士ですべての組合わせをとることを意味します。たとえば、お菓子のリストと飲み物のリストを itertools.product() に渡すと、お菓子と飲み物の組合わせをすべて返します。

import itertools

# お菓子リスト
list_1 = ["ガトーショコラ", "アップルパイ", "ティラミス"]

# 飲み物リスト
list_2 = ["紅茶", "コーヒー", "ココア"]

# お菓子と飲み物の組合わせをすべて取得

for j, k in itertools.product(list_1, list_2):
    print((j, k))
('ガトーショコラ', '紅茶')
('ガトーショコラ', 'コーヒー')
('ガトーショコラ', 'ココア')
('アップルパイ', '紅茶')
('アップルパイ', 'コーヒー')
('アップルパイ', 'ココア')
('ティラミス', '紅茶')
('ティラミス', 'コーヒー')
('ティラミス', 'ココア')

 
 引数に range()関数を渡すと、数値の複数変数でループさせることができます。

import itertools

# 0~2の数字のペアをすべて取得

for j, k in itertools.product(range(3), range(3)):
    print((j, k), end = ", ")
(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2),