Pythonの基礎知識(基礎編)

【Pythonの基礎知識】関数で処理を再利用する|“人間の手順”を仕組みに変える

プログラミングを進める中で「同じ処理を何度も書いてしまっている」「手作業的な手順が多く、コードが散らかってきた」と感じたことはありませんか。

そんなときに活躍するのが、Pythonにおける“関数”という仕組みです。

関数を活用することで、人が手で行っていた一連の手順を、名前を付けて呼び出せる再利用可能な部品に変えることができます。

公式ドキュメントでも「関数は特定のタスクを実行するための再利用可能なコードブロック」だと説明されています。

関数が必要になる動機から定義・呼び出しの基本、そして“人間の手順”を“仕組み”に落とし込む設計視点まで、実体験を交えてわかりやすく解説します。

Pythonの基礎知識(基礎編)


🟣 Pythonの基礎知識(基礎編)
📌基本文法から実用テクニックまで、Pythonの土台を固めるステップアップ講座
└─ 【Pythonの基礎知識(基礎編)】仕組みから学ぶ思考と自動化のプログラミング講座
  ├─ STEP 0:Pythonを動かす“仕組み”を理解する
  | ├─【Pythonの基礎知識】Pythonを動かす環境とは何か? “自分専用の環境”を作る
  | ├─【Pythonの基礎知識】Hello Worldの裏側にある実行の仕組み
  | └─【Pythonの基礎知識】Pythonのファイル構造と実行パスを理解する
  |
  ├─STEP 1:Pythonで“考える仕組み”を作る(思考編)
  | ├─【Pythonの基礎知識】データ型で世界を定義する|数・文字・真偽の正体
  | ├─【Pythonの基礎知識】変数と値の動きを通して仕組みを理解しよう
  | ├─【Pythonの基礎知識】条件分岐で“判断を任せる”仕組みを作る
  | ├─【Pythonの基礎知識】for文で“人の手”を離す仕組みを作る
  | └─【Pythonの基礎知識】while文で“継続する仕組み”を作る
  |
  ├─STEP 2:Pythonで“情報を扱う仕組み”を作る(構造編)
  | ├─【Pythonの基礎知識】コレクション型の正しい選び方(list, tuple, dict, set)
  | ├─【Pythonの基礎知識】リストで情報を整理し、仕組みに流れを持たせる
  | ├─【Pythonの基礎知識】辞書型でデータを“意味”で管理する
  | └─【Pythonの基礎知識】集合型で重複を排除し、無駄をなくす仕組みを作る
  |
  ├─STEP 3:Pythonで“動きを再利用する仕組み”を作る(関数・モジュール編)
  | ├─【Pythonの基礎知識】関数で処理を再利用する|“人間の手順”を仕組みに変える
  | ├─【Pythonの基礎知識】引数と戻り値で“情報のやりとり”を自動化する
  | ├─【Pythonの基礎知識】モジュールとパッケージで“仕組みを部品化”する
  | └─【Pythonの基礎知識】importの裏側を理解し、コードを分離する設計思考
  |
  ├─STEP 4:Pythonで“データを扱う仕組み”を作る(入出力・永続化編)
  | ├─【Pythonの基礎知識】ファイル操作でデータを読み書きする仕組みを作る
  | ├─【Pythonの基礎知識】CSVを自在に扱う仕組みを作る
  | ├─【Pythonの基礎知識】JSONで構造化データを操る
  | └─【Pythonの基礎知識】例外処理で“壊れない仕組み”を設計する
  |
  └─STEP 5:Pythonで“自動化する仕組み”を作る(応用実践編)
    ├─【Pythonの基礎知識】スクリプトを自動実行させる仕組みを作る
    ├─【Pythonの基礎知識】日次タスクを自動化して人の時間を解放する
    ├─【Pythonの基礎知識】外部APIを活用して作業を外部化する
    └─【Pythonの基礎知識】ログを記録して仕組みの信頼性を高める

関数が必要となる“手作業的”プロセスの罠

プログラムを書いていると、同じような処理を何度もコピペしている自分に気づくことがあります。

最初は小さな繰り返しでも、プロジェクトが大きくなるほど修正や管理が難しくなっていきます。

こうした“手作業的”なプロセスは、エラーの温床となり、時間を奪う原因にもなります。

関数は、こうした問題を抜本的に解消する「再利用の仕組み」です。

手作業で繰り返していた処理の問題点

日々の開発で、同じ数値計算やファイル処理を何度も書いていませんか。

たとえばログ出力の形式を整えるだけでも、手作業で毎回同じ記述をしていると、修正時にすべて書き換える必要が出てきます。

これは「重複コード」と呼ばれ、保守コストを増やす代表例です。

同じ処理を何度もコピペしてるけど、これって悪いことなの?

修正は後でまとめてやればいい気もするけど…

その考え方が、後になって大きな負担になります。

人間の「やればできる」という感覚に頼ると、後からミスが生まれます。

コードの重複は「どこを修正すべきか」がわかりにくくなり、同じバグを複数箇所で修正する羽目になります。

開発速度が遅くなるだけでなく、テストにも時間がかかります。

これこそが、関数を使わないことによる最大の損失です。

関数化による処理の再利用という解決策

同じ処理を一箇所にまとめ、名前を付けて呼び出せるようにした仕組みが「関数」です。

たとえば、計算処理を関数化すると、再利用も修正も一度で済みます。

def calc_total(price, tax):
    return price + (price * tax)

total = calc_total(1200, 0.1)
print(total)

【出力例:】

1320.0

このように、一度定義すれば何度でも呼び出せます。

関数を活用すれば、処理内容を変更したいときも関数本体を修正するだけで済み、全体の整合性を保てます。

人が手を動かす範囲を減らすほど、エラーの発生率も下がっていきます。

これって、他のスクリプトでも使えるようになるの?
そうです。同じ処理を複数の場所で使いたいとき、関数として定義しておけば再利用が可能になります。

さらに、関数名を見ただけで処理の意図を理解できるため、チーム開発における可読性も向上します。

複雑な処理ほど、関数に分解することで見通しがよくなります。

実体験:毎日同じ処理を手でやっていた時の気づき

筆者がかつて運用していたログ収集スクリプトでは、毎朝サーバーのログを圧縮し、特定ディレクトリにコピーする作業を手で行っていました。

作業自体は5分程度ですが、1年間で考えると30時間以上の手間になります。

このとき、圧縮・コピー処理を関数化することで作業を完全に自動化しました。

def archive_log(src, dst):
    import shutil, datetime
    date = datetime.date.today().strftime("%Y%m%d")
    shutil.make_archive(f"{dst}/log_{date}", "zip", src)

【出力例:】

log_20251031.zip

最初は自動化なんて面倒そうに感じてたけど、実際にやってみたら想像以上に快適だったんだ。
そうですね。関数化は単なるコード整理ではなく、「自分の時間を取り戻す仕組み化」です。

この経験から得た教訓は、「毎日同じことをしているなら、それは人間の手でやるべきではない」ということでした。

関数化は、自分の作業を“仕組み”に変える第一歩です。

Pythonで関数を定義・呼び出す基本構文

関数を使うことで、同じ処理を繰り返し書かなくても済むようになります。

コードが整理され、変更にも強くなるのが最大のメリットです。

Pythonでは、 defを使って関数を定義し、必要なときに呼び出すだけで簡単に再利用できます。

ここでは、構文の流れと、よくある落とし穴を実例で確認していきます。

defによる関数定義と呼び出しの流れ

Pythonで関数を定義するには、 def(define)を使います。

定義した関数は、名前を呼び出すだけで何度でも実行できます。

たとえば、2つの数を足す関数を定義する場合は次のようになります。

def add(a, b):
    return a + b

result = add(5, 7)
print(result)

【出力例:】

12

このように、一度定義すれば何度でも呼び出せます。

関数名は処理の内容をわかりやすく表すように命名するのがポイントです。

returnって何をしてるの?

出力するのにprintだけじゃダメなの?

returnは「値を戻す」ための命令です。printは画面に表示するだけですが、returnを使えばその値を他の処理で再利用できます。

関数を使うと、「結果を次の処理に渡す」ことができるようになります。

これにより、コードが一気に“流れを持つ”ようになり、複雑な処理でも整理しやすくなります。

変数・引数・戻り値の簡単な説明

関数の内部では「変数」、外部から受け取る値は「引数」、外に返す値は「戻り値」と呼ばれます。

これらの関係を整理すると次のようになります。

要素役割
引数関数が受け取る値a, b
処理関数内で行う計算や動作a + b
戻り値処理結果を関数外へ返すreturn a + b

この仕組みにより、同じ関数をさまざまな入力に使えるようになります。

つまり、考え方次第で「万能な仕組み」に変わるのです。

実体験:定義・呼び出しのミスでハマった罠

関数を使い始めた頃、多くの人がつまずくのが「定義と呼び出しの順番」です。

筆者も初期の頃、呼び出しを先に書いてエラーを出したことがありました。

result = add(3, 4)

def add(a, b):
    return a + b

【出力例:】

NameError: name 'add' is not defined

Pythonは上から順に処理を読むため、関数が定義される前に呼び出すと認識できずエラーになります。

関数を使って“人間の手順”を仕組みに変える設計視点

関数を使う目的は、単に「再利用」だけではありません。

人が毎回考えて行っていた手順を、論理的な仕組みとしてコード化することにあります。

つまり関数とは、「人間の思考をプログラムに置き換える構造」です。

ここでは、手順をどう切り出し、どう設計すれば長く使える“仕組み”になるのかを整理します。

“手順=処理”を関数に切り出すための考え方

多くの初心者は、「どの処理を関数にするべきか」で迷います。

実は、その判断基準はとてもシンプルです。それは「人が毎回同じ手順を繰り返している箇所」です。

同じような処理はあるけど、関数にすると逆に複雑になりそうなんだよな…
実はその“繰り返し”が一番の無駄なんです。関数にまとめれば、動作の意味を一度整理するだけで済みます。

たとえば、ログを整形して出力する処理がある場合、毎回print文を並べて書くよりも、関数にしておくほうが圧倒的に効率的です。

def log_message(level, message):
    print(f"[{level}] {message}")

log_message("INFO", "バックアップ処理を開始します")
log_message("ERROR", "接続に失敗しました")

【出力例:】

[INFO] バックアップ処理を開始します
[ERROR] 接続に失敗しました

このように定義すれば、ログの出力形式を後から変更する場合も、関数内の1行を修正するだけで全体に反映されます。

手作業的な修正をなくすことこそ、関数化の真のメリットです。

汎用性を意識した関数設計のポイント

関数を長く使える形にするには、「汎用性」と「意味の一貫性」を意識することが重要です。

つまり「何を目的とする関数なのか」を明確にし、引数や戻り値に余計な依存を持たせないことです。

汎用的って言われても、どこまでを想定すればいいか分からないな…
たとえば“出力先”だけを変えたいなら、関数内のロジックに依存させず、外からパラメータで指定できるようにすればいいんです。

たとえば、ログの出力先をファイルに変える場合も、関数を少し拡張するだけで柔軟に対応できます。

def log_message(level, message, output="console"):
    if output == "console":
        print(f"[{level}] {message}")
    elif output == "file":
        with open("system.log", "a") as f:
            f.write(f"[{level}] {message}\\n")

【出力例:】

[INFO] バックアップ処理を開始します

設計要素目的ポイント
引数柔軟な指定を可能にする固定値を避ける
戻り値結果を他の関数で再利用値の型を明確にする
命名関数の目的を一目で伝える動詞+目的語を意識する

このように設計段階で「どの部分を変える可能性があるか」を考えておけば、あとから修正が必要になっても最小限で済みます。

実体験:使い回せる関数を書いたことで得たメリット

筆者が以前、データをCSVにまとめる処理を書いていたとき、最初は案件ごとにスクリプトを分けていました。

しかし途中で仕様変更が発生し、全スクリプトの修正が必要になってしまいました。

そこで、共通処理を関数にまとめたところ、その後の変更は関数1か所を直すだけで完了しました。

def export_csv(data, filename):
    import csv
    with open(filename, "w", newline="") as f:
        writer = csv.writer(f)
        writer.writerows(data)

【出力例:】

data_export_20251031.csv

関数にまとめたことで、修正も検証も一瞬で済むようになったんだね。
そうです。これこそが“仕組み化”の本質です。関数は作業を減らすだけでなく、思考も軽くしてくれます。

関数設計の目的は、「将来の変更を最小限に抑えること」です。一度考えて形にしておけば、同じ課題に何度も悩む必要はありません。

それが、関数を使って人間の手順を仕組みに変える最大の価値です。

関数活用で得られる運用上の恩恵と注意点

関数を使う最大の魅力は、「一度考えた仕組みを何度でも使えること」です。

人の手で繰り返していた作業を一度コードに落とし込めば、次回以降は呼び出すだけで同じ処理を再現できます。

これは、効率化の枠を超えて「運用を仕組みで支える思考法」へと変わるポイントでもあります。

ここでは、関数を使うことで得られる実際的な恩恵と、注意すべき落とし穴を整理します。

保守性・再利用性・チームでの共有というメリット

関数化の大きな利点は、コードを一箇所にまとめて管理できる点です。

処理が増えても、修正すべき箇所が明確になるため、保守性が格段に上がります。

また、他の開発者が見てもすぐに理解できる構造になるため、チームでの共有にも向いています。

チームで使うコードって、どうしても人によって書き方が違ってバラバラになっちゃうんだよね。
関数を使って命名や処理を統一しておけば、コードの“共通言語”になります。読みやすく、修正もしやすくなります。

次の例は、データベースへの接続処理を関数化したものです。

こうしておけば、複数のスクリプトから安全に使い回せます。

import sqlite3

def connect_db(db_name):
    conn = sqlite3.connect(db_name)
    return conn

db = connect_db("app_data.db")
print(type(db))

【出力例:】

<class 'sqlite3.Connection'>

このように関数で“入り口”を統一しておくと、後から接続方式を変更しても全体に影響を与えません。

関数は、メンテナンス性と安全性の両方を底上げする「運用の柱」になるのです。

過剰に関数化して読みにくくなるリスクとその回避策

一方で、あまりにも細かく関数を分けすぎると、逆に可読性を下げる危険もあります。

たとえば、3行しかない単純な処理を関数にしてしまうと、コード全体の流れが分断されてしまいます。

小さな処理も関数にした方がいいのか、それともある程度まとめた方がいいのか、迷うなあ。
迷ったら「1つの関数が1つの目的を持っているか」を基準に判断してください。

次の例では、過剰な関数化がどのように可読性を損ねるかがわかります。

def get_input():
    return input("値を入力してください: ")

def convert_to_int(value):
    return int(value)

def print_result(result):
    print(result)

val = get_input()
num = convert_to_int(val)
print_result(num)

【出力例:】

値を入力してください: 10
10

このように、関数が増えすぎるとコードの流れが見えにくくなり、理解に時間がかかります。

関数化はあくまで「再利用が必要な処理」や「複雑なロジック」に絞るのが理想です。

判断基準関数化すべきか理由
同じ処理が複数箇所にあるYes修正を一元化できる
処理が3行以内で単純No読みにくくなる
他の開発者と共有する部分Yes再利用しやすく保守的

こうしたバランス感覚が、長期運用では非常に重要になります。

実体験:関数化しすぎてかえって混乱した事例

以前、筆者が大規模なデータ変換スクリプトを作ったとき、すべての処理を関数化して整理しようとしました。

しかし結果的に、関数が30個以上に増え、どの関数がどこで呼ばれているのか分からなくなってしまいました。

それは、きれいに整理しているつもりが「階層の深すぎる迷路」を作っていたのです。

def process_a():
    process_b()

def process_b():
    process_c()

def process_c():
    print("Done")

process_a()

【出力例:】

Done

まとめ

関数を学ぶことは、単にプログラムの書き方を覚えることではありません。

人が手で行っていた手順を、再利用できる「仕組み」に変えることができます。

これにより、作業のミスを減らし、時間を節約し、チームでの共有もしやすくなります。

コードを書くたびに考え込むのではなく、一度設計した流れを呼び出すだけで動かせる——それが関数の最大の強みです。

考え方を“作業”から“設計”に変えることで、プログラミングは驚くほど軽くなります。

次のおすすめ記事

よく読まれている記事

1

「私たちが日々利用しているスマートフォンやインターネット、そしてスーパーコンピュータやクラウドサービス――これらの多くがLinuxの力で動いていることをご存じですか? 無料で使えるだけでなく、高い柔軟 ...

2

Linux環境でよく目にする「Vim」という名前。サーバーにログインしたら突然Vimが開いてしまい、「どうやって入力するの?」「保存や終了ができない!」と困った経験をした人も多いのではないでしょうか。 ...

3

ネットワーク技術は現代のITインフラにおいて不可欠な要素となっています。しかし、ネットワークを深く理解するためには、その基本となる「プロトコル」と「レイヤ」の概念をしっかり把握することが重要です。 こ ...

4

この記事は、Linuxについて勉強している初心者の方向けに「Shellスクリプト」について解説します。最後まで読んで頂けましたら、Shellスクリプトはどのような役割を担っているのか?を理解出来るよう ...

5

Javaは世界中で広く使われているプログラミング言語であり、特に業務システムやWebアプリケーションの開発において欠かせない存在です。本記事では、初心者向けにJavaの基礎知識を網羅し、環境構築から基 ...

-Pythonの基礎知識(基礎編)