for文による繰り返し処理
最初にサンプルコードを掲載します。
# PYTHON_FOR_LOOP # In[1] # プログラミング言語のリスト p_language = ["Python", "C++", "Java", "PHP", "Ruby"] # リストから順に要素を取り出します for x in p_language: print(x, end = "") # Python C++ Java PHP Ruby
このサンプルコードでは、最初に 5 個の要素で構成されるリスト型変数を定義してから、
・リストから “Python” という要素を取り出して変数 x に入れて x を表示する。
・リストから “C++” という要素を取り出して変数 x に入れて x を表示する。
・リストから “Java” という要素を取り出して …
という処理を繰り返します。最後の “Ruby” を取り出して表示したら処理を終えます。このように、Python では for に繰り返し変数とイテラブルオブジェクトを添えてループ処理を実行することになっています。
for 要素 in イテラブルオブジェクト: # ループ内で実行する処理
イテラブルオブジェクト とは リスト や 文字列、set のように、反復処理で要素を取り出せるオブジェクトのことです。ループの間は繰り返し変数はイテラブルオブジェクトから1つずつ値を受け取って処理が実行されます。
ループ内で処理する内容は段落を下げてから、インデントして(左側に空白を空けて)記述します。同一ループの中で処理したい内容はすべてインデントが揃っていなくてはなりません(インデントの揃ったコードの範囲はブロックとよばれます)。これが Python 特有のインデントのルールです。このルールのおかげで、Python のコードは他の言語に比べてとても読みやすくなっているのです。どのようなインデント幅をとってもコードは動きますが、半角 4 文字というのが世界共通のルール(というよりマナー?)となっているようです。とはいえ、Jupyter Notebook をはじめ、Python 専用エディタには自動でインデントを入れる機能が備わっているので、実際にコードを書くときにはインデントの幅についてあまり気にする必要はありません。以下では for文を使ったいくつかの例を紹介します。
“Python” という文字列を「 | 」で区切ってみましょう。for文で一文字ずつ取り出し、「 | 」を付け加えて表示するという処理を繰り返します。
# In[2] my_str = "Python" # Pythonを1文字ずつ区切る for x in my_str: print(x, "| ", end = "") # P | y | t | h | o | n |
for文に添えるイテラブルオブジェクトとして range関数 が多用されます。range は連続した整数を生成する関数です。たとえば range(10) は 0 から 9 までの 10 個の数字を作りだします (1 から 10 ではないことに注意!)。for文と組合わせると、繰り返し変数には range から取り出された数字が順次代入され、要素がなくなるとループを終了します。つまり range(10) をイテラブルオブジェクトとして使うとループ回数は 10 回となります。例として “Python” という文字列を 3 つ表示させてみましょう。
# In[3] # Pythonを3回表示 for x in range(3): print("Python", end = "") # Python Python Python
数字の 1 から 10 を順番に足した和を計算してみましょう(これは最も単純な等差数列の足し算で、答えはよく知られているように 11 × 5 = 55 となるはずです)。
# In[4] # 初期値 asum = 0 # 0,1,2,3,...,10を順にasumに加える 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 が生成されます)。
# In[5] asum = 1 for x in range(2,11): asum += x print(asum) # 55
初項 1、公比 5 の等比数列の第 5 項までの和
1 + 5 + 52 + 53 + 54
を計算してみましょう。
# In[6] 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つずつ動かしながら、繰返し処理の過程を追ってみてください。
ディクショナリのforループ
ディクショナリの反復処理はキーを繰り返し変数に使います。
ディクショナリのキーを表示するサンプルコードです。
# PYTHON_FOR_LOOP_DICTIONARY # In[1] # X大学の科目コードと科目名 subjects = {"B235":"解析力学", "B245":"電磁気学", "F115":"群論Ⅰ"} # 科目コードを取得します for k in subjects: print(k) # B235 # B245 # F115
ディクショナリの値(バリュー)を表示するサンプルコードです。
# In[2] # X大学の科目コードと科目名 subjects= {"B235":"解析力学", "B245":"電磁気学", "F115":"群論Ⅰ"} # 科目名を取得します for k in subjects: print(subjects[k]) # 解析力学 # 電磁気学 # 群論Ⅰ # In[3] # X 大学の科目コードと科目名 subjects= {"B235":"解析力学", "B245":"電磁気学", "F115":"群論Ⅰ"} # 科目名を取得します for k in subjects.values(): print(k) # 解析力学 # 電磁気学 # 群論Ⅰ
ディクショナリのキーと値を表示するサンプルコードです。
# In[4] # X大学の科目コードと科目名 subjects = {"B235":"解析力学", "B245":"電磁気学", "F115":"群論Ⅰ"} # 科目コードと科目名を取得します for k in subjects: print(k, subjects[k]) # B235 解析力学 # B245 電磁気学 # F115 群論Ⅰ
タプル形式で取得することもできます。
# In[5] # 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 つの変数でディクショナリをループさせながら、「”値” がこの点数の範囲にあれば」「”キー” の成績は~」と判定していきます。
# In[6] # 代数学の試験結果のディクショナリ 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() に渡すと、お菓子と飲み物の組合わせをすべて返します。
# PYTHON_FOR_LOOP_MULTI # In[1] import itertools # お菓子リスト list_1 = ["ガトーショコラ", "アップルパイ", "ティラミス"] # 飲み物リスト list_2 = ["紅茶", "コーヒー", "ココア"] # お菓子と飲み物の組合わせをすべて取得 for j, k in itertools.product(list_1, list_2): print((j, k)) # ('ガトーショコラ', '紅茶') # ('ガトーショコラ', 'コーヒー') # ('ガトーショコラ', 'ココア') # ('アップルパイ', '紅茶') # ('アップルパイ', 'コーヒー') # ('アップルパイ', 'ココア') # ('ティラミス', '紅茶') # ('ティラミス', 'コーヒー') # ('ティラミス', 'ココア')
引数に range()関数を渡すと、数値の複数変数でループさせることができます。
# In[2] 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),
【Python】for ループのまとめ
基本構文:
for 要素 in イテラブルオブジェクト:
# ループ内で実行する処理
forループの基本的な動作:
・イテラブルオブジェクトから次の要素を順番に取り出します。
・取り出した要素を変数に代入します。
・ループ内の処理を実行します。
・イテラブルオブジェクトの全ての要素に対して、上記の手順を繰り返します。
# PYTHON_FOR_LOOP_EXAMPLE fruits = ['apple', 'banana', 'orange'] for fruit in fruits: print(fruit) # apple # banana # orange # forループの例(2): for i in range(1, 5): # 1から4までの範囲でループ print(i) # 1 # 2 # 3 # 4 # forループの例(3): fruits = ['apple', 'banana', 'orange'] for index, fruit in enumerate(fruits): print(index, fruit) # 0 apple # 1 banana # 2 orange # breakによる処理中断: fruits = ['apple', 'banana', 'orange'] for fruit in fruits: if fruit == 'banana': break print(fruit) # apple # continueによるイテレーションのスキップ fruits = ['apple', 'banana', 'orange'] for fruit in fruits: if fruit == 'banana': continue print(fruit) # apple # orange
for ループは Python の基本的な制御構造の一つであり、データの反復処理や特定の処理の繰り返しに非常に便利です。さまざまなイテラブルオブジェクトを活用して柔軟な反復処理を実現することができます。
コメント