第9章 繰り返し処理
9.2 for文
ループのパターンには、繰り返しの回数をあらかじめ決定できる場合と、決定できない場合の2通りがあります。
for文は、主にループ回数が「決まっている」場合に使用します。
またfor文は、PHPやC#におけるforeach文のように、配列データの数だけ繰り返す処理を行う仕組みになっています。
9.2.1 for文の基本構文
for文はリストや辞書など複数の要素を含むイテラブルオブジェクトから、それぞれの要素を順番に取り出して処理するための構文です。
一つの処理が終わると、次の要素の処理が始まり、全ての要素の処理が完了したタイミングで、for文は完了します。
要素は配列に入っている各データのことを指しており、繰り返す回数は配列に格納されているデータの数になります。
※イテラブルオブジェクトとは:要素を一つずつ取り出し返すのに対応しているオブジェクト。複数の要素が含まれているリストや辞書などが用いられる。
書式:for基本構文
凡例
実行結果
以上、構文と基本的な凡例になります。イテラブルオブジェクト(凡例ではnames)から順次取り出される要素の値をfor文内で宣言した変数(凡例ではname)に代入し、一つの処理が終わると、次の要素の値を代入します。
if文と同様、処理内のインデントは揃える必要があるので、気を付けてください。
凡例をイメージで表すと以下の図10.3.1のようになります。
図 9.2.1.1: for文のデータ取り出し
9.2.2 for文を使用し同一処理を繰り返すプログラム
続いて各要素で異なるメッセージを複数回表示させるプログラムを、for文を用いて作成ましょう。
ソース・フォルダ:/Desktop/Python入門テキスト
ファイル名 :第9章.ipynb
アクセスURL :http://localhost:8888/notebooks/Desktop/Python入門テキスト/第9章.ipynb
➢ 第9章.ipynb/ 9.2.2 for文を使用し同一処理を繰り返すプログラム
addresses = [‘神田’, ‘東京’, ‘自由が丘’, ‘田園調布’ ] for address in addresses : print(‘最寄り駅は’ + address + ‘です。’)
実行結果
解説
3行目でfor文で使用するリスト型の変数addressesを宣言しています。左から順番に0番を起点にインデックス番号が割り振られています。
図 9.2.2.1: addressesのデータ格納状況
5、6行目がfor文になります。6行目ではループごとの要素の値が、addressに代入された状態で「’最寄り駅は●●です。」が出力されます。
また、メッセージ部分を処理別に分けると以下の図のようになります。
図 9.2.2.2: for文の実行結果イメージ
9.2.3 辞書型変数におけるfor文の書き方
リストと同様、辞書を使ってfor文を表すこともできます。辞書の場合、インデックス番号の代わりにキー名を指定するため、各要素のキー名と値の、どちらの一覧を取り出すかで、構文の書き方が異なります。
1. キーだけを取得する場合
まずキー名の一覧だけ取得する構文を確認していきましょう。辞書の中の、キーの一覧だけを取得する場合、keys()メソッドを使用します。
書式:keys()メソッドの基本構文
この構文で辞書に含まれるキーの一覧を取得できます。
凡例
実行結果
取得した一覧は、dict_keys 型と呼ばれる辞書のキー一覧を取得する時の特有のデータ型として取得されます。
図 9.2.3.1:辞書.keys()のイメージ図
書式:キー名取得時のfor基本構文
「辞書.keys()」で取得したキー一覧は、そのままfor文を介して一つ一つ要素を取り出し、処理を行うことができます。
凡例
stations = { ‘kanda’ : ’神田’, ’tokyo’: ‘東京’ ,‘shinjuku’ : ’新宿’ } for station in stations.keys: print(‘最寄り駅は’ + station + ‘です。’)
実行結果
以上、構文と基本的な凡例になります。for文で取り出す要素であるイテラブルオブジェクト(凡例ではstations.keys())には、辞書内のキー一覧が取得された「辞書.keys()」を置きます。
それぞれのキーは順次取り出され、for文内で宣言した変数(凡例ではstation)に代入し、一つの処理が終わると、次の要素の値を代入します。
凡例をイメージで表すと以下の図のようになります。
図 9.2.3.2: 辞書.keys()からのデータ取り出し
2. 値だけを取得する場合
続いて辞書の値の一覧だけ取得するための構文を確認していきましょう。辞書の中の、値の一覧だけを取得する場合、values()メソッドを使用します。
書式:values()メソッドの基本構文
この構文で辞書に含まれる値の一覧を取得できます。
凡例
実行結果
取得した一覧は、dict_values 型と呼ばれる辞書の値の一覧を取得する時の特有のデータ型として取得されます。
図 9.2.3.3:辞書.values()のイメージ図
書式:値取得時のfor基本構文
「辞書.values()」で取得したキー一覧は、そのままfor文を介して一つ一つ要素を取り出し、処理を行うことができます。
凡例
stations = { ‘kanda’ : ’神田’, ’tokyo’: ‘東京’ ,‘shinjuku’ : ’新宿’ } for station in stations.values(): print(‘最寄り駅は’ + station + ‘です。’)
実行結果
以上、構文と基本的な凡例になります。for文で取り出す要素であるイテラブルオブジェクト(凡例ではstations.values())には、辞書内の要素の値の一覧が取得された「辞書.values()」を置きます。
それぞれのキーは順次取り出され、for文内で宣言した変数(凡例ではstation)に代入し、一つの処理が終わると、次の要素の値を代入します。
凡例をイメージで表すと以下の図のようになります。
図 9.2.3.4: 辞書.values()からのデータ取り出し
3. キーと値の両方を取得する場合
最後に辞書の各要素のキーと値の両方が含まれた一覧を、取得するための構文を確認していきましょう。辞書の中の、キーと値それぞれを取得するためにはitems()メソッドを使用します。
書式:values()メソッドの基本構文
この構文で辞書に含まれる「(キー名,値)」の一覧を取得できます。「辞書.items」で取得した各要素は、タプルのリストとして「(キー名, 値)」が格納されます。
凡例
実行結果
取得した一覧は、dict_values 型と呼ばれる辞書の値の一覧を取得する時の特有のデータ型として取得されます。
図 9.2.3.5:辞書.items()のイメージ図
書式:キー/値の取得時のfor基本構文
「辞書.items()」で取得したキー、値の一覧は、for文を介して一つ一つ要素を取り出すことができますが、各要素には「(キー、値)」と二つの要素が含まれているため、二つの変数をfor文内で宣言する必要があります。
各要素の処理ごとに、左側の変数にはキー、右側の変数には値が格納されます。
凡例
実行結果
以上、構文と基本的な凡例になります。for文で取り出す要素であるイテラブルオブジェクト(凡例ではstations.items())には、辞書内の要素のキー名と値の両方が格納されたタプルの一覧が取得された「辞書.items()」を置きます。
それぞれの要素は順次取り出され、for文内で宣言した二つの変数(凡例ではstation1、station2)に代入し、一つの処理が終わると、次の要素の値を代入します。
凡例をイメージで表すと以下の図のようになります。
図 9.2.3.6: 辞書.values()からのデータ取り出し
9.2.4 for文を使用し同一処理を繰り返すプログラム
ソース・フォルダ:/Desktop/Python入門テキスト
ファイル名 :第9章.ipynb
アクセスURL :http://localhost:8888/notebooks/Desktop/Python入門テキスト/第9章.ipynb
➢ 第9章.ipynb/ 9.2.2 for文を使用し同一処理を繰り返すプログラム
#辞書型変数addressesの宣言 addresses ={ ‘田中太郎’:‘東京都 新宿区 xxx-xxx-xxx’, ‘鈴木次郎’:‘神奈川県 横浜市 xxx-xxx-xxx’, ‘佐藤三郎’: ‘東京都 中野区 xxx-xxx-xxx’ } for name, address in addresses.items() : print( name +‘さんの最寄り駅は’ + address + ‘です。’)
実行結果
解説
3~7行目でfor文で使用するリスト型の変数addressesを宣言しています。左から順番に0番を起点にインデックス番号が割り振られています。
図 9.2.4.1: addressesのデータ格納状況
10、11行目がfor文になります。11行目のstation1、station2には各要素のキーと値が代入された状態で「’〇〇さんの最寄り駅は●●です。」が出力されます。
また、表と使うと以下のようなイメージになります。
9.2.5 n回繰り返す方法
書式
構文内で使用されているrange()とは、連続した数字のオブジェクトを作るための関数です。引数に指定した数だけ要素を持ち、例えばnを指定した場合、「0, 1, 2, 3, … , n−1」の要素を持ちます。
例えばrange(10) とした場合には 「0 1 2 3 4 5 6 7 8 9」 の 10 個の要素を持つということです。
for 文では要素を 1 つずつ取り出しながら繰り返し処理を行うので、結果として先ほどの for 文では n 回繰り返されることになります。
凡例
実行結果
このfor文におけるイテラブルオブジェクト(凡例ではrange(4))には、「0, 1, 2, 3,」の各要素が含まれています。
順次取り出される要素の値をfor文内で宣言した変数(凡例ではnum)に代入し、一つの処理が終わると、次の要素の値を代入します。
凡例をイメージで表すと以下の図のようになります
図 9.2.5.1: rangeを用いてfor文のデータ取り出し
1. 数値の範囲を変更する
range(n)には、「0からn-1」までの各数字が含まれるが、格納される数字の範囲を変更することも可能です。
書式
範囲を指定する場合は、上記のようにrange内に引数となる数字を二つ指定し、range(n1,n2)には、n1からn2−1までの要素が含まれます。
例えばrange(4,9)の場合、4から(9 −1)までの数字が含まれるため、「4,5,6,7,8」までの要素を持つということです。
凡例
実行結果
このfor文におけるイテラブルオブジェクト(凡例ではrange(4,8))には、「4, 5, 6, 7,」の各要素が含まれています。
順次取り出される要素の値をfor文内で宣言した変数(凡例ではnum)に代入し、一つの処理が終わると、次の要素の値を代入します。
凡例をイメージで表すと以下の図のようになります。
図 9.2.5.2: rangeを用いてfor文のデータ取り出し
2. 数値の増分を変更する
格納される数字の範囲と同時に、数値の増分を指定することもできます。
書式
増分を指定する場合は、上記のようにrange内に3つ目の引数を指定します。3つ目に指定した引数が、増値分になるため、例えばrange(4,11,2)の場合、「4, 6 ,8, 10」までの要素を持つということです。
凡例
実行結果
このfor文におけるイテラブルオブジェクト(凡例ではrange(4,11,2))には、「4, 6 ,8, 10」の各要素が含まれています。
順次取り出される要素の値をfor文内で宣言した変数(凡例ではnum)に代入し、一つの処理が終わると、次の要素の値を代入します。
凡例をイメージで表すと以下の図のようになります
図 9.2.5.3: 増値分を指定したrangeを用いたfor文のデータ取り出し
ポイント・for文は要素を複数含めたオブジェクト(リストや辞書、range関数)などを介して要素を一つずつ取り出した処理を行うのに適している。