はじめに
前回は条件分岐で「賢い判断」ができる自動化を学びました。
今回は、自動化の真骨頂ともいえる繰り返し処理について学びます。
想像してみてください:
- 100人の顧客に個別メールを送る
- 1000個のファイル名を変更する
- 毎月の売上データを12ヶ月分集計する
手作業なら気が遠くなりますが、繰り返し処理なら一瞬です!
繰り返しは日常にあふれている
日常生活の繰り返し
私たちの生活は繰り返しだらけです:
歯磨き
歯ブラシに歯磨き粉をつける
↓
すべての歯に対して繰り返し:
上下に10回磨く
次の歯へ移動
↓
口をゆすぐ
買い物
買い物リストを見る
↓
リストの商品すべてに対して繰り返し:
商品を探す
カートに入れる
リストにチェック
↓
レジで会計
皿洗い
シンクの皿すべてに対して繰り返し:
スポンジで洗う
水で流す
水切りかごに置く
↓
シンクを片付ける
繰り返しの特徴
- 同じ動作を何度も実行
- 対象が複数ある
- 終了条件がある
- 効率化の余地が大きい
繰り返し処理の基本形
1. 回数指定の繰り返し
「○回繰り返す」という最もシンプルな形:
10回繰り返す:
メッセージを送信する
実例:リマインダー送信
3回繰り返す:
リマインドメールを送信
24時間待つ
実例:データバックアップ
5回繰り返す:
バックアップを作成
古いバックアップを削除
次の日まで待つ
2. リスト型の繰り返し
「すべての項目に対して繰り返す」:
顧客リストのそれぞれに対して:
メールを送信する
実例:メール一斉送信
メールアドレスリスト:
- tanaka@example.com
- suzuki@example.com
- sato@example.com
それぞれのアドレスに対して:
宛名を差し込む
本文を作成
メールを送信
送信ログを記録
3. 条件型の繰り返し
「○○になるまで繰り返す」:
在庫がなくなるまで繰り返す:
注文を処理する
在庫を1減らす
実例:ファイル処理
フォルダが空になるまで繰り返す:
最初のファイルを取得
ファイルを処理
処理済みフォルダへ移動
繰り返し処理の実践パターン
パターン1:一括データ処理
CSVファイルの処理
CSVファイルを開く
↓
各行に対して繰り返す:
データを読み込む
必要な計算を実行
結果を新しい列に追加
↓
処理済みファイルを保存
具体例:売上データの処理
売上CSV(1000行)の各行に対して:
商品名を取得
単価 × 数量 = 売上額を計算
消費税を計算
合計額を追加
カテゴリーを判定
新しい行として保存
パターン2:ファイル一括処理
画像ファイルのリサイズ
画像フォルダ内のすべてのファイルに対して:
もし拡張子が.jpgまたは.pngなら:
画像を開く
幅800pxにリサイズ
圧縮率80%で保存
元ファイルをバックアップ
ファイル名の一括変更
対象フォルダのすべてのファイルに対して:
現在のファイル名を取得
日付を先頭に追加(例:20240115_)
連番を付与(例:001, 002, 003)
新しいファイル名に変更
変更ログを記録
パターン3:定期的な監視と処理
在庫チェック
すべての商品に対して毎日1回:
現在の在庫数を確認
もし在庫が10個以下なら:
発注リストに追加
担当者に通知
もし在庫が0なら:
緊急発注フラグを立てる
Webサイトで「在庫切れ」表示
システム監視
監視対象サーバーリストに対して5分ごとに:
応答確認(ping)を送信
もし応答がなければ:
3回リトライ
それでも応答がなければ:
アラートメール送信
担当者に電話通知
応答時間を記録
統計情報を更新
パターン4:データ収集と集計
複数サイトからの情報収集
ニュースサイトリストの各サイトに対して:
最新記事を取得
タイトルと概要を抽出
カテゴリーを判定
重要度を評価
データベースに保存
↓
すべて収集後:
カテゴリー別に整理
重要度順にソート
日報として配信
繰り返しと条件分岐の組み合わせ
基本的な組み合わせ
顧客リストの各顧客に対して:
もし誕生月なら:
バースデークーポンを送信
そうでなければ:
通常のお知らせを送信
実践例1:成績処理
学生リスト(100人)の各学生に対して:
テストの点数を取得
もし90点以上なら:
評価 = "A"
特別表彰リストに追加
そうでなければ、もし80点以上なら:
評価 = "B"
そうでなければ、もし70点以上なら:
評価 = "C"
そうでなければ、もし60点以上なら:
評価 = "D"
そうでなければ:
評価 = "F"
補習対象リストに追加
成績表に記録
保護者へ通知メール
実践例2:請求書の一括作成
顧客リストの各顧客に対して:
今月の利用明細を取得
もし利用がゼロなら:
次の顧客へスキップ
請求額を計算
もしVIP顧客なら:
10%割引を適用
そうでなければ、もし利用額が10万円以上なら:
5%割引を適用
請求書PDFを作成
もしメール送付希望なら:
PDFをメール送信
そうでなければ:
印刷リストに追加
組み合わせのコツ
- 繰り返しの中で条件判断
- 条件によって処理をスキップ(continue)
- 条件によって繰り返しを終了(break)
- カウンターを使った制御
ネストした繰り返し(繰り返しの中の繰り返し)
二重ループの例
部署リストの各部署に対して:
その部署の社員リストの各社員に対して:
給与明細を作成
メールで送信
実践例:売上集計表の作成
月リスト(1月〜12月)の各月に対して:
月次レポートを開始
店舗リスト(東京、大阪、名古屋)の各店舗に対して:
その月の売上データを取得
商品カテゴリー別に集計
店舗別小計を計算
全店舗の合計を計算
前年同月比を計算
月次レポートに追加
年間サマリーレポートを作成
実践例:在庫棚卸し
倉庫リスト(A棟、B棟、C棟)の各倉庫に対して:
棚リスト(1〜50)の各棚に対して:
商品リストの各商品に対して:
実在庫を確認
システム在庫と比較
差異があれば記録
棚ごとの集計
倉庫ごとの集計
全体の棚卸し結果レポート作成
差異リストを経理部に送信
繰り返し処理の注意点
1. 無限ループを防ぐ
❌ 危険な例:
残高がある限り繰り返す:
利息を追加(残高は減らない!)
✅ 安全な例:
最大100回まで、残高がある限り繰り返す:
支払いを処理
残高を減らす
2. パフォーマンスを考慮
❌ 非効率な例:
10000件のデータそれぞれに対して:
データベースに接続
1件更新
接続を切断
✅ 効率的な例:
データベースに接続
10000件のデータを100件ずつに分けて:
100件をまとめて更新
接続を切断
3. エラー処理を忘れない
ファイルリストの各ファイルに対して:
try:
ファイルを処理
エラーが発生したら:
エラーログに記録
次のファイルへ続行
(全体を止めない)
4. 進捗を可視化
全1000件の処理:
100件ごとに:
進捗を通知(10%完了、20%完了...)
処理完了後:
処理件数、エラー件数、処理時間を報告
実践演習:メール配信システムの設計
要件
1000人の顧客リストに対して:
- 個別の宛名付きメール送信
- VIP顧客には特別な内容
- エラーがあっても続行
- 配信結果をレポート
設計例
配信開始時刻を記録
成功数 = 0、失敗数 = 0
顧客リスト(1000人)の各顧客に対して:
# 基本情報取得
名前、メールアドレス、会員種別を取得
# 宛名作成
もしVIP会員なら:
宛名 = "【VIP】" + 名前 + "様"
本文 = VIP向けテンプレート
そうでなければ:
宛名 = 名前 + "様"
本文 = 通常テンプレート
# メール送信
try:
メールを送信
成功数 += 1
送信ログに記録
エラーが発生したら:
失敗数 += 1
エラーログに記録
# 進捗報告
もし処理数が100の倍数なら:
進捗を管理者に通知
# 最終レポート
配信完了時刻を記録
レポート作成:
- 総配信数:1000
- 成功:[成功数]
- 失敗:[失敗数]
- 処理時間:[完了時刻 - 開始時刻]
管理者にレポート送信
今日のまとめ
繰り返し処理の極意
- 同じ処理を自動で何度でも実行
- 1件でも1万件でも同じ労力
- 条件分岐と組み合わせて賢く処理
- エラー処理で安全に
- 人間には不可能な作業も可能に
次回予告
次のレッスンでは、「並列処理とシーケンス処理:効率的な処理の流れ」を学びます。
- 複数の処理を同時に実行する方法
- 順番が重要な処理の扱い方
- 処理時間を大幅に短縮するテクニック
- 依存関係の管理
繰り返し処理と並列処理を組み合わせれば、処理速度が飛躍的に向上します!
チャレンジ問題
問題1:繰り返しの種類を選ぼう
以下の処理に最適な繰り返しの種類を選んでください:
- 毎月1日に売上集計を行う
- フォルダ内のすべての画像を圧縮
- 在庫がなくなるまで注文を受け付ける
- 新規登録者100人にウェルカムメール送信
答えを見る
- 回数指定(12回繰り返す)または条件型(1年間繰り返す)
- リスト型(すべての画像ファイルに対して)
- 条件型(在庫 > 0 の間繰り返す)
- リスト型(新規登録者リストの各人に対して)
問題2:処理フローを設計しよう
「複数のExcelファイルから特定のデータを抽出して、1つのファイルにまとめる」処理を設計してください。
設計例を見る
# 準備
結果ファイルを新規作成
ヘッダー行を書き込む
# メイン処理
対象フォルダのすべてのファイルに対して:
もし拡張子が.xlsxなら:
ファイルを開く
シート「売上データ」が存在するか確認
もし存在するなら:
A列〜D列のデータを読み込む
各行に対して:
もし日付が今月なら:
ファイル名を追加
結果ファイルに書き込む
ファイルを閉じる
処理済みファイル数をカウント
# 完了処理
結果ファイルを保存
処理結果を通知:
- 処理ファイル数
- 抽出データ件数
- 処理時間
問題3:エラーに強い設計
「1000件のWebサイトから情報を収集する」処理で、一部のサイトがエラーになっても継続する設計を考えてください。
解答例を見る
# 初期設定
成功数 = 0
失敗数 = 0
失敗リスト = []
最大リトライ回数 = 3
# メイン処理
WebサイトリストURLそれぞれに対して:
リトライ回数 = 0
成功 = False
成功するかリトライ上限まで繰り返す:
try:
サイトにアクセス
情報を取得
データベースに保存
成功 = True
成功数 += 1
break(ループを抜ける)
エラーが発生したら:
リトライ回数 += 1
もしリトライ回数 < 最大リトライ回数なら:
5秒待機
そうでなければ:
失敗リスト.append(URL)
失敗数 += 1
break
# 進捗報告(100件ごと)
もし (成功数 + 失敗数) % 100 == 0 なら:
進捗を通知
# 結果レポート
レポート作成:
- 総URL数:1000
- 成功:[成功数]
- 失敗:[失敗数]
- 失敗URL一覧:[失敗リスト]
もし失敗数 > 0 なら:
失敗URLを再処理リストとして保存
繰り返し処理をマスターすれば、大量のデータも恐れることはありません。次回も楽しみにしていてください!