Pythonインタラクティブガイド - ステップ2 制御フロー (3) - ループ (1): for文
- 本講座「Pythonインタラクティブガイド」は、手を動かしながらPythonプログラミングの基礎を学べる実践的な入門講座です。
- 「スタイルガイド」では、Pythonで読みやすくきれいなコードを書くためのガイドライン(PEP8)を主に紹介しています。
- 各コード例はその場で実行して結果を確認できます。
ページ再読み込みで元に戻るので、自由に試してみてください。
「ステップ2 制御フロー」の続きです。
2.2. ループ
ループ(繰り返し)は、同じ処理を複数回実行するための制御フローです。
Pythonには主に2種類のループがあります:
for文:リストなどの各要素に対して処理を繰り返すwhile文:条件がTrueである限り処理を繰り返す
2.2.1. for文
for文の基本
for文は、リストなどのイテラブル(繰り返し可能)なオブジェクトの各要素に対して、順番に処理を実行します。
for fruit in fruitsの行で、fruitsリスト内の各要素が順番にfruit変数に代入されます- その下のインデントされたブロックが、
fruitsの要素ごとに繰り返し実行されます
flowchart TD
START[開始] --> INIT["fruits = ['apple', 'banana', 'orange']"]
INIT --> FOR{"for fruit in fruits"}
FOR -->|次の要素がない| END["ループ終了"]
FOR -->|次の要素がある| LOOP_BODY["ループ処理\n(print(fruit))"]
LOOP_BODY --> FOR
linkStyle 2 stroke:red,stroke-width:2px;
linkStyle 3 stroke:green,stroke-width:2px;
fruitsの各要素の文字数を出力し、最後に合計の文字数を出力しましょう。
(文字列の長さは、リストと同様にlen関数で取得できます)
解答例
イテラブルとは
for文などの繰り返し処理の対象となるオブジェクトのことを イテラブル といいます。
Pythonでは以下のようなオブジェクトがイテラブルとして扱われます:
- リスト:
["apple", "banana", "orange"] - タプル:
(1, 2, 3) - 集合:
{1, 2, 3} - 辞書:
{"name": "Alice", "age": 25} - 文字列:
"Python" range関数の戻り値:range(5)
リスト・タプル・集合
辞書
辞書もイテラブルなオブジェクトであり、for文で使用するとキーの一覧を返します。
また、辞書の以下メソッドもイテラブルなオブジェクトを出力します:
.keys()メソッド: キー一覧を出力する.values()メソッド: 値一覧を出力する.items()メソッド: キーと値のペアの一覧を出力する
- 上記の
.items()メソッドの例では、アンパックを使用して、
キーと値のペアをkeyとvalueに分解して処理を行っています。
文字列
文字列もイテラブルなオブジェクトの一種です。
for文で使用すると、1文字ごとの処理を行うことができます。
range関数
range関数を使用すると、指定範囲の数値を順に生成することができます。
range関数は、リストのスライスと類似した以下のような複数の使い方があります:
| 使い方 | 機能 |
|---|---|
range(stop) |
0 ~ (stop - 1) の整数を順に生成する |
range(start, stop) |
start ~ (stop - 1) の整数を順に生成する |
range(start, stop, step) |
start ~ (stop - 1) の step 間隔の整数を順に生成する |
range(stop): 0 ~ (stop - 1) の整数を順に生成する
range(start, stop): start ~ (stop - 1) の整数を順に生成する
range(start, stop, step): start ~ (stop - 1) の step 間隔の整数を順に生成する
スライスと同様に、stepにマイナスの数を指定すると逆順に生成します。
range関数は数値のリストを作成するのではなく、必要に応じて値を生成する「遅延評価」のオブジェクトを返します。そのため、大きな範囲の数値を扱う場合でもメモリ使用量を抑えることができます。
1から10までの数値を出力するプログラムをfor文とrange関数を使って作成しましょう。
解答例
以下のような九九表を出力しましょう。
(ヒント: for文を入れ子(ネスト)にします)
1 x 1 = 1
1 x 2 = 2
...
9 x 9 = 81
解答例
ループ制御文
break: ループの中断
break文を使うと、ループの途中で処理を中断して、ループから抜け出すことができます。
この例では、fruitsリストを順に処理していますが、「banana」を見つけた時点でbreak文によりループが中断されます。そのため、「orange」以降の要素は処理されません。
flowchart TD
START[開始] --> INIT["fruits = ['apple', 'banana', 'orange', 'grape', 'melon']"]
INIT --> FOR{"for fruit in fruits"}
FOR -->|次の要素がない| END["ループ終了"]
FOR -->|次の要素がある| ELEMENT_PROCESS
subgraph ELEMENT_PROCESS[ループ処理]
LOOP_START["ループ開始"] --> CHECK{"if fruit == 'banana'"}
CHECK -->|No| NEXT["次の処理へ"]
CHECK -->|Yes| BREAK["break\n(ループ中断)"]
end
NEXT --> FOR
BREAK --> END
style BREAK fill:#ffeb3b,stroke:#333,stroke-width:2px
linkStyle 2 stroke:red,stroke-width:2px;
linkStyle 3 stroke:green,stroke-width:2px;
linkStyle 5 stroke:red,stroke-width:2px;
linkStyle 6 stroke:green,stroke-width:2px;
リスト内の偶数を見つけたらその数値を出力して処理を中断するプログラムを作成しましょう。
- リスト
numbers = [15, 7, 3, 9, 4, 11, 2]を用意する - リスト内の各値を順に確認し、最初に見つけた偶数を表示する
- 偶数を見つけたらループを中断する
解答例
次に、偶数が存在しない場合には「偶数が存在しません」と表示するように改良しましょう。
(ヒント: 偶数が存在する場合にTrue、そうでない場合にFalseとなる変数を用意しましょう。)
解答例
continue: ループのスキップ
continue文は、現在のループ処理の残りをスキップし、次の繰り返しに進むための制御フロー文です。
breakがループ全体を終了するのに対し、continueは現在の1回分の繰り返しだけをスキップします。
この例では、リスト内の各数値をチェックし、偶数である場合はcontinue文で処理をスキップしています。そのため、奇数のみが表示されます。
flowchart TD
START[開始] --> INIT["numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"]
INIT --> FOR{"for num in numbers"}
FOR -->|次の要素がない| END["ループ終了"]
FOR -->|次の要素がある| ELEMENT_PROCESS
subgraph ELEMENT_PROCESS[ループ処理]
LOOP_START["ループ開始"] --> CHECK{"if num % 2 == 0"}
CHECK -->|No| NEXT["次の処理へ\n(print(f'数値: {num}'))"]
CHECK -->|Yes| CONTINUE["continue\n(次のループへ)"]
end
NEXT --> FOR
CONTINUE --> FOR
style CONTINUE fill:#80deea,stroke:#333,stroke-width:2px
linkStyle 2 stroke:red,stroke-width:2px;
linkStyle 3 stroke:green,stroke-width:2px;
linkStyle 5 stroke:red,stroke-width:2px;
linkStyle 6 stroke:green,stroke-width:2px;
break と continue の違い
| キーワード | 機能 | 対象 |
|---|---|---|
break |
ループを完全に終了する | ループ全体 |
continue |
現在の繰り返しをスキップして次へ進む | 現在の繰り返し |
1から20までの数値の中で、3の倍数でも5の倍数でもない数値だけを出力するプログラムをcontinue文を使用して作成しましょう。
解答例
ネストしたループ内の break と continue
ループをネスト(入れ子)にした場合、break と continue の動作は以下の通りです:
break文は、それを含む最も内側のループのみを終了しますcontinue文は、それを含む最も内側のループの現在の繰り返しだけをスキップします
3 x ? または ? x 3 のパターンを除外した九九表を作成しましょう。
解答例
for文の応用
enumerate関数:インデックス付きループ
enumerate関数は、イテラブルの各要素に対して、インデックス(位置)と値のペアを取得できます。
インデックスの開始値を変更することもできます:
zip関数:複数のイテラブルを同時に処理
zip関数は、複数のイテラブルを同時にループ処理する際に便利です。
(for文のネストと異なり、同じ位置のペアのみが必要な場合に使用します)
zipは最も短いイテラブルが終わると停止することに注意してください。
for-else文
forループにelse節を追加することができます。elseブロックは、ループが正常に終了した場合(breakで中断されなかった場合)に実行されます。
上記のように、for-else文を使用すると、リスト内の要素を検索して見つからなかった場合の処理を簡潔に書けます。
break文で扱った下記の練習問題を、for-else文を使ってフラグ変数を使用しないコードに書き換えましょう。
- リスト
numbers = [15, 7, 3, 9, 5, 11, 3]を用意する - リスト内の各値を順に確認し、最初に見つけた偶数を表示する
- 偶数を見つけたらループを中断する
- 偶数が存在しない場合は「偶数が存在しません」と出力する
解答例
for文まとめ
for文はイテラブル(リスト、文字列、タプル、辞書など)の各要素に対して繰り返し処理を行うrange関数を使うと、指定範囲の数値で繰り返し処理ができるbreak文でループの中断、continue文でループのスキップができるenumerate関数を使うとインデックスと要素を同時に取得できるzip関数を使うと複数のイテラブルを並行して処理できるfor-else構文を使うと、ループが正常に完了した場合(中断しなかった場合)の処理を記述できる
次の要件を満たす、学生の成績データを処理するプログラムを作成しましょう:
-
以下の学生成績データを使用します:
students = [ {"name": "田中", "score": 85}, {"name": "鈴木", "score": 72}, {"name": "佐藤", "score": 93}, {"name": "伊藤", "score": 68}, {"name": "高橋", "score": 76} ] -
次の情報を計算して表示してください:
- 全生徒の平均点
- 最高得点と、その生徒の名前
- 80点以上の生徒のリスト(「名前: 得点」の形式)
- 合格者(70点以上)と不合格者の人数
-
出力は見やすく整形してください