Pythonの「for文(forループ)」は、同じ処理を繰り返し行うための機能です。for文を活用することで、大量の値・データを効率的に扱えます。また、Pythonにはさまざまな便利メソッド・関数が用意されており、複雑な処理も簡単にできます。
しかし、これらの機能をどのように活用すればいいか、わからないこともあるでしょう。そこで本記事では、Pythonのfor文の使い方や各種関数に加えて、実際のコーディングに役立つ応用テクニックを解説します。
目次
Pythonの「for文」は、繰り返し処理(ループ処理)を簡潔に記述するための機能です。たとえば、1から9までの値を順番に表示したい場合、通常は以下のように書く必要があります。
# coding: Shift-JIS # 1から9までの値を順番に表示する print(1) print(2) print(3) print(4) print(5) print(6) print(7) print(8) print(9)
同じ処理を何度も書かないといけないので、非常に煩雑になります。しかしfor文を使えば、以下のように同じ処理をわずか2行で書けます。
# coding: Shift-JIS # 1から10までの値を順番に表示する for i in range(1, 10): print(i)
このように、Pythonのfor文は繰り返し処理を簡潔に記載できる便利な機能です。詳細は後述しますが、複数のデータをまとめて格納できる「リスト」と組み合わせれば、大量のデータ処理も効率的に行えます。
Pythonのforループの基本的な構文は以下のとおりです。
for ループ変数 in イテラブルオブジェクト: 処理内容
「イテラブルオブジェクト」とは、順番にアクセスできるオブジェクトのことで、主にリスト・タプル・辞書などが該当します。forループ内部では、イテラブルオブジェクトに1つずつアクセスしていきます。「ループ変数」は、現在アクセス中の1つの要素を指し、「処理内容」ではループ変数を操作するのが基本です。
また、for文の次に書く「処理内容」は、必ずインデントを挟まないといけません。Pythonはインデントで処理の階層を表現する言語なので、このインデントを省くとエラーが出ます。forループを活用して、1から9までの数値をひとつずつ画面上に表示してみましょう。
//サンプルプログラム
# coding: Shift-JIS # 1から10までの値を順番に表示する for i in range(1, 10): print(i)
//実行結果
forループのイテラブルオブジェクトが「range(1, 10)」となっていますが、これは1から9までの値を格納したオブジェクトです。そのオブジェクトの各要素は、ループを繰り返すごとに変数「i」に格納されて、print関数で「i」の値を表示しています。
Pythonのfor文の活用例として最も多いのが「リスト」との組み合わせです。リストとは、複数の値やデータをまとめて扱うための機能で、以下のように使います。
list = [1, 1.0, "abc"]
特定のデータ型に縛られることなく、全体の要素数(サイズ)も自由に変えられるのが、Pythonのリストの便利なところです。ここでは、リストとfor文の組み合わせについて、以下5つのテクニックを見ていきましょう。
リストとfor文は、以下のサンプルコードのように組み合わせて使います。
//サンプルプログラム
# coding: Shift-JIS # 整数値をリストに格納する nums = [1, 2, 3, 4, 5] # for文でリストの全要素を表示する for i in nums: print(i)
//実行結果
整数値をリストに格納し、そのリストを「for i in nums:」という構文で、for文のイテラブルオブジェクトに指定するだけです。
なんらかの事情でforループの処理を途中で終了する必要があるときは、if文で条件を指定したうえで「break」を記載します。breakの使い方は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: Shift-JIS # 整数値をリストに格納する nums = [1, 2, 3, 4, 5] # for文でリストの全要素を表示する for i in nums: # iの値が「3」になったらループを抜ける if i == 3: break # リストの要素を表示する print(i)
//実行結果
「i == 3」以降のすべてのループ処理が行われていないことがわかります。これは、「break」によってループ処理そのものが終了するためです。
breakは以降のループ処理すべてを終了させます。一方、特定の値のときだけ処理をスキップしたいときは、if文で条件を指定したうえで「continue」を記載します。詳細は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: Shift-JIS # 整数値をリストに格納する nums = [1, 2, 3, 4, 5] # for文でリストの全要素を表示する for i in nums: # iの値が「3」のときだけ処理をスキップする if i == 3: continue # リストの要素を表示する print(i)
//実行結果
breakのときとは違い、表示されていないのは「3」だけで、「4」以降の値は表示されています。これは、continueがその値の処理だけをスキップし、以降は通常どおりループ処理を行うからです。
リストから一部要素だけを抽出する「スライス」と、forループを組み合わせることもできます。この場合は以下のように、イテラブルオブジェクトにスライス済みのリストを指定します。
for ループ変数 in リスト変数[開始インデックス:終了インデックス + 1:差分値]: 処理内容
リストのスライスは、「[開始インデックス:終了インデックス + 1:差分値]」という構文で行います。終了インデックスは、スライス後のリストの最後の要素となるインデックスより、1大きい値を指定することに注意が必要です。
差分値は、要素ごとにインデックスをどれだけ進めるかを示します。たとえば、[1][3][5]と1つずつ要素を飛ばしてスライスしたい場合は、「[1:6:2]」と記載すればOKです。詳細を以下のサンプルコードで確認しましょう。
//サンプルプログラム
# coding: Shift-JIS # 整数値をリストに格納する nums = [1, 2, 3, 4, 5, 6, 7, 8, 9] # for文でリストの全要素を表示する for i in nums[1:6:2]: print(i)
//実行結果
上記のサンプルプログラムでは、[1, 2, 3, 4, 5, 6, 7, 8, 9]というリストから、1番目・3番目・5番目の要素をスライスすることで、[2, 4, 6]のリストを作成できました。
「リスト内包表記」は、リストの作成時にforループで値を設定するための機能です。リスト内包表記の基本的な構文は以下のとおりです。
リスト変数 = [演算式 for ループ変数 in イテラブルオブジェクト]
最初に「演算式」があることが、通常のforループとの違いです。イテラブルオブジェクトとして、ほかのリスト変数を渡せます。演算式でほかのリストの値を加工し、加工した値で新たなリストを作成できます。たとえば、「sample code」という文字列「str」をすべて大文字にしたい場合は、「i.upper() for i in str」と記載すればOKです。以下のサンプルコードで詳細を確認しましょう。
//サンプルプログラム
# coding: Shift-JIS # 文字列をリストに格納する listA = ["s","a","m","p","l","e"," ","c","o","d","e"] # 最初のリストをすべて大文字にして別のリストに格納する listB = [i.upper() for i in listA] # 1つ目のリストを表示する print(listA) # 2つ目のリストを表示する print(listB)
//実行結果
リスト内包表記は便利ですが、多用しすぎるとソースコードの可読性が低下するので注意が必要です。
以下4つの関数・メソッドを使うことで、Pythonのfor文・forループがさらに便利に使えます。
冒頭のサンプルコードでは「range関数」を使いましたが、実はこの関数には以下3種類の構文があります。
range(繰り返す回数) range(開始位置, 終了位置 + 1) range(開始位置, 終了位置 + 1, 差分値)
1つ目のrange関数は、単純に繰り返し回数を指定したいときや、「0」から「繰り返し回数 – 1」までの整数値が必要なときに使います。2つ目と3つ目のrange関数は、特定の範囲の値が必要なときに便利です。3つ目のrange関数では、各要素の差分値を設定できるので、偶数や奇数などの値を取得できます。詳細は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: Shift-JIS # 値の表示を5回繰り返す for i in range(5): print(i) print() # 0から4までの値を表示する for i in range(0, 5): print(i) print() # 0から8までの偶数値を表示する for i in range(0, 10, 2): print(i)
//実行結果
3つ目のrange関数は、引数を(0, 10, 2)としているため、「0~9までの数値を、2ずつ加算しながら取得する」ことになります。そのため、「10」は含まれていません。range関数は、「終了位置」の設定を間違いやすいので注意が必要です。終了位置には、実際の最後の値より「1」大きいものを設定しましょう。
複数のイテラブルオブジェクトを同時に扱いたい場合は、以下の構文でzip関数を使用しましょう。
for ループ変数A, ループ変数B in zip(リストA, リストB):
zip関数の引数に2つのリストを指定し、さらに2つのループ変数を用意すれば、以下のサンプルコードのように2つの異なるリストを同時に操作できるので便利です。
//サンプルプログラム
# coding: Shift-JIS # 2つのリストを作成する country = ["日本", "イギリス", "アメリカ", "中国"] capital = ["東京", "ロンドン", "コロンビア特別区(ワシントンD.C.)", "北京"] # 2つのリストをfor文で同時に処理する for i, j in zip(country, capital): print(i + "の首都は「" + j + "」です")
//実行結果
なお、2つのリストの要素数(サイズ)が異なる場合は、サイズが小さいほうの末尾までしか実行されません。たとえば、リストAのサイズが5・リストBのサイズが7の場合は、forループは5回しか実行されないということです。
通常のforループでは、各要素のインデックスは取得できません。インデックスも必要な場合は、以下の構文で「enumerate関数」を使いましょう。
for インデックス変数, ループ変数 in enumerate(リスト, 初期インデックス):
1つ目の変数がインデックス、2つ目が要素を示す通常の変数となります。イテラブルオブジェクトとしてenumerate関数を指定し、第1引数の引数はリスト変数、第2引数はインデックスの最初の値を渡します。なお、第2引数は省略可能ですが、たとえばインデックスの表示を「1」から始めたい場合は第2引数を「1」にしましょう。詳細は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: Shift-JIS # リストを作成する country = ["日本", "イギリス", "アメリカ", "中国"] # リストをfor文で表示する for i, j in enumerate(country, 1): print(i, j)
//実行結果
forループで各要素に逆順でアクセスしたい場合は、「reversed関数」を使用しましょう。reversed関数の構文は以下のとおりです。
for ループ変数 in reversed(リスト変数):
reversed関数は引数にリスト変数を取り、リストの中身を逆順にして返します。reversed関数の使い方は以下のサンプルコードのとおりです。
//サンプルプログラム
# coding: Shift-JIS # リストを作成する list = [1, 2, 3, 4, 5] # リストをfor文で逆順表示する for i in reversed(list): print(i)
//実行結果
for文と「タプル」や「辞書」の組み合わせも、前述したリストと基本的な部分は同じです。まずはタプルとfor文の組み合わせ方を、以下のサンプルコードで確認しましょう。
//サンプルプログラム
# coding: Shift-JIS # タプルを作成する nums = (1, 2, 3, 4, 5) # タプルをfor文で表示する for i in nums: print(i) # タプルを作成する nations = [("日本", "東京"), ("イギリス", "ロンドン"), ("アメリカ", "コロンビア特別区(ワシントンD.C.)"), ("中国", "北京")] # タプルをfor文で展開しながら表示する for i in nations: print(i) for i, j in nations: print(i, j)
//実行結果
辞書とforループの組み合わせ方はやや特殊で、使用する関数によって以下のように得られる結果が異なります。
//サンプルプログラム
# coding: Shift-JIS # 辞書を作成する(辞書は「キー」と「値」の2つの要素から成り立つ) nations = {"日本":"東京", "イギリス":"ロンドン", "アメリカ":"コロンビア特別区(ワシントンD.C.)", "中国":"北京"} # 辞書をそのままfor文で回すと「キー」を取得できる for i in nations: print(i) print() # values関数でfor文を回すと「値」を取得できる for i in nations.values(): print(i) print() # items関数でfor文を回すと「キー」と「値」の双方を取得できる for i, j in nations.items(): print(i, j)
//実行結果
Pythonでは、「行」と「列」からなる「2次元リスト」が使えます。2次元リストのポイントは、リストの中にリストがあることをイメージすることです。実際に、以下のサンプルコードで2次元リストに触れてみましょう。
//サンプルプログラム
# coding: Shift-JIS # 空のリストを作成する list = [] # リストに5行追加する for i in range(5): list.append([]) # 各行に3列追加して値を設定する for j in range(3): list[i].append((j + 1) + (i * 3)) # 2重forループで各要素にアクセスする for row in list: for column in row: print(column)
//実行結果
Pythonのfor文・forループは、同じ処理を効率的に繰り返すための機能。これはプログラミングで必ず必要となる知識といっても過言ではありません。とくにリストやタプルとfor文を組み合わせれば、膨大なデータをまとめて処理できるようになります。「range関数」「zip関数」「enumerate関数」「reversed関数」など、便利な関数・メソッドもあるのでぜひ活用してみましょう。
2024.06.17
子供におすすめのプログラミングスクール10選!学習メリットや教室選びのコツも紹介
#プログラミングスクール
2022.01.06
【完全版】大学生におすすめのプログラミングスクール13選!選ぶコツも詳しく解説
#プログラミングスクール
2024.01.26
【未経験でも転職可】30代におすすめプログラミングスクール8選!
#プログラミングスクール
2024.01.26
初心者必見!独学のJava学習方法とおすすめ本、アプリを詳しく解説
#JAVA
2024.01.26
忙しい社会人におすすめプログラミングスクール15選!失敗しない選び方も詳しく解説
#プログラミングスクール
2022.01.06
【無料あり】大阪のおすすめプログラミングスクール14選!スクール選びのコツも紹介
#プログラミングスクール
2024.01.26
【目的別】東京のおすすめプログラミングスクール20選!スクール選びのコツも徹底解説
#プログラミングスクール
2024.01.26
【無料あり】福岡のおすすめプログラミングスクール13選!選び方も詳しく解説
#プログラミングスクール
2024.01.26
【徹底比較】名古屋のおすすめプログラミングスクール13選!選び方も詳しく解説
#プログラミングスクール
2024.01.26
【徹底比較】おすすめのプログラミングスクール18選!失敗しない選び方も徹底解説
#プログラミングスクール