どのようなプログラミング言語でも、ループ処理や反復処理を行なうための関数が用意されています。
Pythonにおけるその内の1つが「for 文」です。
この記事では、Pythonにおける for 文の基本的な使い方と、共に使われるイテラブルごとの処理内容の違いについて説明します。
for 文の使い方
Pythonの for 文は、配列(リスト、タプル、文字列、など)にそって反復処理が行われます。
反復の順番は、配列内の要素の順番に依存します。
故に、「どのような配列なのか」「その中の要素はどのようなデータなのか」によって、for 文で実行できる処理内容は変わってきます。
本項では for 文の基本的な使い方について説明し、次項では反復に使う配列の違いによる各処理内容について説明します。
for 文と range() 関数
"""基本構成 for arg in iterable: processing statement """ # 0~10を出力する for number in range(0, 11): print(number) """出力結果 0 1 2 3 4 5 6 7 8 9 10 """
for 文の基本構成は、
for 変数 in イテラブル: → 改行 → インデント → 処理文記述
です。
一般的な数列による反復処理を行なう際には、range()関数の利用を考えてみてください。
例えば、list(range(0, 6)) を実行すると、0~5までのリスト: [0, 1, 2, 3, 4, 5] を返します。
ただし、range(0, 6) だけでは配列を返してくれません。
関数や構成物の中で、配列内の要素を逐次与える機能が要求される場所に使用することで効果を発揮します。
for 文と if 文
# 0~10の中から偶数を出力する for number in range(0, 11): if number % 2 == 0: print(number) """出力結果 0 2 4 6 8 10 """
for 文は複数のデータアクセスに向いており、if 文は複数の条件分岐に向いています。
これらを組み合わせることで、複数のデータを複数の条件式に当てはめた後、適切な処理を実行することができます。
if 文に関する記事はこちらになります。
watanabe-ichiro-nikki.hatenablog.com
リスト内包表記
# 0~20の中の偶数をリスト化する list_even = [] for number in range(0, 21): if number % 2 == 0: list_even.append(number) # リストを出力する print(list_even) """出力結果 [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] """ # 上記コードと同じ処理 even_list = [num for num in range(0, 21) if num % 2 == 0] print(even_list) """出力結果 [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20] """
リスト内包表記は、複数の要素からなるリストを簡単に作成できる記述方法です。
記述内容は、
変数(または変数を使った式)+ for 文+ if 文
となります。
上記コードのように、ある条件を満たすデータをリスト化したい時に使うことができます。
リスト内包表記ならびにリスト操作に関する記事はこちらになります。
watanabe-ichiro-nikki.hatenablog.comよく使うイテラブル
イテラブルとは、要素を一度に1つずつ返すことができるオブジェクト(反復可能オブジェクト)のことです。
具体的には、「リスト・タプル・文字列といった全てのシーケンス型」、「辞書」、「ファイルオブジェクト」などが該当します。
あるオブジェクトがイテラブルかどうか判断したいときは、iter()関数を使ってみてください。
引数として渡したオブジェクトがイテラブルではない場合、TypeError が発生します。
本項では、for 文でよく使用されるイテラブルとその特徴について説明します。
リストによる反復処理
str_list = ["Iwate", "hamburger", "address", "various", "enter", "append", "pandas", "environment", "numpy" ] new = [] for stlist in str_list: new.append(stlist[0]) print(f"{stlist}: {len(stlist)} letters") """出力結果 Iwate: 5 letters hamburger: 9 letters address: 7 letters various: 7 letters enter: 5 letters append: 6 letters pandas: 6 letters environment: 11 letters numpy: 5 letters """ # お遊び print(f"{new[0]} {new[1]}{new[2]}{new[3]}{new[4]} {new[5]} {new[6]}{new[7]}{new[8]}.") """出力結果 I have a pen. """
リストをイテラブルとして使用した場合、要素ごとに反復処理が行われます。
要素が文字列であれば、ある文字列と同じ要素を抽出したり、抽出した文字列の一部を他の部分に使ったりする事ができます。
例えば、glob.glob("folder/*.txt") で取得したテキストファイル一覧から、"_reminder" という文字が入ったファイルだけを取り出したいときなどに使うことができます。
文字列による反復処理
str_row = "TextString" counter = 1 for strow in str_row: print(strow) print(f"残り、{len(str_row)-counter}文字") counter = counter + 1 """出力結果 T 残り、9文字 e 残り、8文字 x 残り、7文字 t 残り、6文字 S 残り、5文字 t 残り、4文字 r 残り、3文字 i 残り、2文字 n 残り、1文字 g 残り、0文字 """
文字列をイテラブルとして使用した場合、1文字ごとに反復処理が行われます。
len()関数を上手く使用すると、現在の反復回数などを知ることができます。
また、文字列から1文字ずつ切り取って使いたい場合などに使用されます。
(リスト内包表記で使うと、1要素=1文字のリストが作成できます。)
辞書による反復処理
dict = {"Lion": "らいおん", "Zebra": "しまうま", "Rabbit": "うさぎ", "Giraffe": "きりん", "Elephant": "ぞう", "Monkey": "さる" } for key, value in dict.items(): print(f"{key} は日本で {value} と呼ばれています。") """出力結果 Lion は日本で らいおん と呼ばれています。 Zebra は日本で しまうま と呼ばれています。 Rabbit は日本で うさぎ と呼ばれています。 Giraffe は日本で きりん と呼ばれています。 Elephant は日本で ぞう と呼ばれています。 Monkey は日本で さる と呼ばれています。 """
辞書をイテラブルとして使用した場合、key ごとに反復処理が行われます。
ただし、上記コードのように items()関数を使用すれば key と value の両方を取得できます。
辞書は {key: value} で構成されています。つまり、1つの要素に2つのリンクしたデータが入っている事になります。
例えば、pandas でCSVファイルからデータを取得する時に、key に項目、value にその列のデータをリスト化したもので辞書を作成すれば、データを整理しやすくなるかもしれません。(実際に、pandas にはそういった関数があります。)
まとめ
この記事では、Pythonにおける for 文の基本的な使い方と、共に使われるイテラブルごとの処理内容の違いについて説明しました。
for 文はイテラブルの構成要素によって、可能な処理が制限されます。
それ故に、自分がやりたい反復処理に適したイテラブルを用意できればスムーズに動いてくれます。
for 文の使い方は一見わかりやすいですが、処理が複雑になってくると組み合わせがわからなくなりやすい構文です。
基本をしっかり押さえた上で様々な処理を実践してみてください。