Python速習ガイド - ステップ2 制御フロー (3) - ループ (1)
- 本講座は、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点以上)と不合格者の人数
-
出力は見やすく整形してください