Pythonの 関数の定義、これから始めようとする初心者向けに分かりやすく解説|Python入門(9)

Python
この記事は約20分で読めます。

ーーーーーーーーーーーーーーーーーーーーー2026年3月8日執筆ーーーーーーーーーーーーーーーーー

Pythonの 関数の定義、これから始めようとする初心者向けに分かりやすく解説|Python入門(9)のPodcast

下記のPodcastは、Geminiで作成しました。

プログラミングにおける関数の本質的役割

プログラミングを学ぶ過程で、避けて通れない最重要概念の一つが「関数(Function)」です。Pythonにおける関数とは、特定の処理をひとまとめにし、それに名前を付けていつでも呼び出せるようにした仕組みを指します 。日常生活に例えるならば、関数は「料理のレシピ」や「全自動洗濯機のプログラム」のようなものです。特定の材料(データ)を投入し、あらかじめ決められた手順(処理)を実行し、最終的な成果物(結果)を得るという一連の流れをパッケージ化したものが関数に相当します 。

関数を導入する最大の動機は、コードの再利用性を向上させ、プログラム全体の構造を整理することにあります。同じ処理を何度も記述する代わりに、一度定義した関数を呼び出すだけで済むようになれば、プログラムはより簡潔になります。これはソフトウェア開発における重要な原則である「DRY(Don't Repeat Yourself:同じことを繰り返さない)」に基づいています 。また、適切に設計された関数は、複雑な処理の細部を隠蔽し、コードの読み手が実装の詳細に惑わされることなく、プログラムの大きな流れを把握することを助けます 。

Pythonにおける関数には、大きく分けて二つの形態が存在します。一つはPythonに標準で備わっている「組み込み関数(Built-in Functions)」であり、print() や len()、max() などがこれに該当します 。もう一つは、開発者が自身の目的に合わせて作成する「ユーザー定義関数(User-defined Functions)」です。本稿では、このユーザー定義関数をどのように定義し、現代的なPythonのベストプラクティスに則って運用していくかを、初心者の方に向けて丁寧に解説します 。

関数定義の基本構造と構文

Pythonで新しい関数を作成する際には、def キーワードを使用します。これは「define(定義する)」の略であり、Pythonインタープリタに対して「ここから関数の定義が始まる」ことを宣言する役割を持ちます 。

基本的な構文ルール

関数定義の基本的な形式は以下の通りです 。

python

def 関数名(引数1, 引数2,...):
    """ドキュメント文字列(Docstring)"""
    実行する処理
    return 戻り値

各要素には厳密なルールと役割があります。まず「関数名」は、その関数が何を行うのかを端的に表す名前を付けます 。名前の後には必ず括弧 () を記述し、必要に応じて「引数(ひきすう)」と呼ばれる、関数内部で利用する外部からの入力値を指定します 。行の末尾にはコロン : を置き、次の行から関数の本体(ブロック)を記述します 。

Pythonにおいて最も重要な注意点は「インデント(字下げ)」です。関数の本体となるコードは、必ず4つのスペースでインデントされなければなりません。Pythonはこのインデントによって、どの範囲が関数に属しているかを判断するため、インデントが崩れると IndentationError というエラーが発生します 。

戻り値(return)の仕組み

関数は処理の結果を呼び出し元に返すことができます。これを行うのが return 文です 。return 文が実行されると、関数の処理はその時点で終了し、指定された値が関数の「出力」として呼び出し側に渡されます 。もし return 文が記述されていない場合、または return だけが記述されている場合、関数は暗黙的に None(値が存在しないことを示す特別な値)を返します 。

適切で読みやすい関数命名の原則

関数の名前をどう付けるかは、コードの可読性を左右する極めて重要な要素です。Pythonには「PEP 8」という公式のスタイルガイドがあり、推奨される命名規則が定められています 。

スネークケースの採用

関数の名前には、すべての文字を小文字にし、単語の間をアンダースコア _ でつなぐ「スネークケース(snake_case)」を使用します 。例えば、calculate_area や get_user_name といった形式です。大文字を混ぜる形式(CamelCaseなど)は、クラス名などの他の用途で使用されるため、関数名では避けるのが一般的です 。

動詞から始める命名

関数は何らかの「動作」を表すため、名前の先頭には動詞を置くことが推奨されます 。これにより、その関数が「何をするのか」が直感的に理解できるようになります。

カテゴリ推奨される例避けるべき例理由
計算calculate_total()total()動詞を含めることで動作を明示
取得fetch_data_from_api()api_data()取得というアクションを明確化
削除remove_old_files()cleanup()何を削除するのか具体的に示す
検証is_valid_email()check_mail()真偽値を返す場合は is_ などを活用

また、名前を短くしすぎて意味が不明瞭になるよりは、多少長くなってもその役割を正確に説明する名前を付ける方が、長期的にはメンテナンス性が高まります 。

引数の設計と高度な利用方法

引数は、関数に外部から情報を渡すための「窓口」です。Pythonでは、非常に柔軟な方法で引数を設計することができます 。

位置引数とキーワード引数

最も一般的な渡し方は、定義された順番通りに値を渡す「位置引数」です 。一方で、呼び出し時に 引数名=値 の形式で指定する「キーワード引数」を使用すると、順番を入れ替えて渡すことが可能になります。キーワード引数は、特に引数の数が多い場合において、どの値が何を意味しているのかを明示できるため、コードの可読性を向上させます 。

デフォルト引数値の設定

引数にはあらかじめ「デフォルト値」を設定しておくことができます。これにより、その引数が省略された場合に自動的に使用される値を指定できます 。例えば、消費税の計算において税率を 0.1 とデフォルト設定しておけば、多くの場合で引数を省略でき、特殊なケース(軽減税率など)だけ別の値を渡すといった柔軟な運用が可能です 。

特殊なパラメータ:/ と *

Python 3.8以降では、引数の渡し方を制限するための特殊な記号が導入されています 。

/(スラッシュ): スラッシュより前の引数は「位置引数のみ」として受け取ります。

*(アスタリスク): アスタリスクより後の引数は「キーワード引数のみ」として受け取ります。

これらの仕組みは、関数のインターフェースを厳格に保ち、将来的な変更による不具合を防ぐために役立ちます 。

可変引数の活用と柔軟なインターフェース

受け取るデータの数が事前に決まっていない場合、Pythonでは「可変引数」という強力な機能を利用できます 。

\*args(可変長位置引数)

引数名の前にアスタリスクを一つ付ける(慣習的に *args と呼ばれます)ことで、任意の数の位置引数をタプルとして受け取ることができます 。例えば、渡されたすべての数値を足し合わせる関数などを作成する際に便利です。

\*\*kwargs(可変長キーワード引数)

引数名の前にアスタリスクを二つ付ける(慣習的に **kwargs と呼ばれます)ことで、任意の数のキーワード引数を辞書として受け取ることができます 。これは、設定オプションを柔軟に受け取りたい場合などに多用されます。

変数のスコープとメモリ管理の理解

関数を扱う上で、初心者が最も混乱しやすい概念の一つが「スコープ(有効範囲)」です。スコープとは、ある変数が「どこから参照可能か」を決定するルールです 。

ローカルスコープとグローバルスコープ

関数の外部で定義された変数は「グローバル変数」と呼ばれ、プログラムのどこからでも参照できます 。対して、関数の内部で定義された変数は「ローカル変数」と呼ばれ、その関数の中でしか存在しません 。

種類定義場所参照可能な範囲寿命
グローバル変数関数の外プログラム全体プログラム終了まで
ローカル変数関数の中その関数内のみ関数の実行終了まで

スコープに関する注意点

関数の中からグローバル変数を参照することは可能ですが、関数の中からグローバル変数の値を直接「書き換える」には global 宣言が必要です 。ただし、安易なグローバル変数の使用は、意図しない場所でデータが変更される原因となるため、現代的なプログラミングでは可能な限り避けるべきとされています 。

変更可能なデフォルト引数の罠

Pythonにおける最も有名な「罠」の一つが、デフォルト引数にリスト([])や辞書({})などの可変(ミュータブル)なオブジェクトを指定することです 。

●なぜ問題が起きるのか

Pythonでは、関数のデフォルト引数は「関数の定義時」に一度だけ評価され、そのオブジェクトがメモリ上に保持され続けます 。そのため、デフォルト値のリストを関数内で変更すると、その変更が次回の関数呼び出し時にも引き継がれてしまいます 。

●正い回避方法

この問題を回避するための標準的な手法は、デフォルト値に None を指定し、関数内部で初期化を行うことです 。

python

# 推奨される安全な書き方
def add_item(item, item_list=None):
    if item_list is None:
        item_list = []  # 関数が呼ばれるたびに新しいリストを作成
    item_list.append(item)
    return item_list

この「Noneによるデフォルト初期化パターン」は、Pythonエンジニアの間では「お約束」として広く認知されています 。

モダンPythonの標準:型ヒントの導入

Pythonは動的型付け言語ですが、近年では「型ヒント(Type Hints)」を活用することが強く推奨されています 。型ヒントとは、引数や戻り値がどのようなデータ型であるべきかをコード上に明示する仕組みです 。

型ヒントの基本構文

引数名の後にコロン : を付けて型を記述し、戻り値の型は矢印 -> を使って表現します 。

python

def greet(name: str, age: int) -> str:
    return f"こんにちは、{name}さん。あなたは{age}歳ですね。"

型ヒントを利用するメリット

可読性の向上: 関数の定義を見るだけで、どのようなデータを渡せばよいかが一目でわかります 。

IDEによる強力なサポート: VS Codeなどのエディタが型情報を認識し、適切なコード補完やエラー警告を出してくれるようになります 。

静的解析ツールによるバグ発見: mypy などのツールを使用することで、実行前に型の不整合によるバグを検知できます 。

Python 3.10以降では、int | float(整数または浮動小数点数)のように、パイプ記号を使って複数の型を簡潔に表現できるようになり、利便性がさらに向上しています 。

ドキュメンテーションとDocstring

関数を定義する際には、その関数の説明を「Docstring(ドキュメント文字列)」として記述することが推奨されます 。これは三重引用符 """ を使って関数の冒頭に記述される文字列です。

記述すべき内容

一般的には、以下の内容を含めることが望ましいとされています 。

関数の目的(サマリ)

各引数の詳細(名前、型、役割)

戻り値の意味と型

発生しうる例外(エラー)の条件

適切なDocstringが書かれたコードは、自分以外の開発者が利用する際の手助けとなるだけでなく、将来の自分がコードを読み直す際の大きな助けになります 。

良い関数を設計するためのベストプラクティス

熟練した開発者が書く関数には、いくつかの共通した特徴があります。これらを意識することで、コードの質を飛躍的に高めることができます 。

単一責任の原則(Single Responsibility Principle)

一つの関数は「一つのこと」だけを行うべきです 。もし一つの関数の中で、データの読み込み、計算、保存、通知のすべてを行っているとしたら、それは分割すべきサインです。機能を小さく分けることで、テストがしやすくなり、不具合の修正も容易になります 。

小さな関数を維持する

一般的に、一つの関数は20行以内、インデントの深さは2レベル程度に抑えることが理想的とされています 。関数が長くなりすぎると、全体のロジックを頭の中で追うことが困難になります。

副作用を最小限にする(純粋関数)

可能な限り「副作用」を避ける設計を心がけます。副作用とは、関数の外部の状態(グローバル変数やファイル、データベースなど)を変更することを指します 。入力に対して常に同じ出力を返し、外部に影響を与えない関数は「純粋関数」と呼ばれ、バグの温床になりにくく、非常にテストしやすいという特性を持ちます 。

実践例:数学的な計算関数の設計

これまでに学んだ要素をすべて取り入れた、実践的な関数の例を見てみましょう。例えば、円の面積を計算し、単位付きの文字列で返す関数を考えます。円の面積 $A$ は、半径 $r$ と円周率 $\pi$ を用いて以下の公式で定義されます。

$$A = \pi r^2$$

これをPythonで実装すると以下のようになります。

python

import math

def calculate_circle_area(radius: float, unit: str = "cm²") -> str:
    """
    円の半径から面積を計算し、単位付きの文字列を返します。

    Args:
        radius (float): 円の半径。
        unit (str): 面積の単位。デフォルトは 'cm²'。

    Returns:
        str: 計算結果(例: '78.54 cm²')
    """
    if radius < 0:
        raise ValueError("半径に負の値を指定することはできません。")
    
    area = math.pi * (radius ** 2)
    return f"{area:.2f} {unit}"

この関数には、「明確な命名」「型ヒント」「デフォルト引数」「Docstring」「例外処理(エラーチェック)」といった、プロフェッショナルなコードに必要な要素が凝縮されています。

参考資料

1. Python function definition best practices 2024 2025, https://realpython.com/ref/best-practices/functions/

2. Best practices in Python functions, https://thepythoncodingbook.com/2023/01/18/best-practices-in-python-functions/

3. Master Python Functions: A Complete Guide with Examples & Best Practices, https://dev.to/satyam_gupta_0d1ff2152dcc/master-python-functions-a-complete-guide-with-examples-best-practices-16kn

4. PEP 8 – Style Guide for Python Code, https://peps.python.org/pep-0008/

5. Clean Code: Writing Python Functions, https://khuyentran1401.github.io/reproducible-data-science/structure_project/functions.html

6. Python Type Hints for Beginners: Why They Matter and How to Use Them, https://dev.to/mariecolvinn/python-type-hints-for-beginners-why-they-matter-and-how-to-use-them-1lbm

7. 2024 Python Typing Survey Analysis, https://discuss.python.org/t/2024-python-typing-survey-analysis/61456

8. Type Hinting in Python: What It Is and How to Use It Effectively, https://www.pythonsnacks.com/p/python-type-hinting

9. typing — Support for type hints, https://docs.python.org/3/library/typing.html

10. Python 3.12 official Japanese documentation: Defining Functions, https://docs.python.org/ja/3/tutorial/controlflow.html#defining-functions

11. Python:ローカル変数とグローバル変数の違いをわかりやすく解説, https://it-biz.online/python/local-global/

12. Pythonのスコープとは:変数の有効範囲を理解する, https://qiita.com/ayamo/items/88f40cfbb394914a6109

13. 関数の内側と外側での変数の扱い(スコープ), https://www.school.ctc-g.co.jp/columns/hishinuma/hishinuma13.html

14. グローバル変数と変数のスコープ, https://www.sejuku.net/blog/58897

15. Pythonの基礎:名前空間とスコープの基本, https://www.internetacademy.co.jp/itlab/column-technology/python_stydy26.html

16. 可変オブジェクトをデフォルト引数に使う際の罠, https://profound.academy/ja/python-mid/x5iV8LoA5bet5UJ5HMCD

17. Pythonエンジニアが必ず通る道:デフォルト引数のバグを解説, https://qiita.com/nozomi2025/items/6ad11943fc222012f993

18. Python mutable defaults are the source of all evil, https://www.reddit.com/r/learnpython/comments/q8m2xn/python_mutable_defaults_are_the_source_of_all_evil/

19. 変更可能なデフォルト引数の危険性について, https://note.com/hafnium/n/n96049b5508ae

20. PEP8規約に準拠したdocstringの適切な書き方, https://qiita.com/Yasshi840/items/924bdf97ba61a8b93b32

21. Pythonの命名規則(PEP8)の要約, https://www.pythonic-exam.com/archives/9155

22. PythonのスタイルガイドPEP8の基本, https://zenn.dev/oozeki/articles/python_about_pep8

23. PEP 8 日本語版:Pythonコードのスタイルガイド, https://pep8-ja.readthedocs.io/

24. Python初学者がつまずきやすいポイントと対策, https://career.levtech.jp/guide/knowhow/article/976/

25. 授業でよく出る Pythonの質問集, https://wakara.co.jp/mathlog/20210423

26. Python入門編:関数の定義とスコープの理解, https://paiza.jp/works/python3/primer/beginner-python7

ーーーーーーーーーーーーーーーーーーーーー2022年6月25日執筆ーーーーーーーーーーーーーーーーー

はじめに

 前回のPython入門(8)では、PPythonのfor 文による繰り返し処理について学びました。

 Python入門の第九弾として、Pythonの関数の定義について紹介します。

  この記事を読むと次の疑問について知ることができます。

 それでは、Pythonの関数の定義をこれから始めようとする初心者向けに分かりやすく解説していきます。

Pythonの関数とは?

 Pythonに限らず、他のプログラム言語でも同様に「ある値を関数に渡すと、関数内で処理を実施してある値を返すと言う処理をする定義」のことを関数と言います。

 具体的な例として、円の半径を渡して、円の面積を求めるなども関数ですし、また、ある買い物をする際の品物の個数、価格、消費税を渡して、合計の金額を計算するなども関数として利用できます。

 このように関数を用いることにより、何度もプログラムのコード内ででてくる同じ処理を関数として定義することにより、プログラムのコードを簡単化でき、分かり易いプログラムコードにすることができます。

 関数を大きく分けると2つに分類することができます。

組み込み関数
ユーザー定義関数

組み込み関数

 組み込み関数は、Pythonが元から持っている関数でその関数名を書くだけで利用できます。

 代表的な関数の例としてprint()関数があります。

 この関数は、print(変数)とした場合には、パソコン画面上に変数を出力する関数となり、プログラムの検証などでは良く利用します。

 組み込み関数は、Pythonのバージョンによって多少の違いはありますが、Python 3.10.4での組み込み関数ではアルファベット順に並べられて見ることができます。

ユーザー定義関数

 ユーザー定義関数は、あなたがプログラム内で定義した関数を言います。

 ユーザー関数を定義したプログラムコード内の後では、どこででも何度でもユーザー定義関数を呼び出して利用することができます。

 したがって、同じ処理を繰り返しするような処理の場合は、ユーザー定義関数を定義して利用するするようにしましょう。

 そうすることにより、プログラムを簡潔にし読み易くしますし、プログラムの変更をするような場合に変更が楽になります。

関数の定義と呼び出し

 関数の定義は、次のようになります。

def 関数名(引数1,引数2,…):
    処理
    return 戻り値

関数名(引数1,引数2,…)

関数を定義する上で注意すること
  1. def 文の後に忘れずに「:」を入れること
  2. def 文以下の処理部分は、4文字分字下げすること
  3. 関数名には、Pythonの変数名と同様な付け方に従うこと
    • 使用できる文字は a ~ z 、 A ~ Z 、 0 ~ 9 、アンダーバー(_)、漢字などが使用可能
    • 関数の先頭文字には数字を使うことは不可、また、アンダーバー(_)を利用しな名前はは、Pythonでは特殊な意味を持つ場合があるので、できる限り避けること
    • Pythonの予約後は使用不可
  4. 関数の引数は、なくともよいが、ある場合は「,」で区切って「()」内に並べて使用
  5. return文はなくともよいが、関数内の処理の結果を返したい場合に使用

 ここで簡単な 関数の例を紹介しましょう。

 半径(r)を引数とした円の面積を求める関数を定義し、定義した円の面積をreturn文で返し、その面積を画面出力 print() てみましょう。

関数の引数

 関数の引数の取り方には大きく分類すると2種類あります。

  • 位置引数
  • キーワード引数

位置引数

 関数内に書いた引数の順番に関数の処理内で値が渡されて処理される場合です。

 例として、三角形、四角形、円の面積を求めるのに次のような関数を作ってみました。

 引数として3つを使い、一つ目の引数に面積の図形の種類、2つ目の引数が面積を求める1つ目の数値(例えば、三角形ならば、底辺の長さ)、そして最後の3つ目の引数に面積を求める2つ目の数値(例えば、三角形ならば、高さ)を入力するようにします。

 a は図形の種類になりますので、if文で面積を求める種類を分類し、それぞれで面積 s を求め、最後にreturn で面積 s を戻り値としています。

 円の面積には、3番目の引数を使いませんが、何でも良いのでデータを入れる必要があり、ここでは、文字列データとして ’データなし’を入れています。

キーワード引数

 キーワード引数は、引数 = 値のように指定して、関数を使いますが、この場合は引数の順番は任意にできます。

 例えば、上述の関数をキーワード引数で指定してやると次のようになります。

 ここで注意してもらいたいことは、三番目の円の面積で引数 c =100としていますが、関数の定義で引数 c を使っていますので、c を入れる必要があります。

 しかし、関数の定義で円の面積では c を利用しませんので、そのような場合は、c として何でも良いので値を指定してやる必要があります。

 あと、位置引数とキーワード引数を混在して利用することはできませんので注意してください。

デフォルト引数 

 関数の定義の際に引数を省略した場合に使うデフォルトの値を指定できます。

 ただし、引数が複数の場合は最後の引数のみに利用できます。

 途中の引数にデフォルト引数を指定するとエラーとなります。 

グローバル変数とローカル変数

 関数内で用いられる変数をローカル変数と呼び、関数内のみに適用される変数です。

 一方、関数の外で利用される変数はグローバル変数と呼び、その場合の変数はコード内であればどこでも参照ができます。

 上述のPythonのプログラムは消費税をグローバル変数で定義しているために、後で再度定義し直せば、その再定義した消費税で関数が計算されます。

 しかし、消費税が関数内(ローカル変数)で定義されていると、その値は関数内で定義した値に固定され、前にグローバル変数として定義した消費税の値が出力されますが、価格はローカル変数で定義した消費税を使って関数が計算されます。

おわりに

 如何だったでしょうか?

 Pythonの関数とは?、組み込み関数、ユーザー定義関数、関数の定義と呼び出し、関数の引数、位置引数、キーワード引数、デフォルト引数、グローバル変数とローカル変数 などについて解説してきました。

 この記事を読みながらPythonを学んでもらえればと思います。

 次をお楽しみに?

以上です。

 

コメント

タイトルとURLをコピーしました